curl --request POST \
--url https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"commit_sha": "<string>",
"host": "<string>",
"interactive": false,
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans"
payload = {
"commit_sha": "<string>",
"host": "<string>",
"interactive": False,
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
commit_sha: '<string>',
host: '<string>',
interactive: false,
platform: '<string>',
profile_id: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'commit_sha' => '<string>',
'host' => '<string>',
'interactive' => false,
'platform' => '<string>',
'profile_id' => '<string>',
'repo_name' => '<string>',
'repos' => [
[
'repo_name' => '<string>',
'host' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans"
payload := strings.NewReader("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": 123,
"effort": "normal",
"host": "<string>",
"org_id": "<string>",
"profile": {
"name": "<string>",
"profile_id": "<string>"
},
"repo_name": "<string>",
"scan_id": "<string>",
"scan_type": "security",
"status": "waiting",
"url": "<string>",
"outpost_pool_id": "<string>",
"platform": "<string>",
"repo_full_name": "<string>"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}Avvia code scan (API Devin)
Avvia un nuovo code scan Devin su un repository di un’organizzazione tramite l’API Enterprise v3, facoltativamente con un profilo di scansione o un commit
curl --request POST \
--url https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"commit_sha": "<string>",
"host": "<string>",
"interactive": false,
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans"
payload = {
"commit_sha": "<string>",
"host": "<string>",
"interactive": False,
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
commit_sha: '<string>',
host: '<string>',
interactive: false,
platform: '<string>',
profile_id: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'commit_sha' => '<string>',
'host' => '<string>',
'interactive' => false,
'platform' => '<string>',
'profile_id' => '<string>',
'repo_name' => '<string>',
'repos' => [
[
'repo_name' => '<string>',
'host' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans"
payload := strings.NewReader("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"platform\": \"<string>\",\n \"profile_id\": \"<string>\",\n \"repo_name\": \"<string>\",\n \"repos\": [\n {\n \"repo_name\": \"<string>\",\n \"host\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": 123,
"effort": "normal",
"host": "<string>",
"org_id": "<string>",
"profile": {
"name": "<string>",
"profile_id": "<string>"
},
"repo_name": "<string>",
"scan_id": "<string>",
"scan_type": "security",
"status": "waiting",
"url": "<string>",
"outpost_pool_id": "<string>",
"platform": "<string>",
"repo_full_name": "<string>"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}{
"status": 123,
"title": "<string>",
"detail": "<string>",
"error_code": "<string>",
"errors": [
{}
],
"instance": "<string>",
"type": "about:blank"
}Autorizzazioni
Richiede un utente di servizio o un token di accesso personale con l’autorizzazioneUseAccountCodeScans a livello aziendale.
Comportamento
Accoda una nuova scansione del codice per il repository specificato (repo_name) o per i repository specificati (repos) nell’organizzazione specificata. La scansione del codice viene avviata in modo asincrono dal dispatcher delle scansioni; la risposta contiene il record della scansione del codice con uno status iniziale di waiting o pending. Esegui il polling di Elencare le scansioni del codice per monitorarne l’avanzamento e di Elencare i risultati delle scansioni del codice (filtrati per scan_id) per leggere i risultati quando la scansione del codice raggiunge lo stato completed.
La scansione del codice è attribuita al principal chiamante, ovvero l’utente di servizio o il PAT che ha effettuato la richiesta.
Campi della richiesta
Specifica esattamente uno trarepo_name e repos.
repo_name: nome completo del repository, ad es.owner/repo. Il repository deve essere già accessibile tramite l’integrazione Git dell’organizzazione.host: host Git del repository, se non può essere dedotto.repos: repository inclusi in un’unica scansione multi-repo, sotto forma di elenco di oggetti conrepo_namee unhostfacoltativo (fino a 200). La prima voce corrisponde al repository principale della scansione.profile_id: un profilo di scansione da applicare. Usa Avvia scansione di ingestione per i profili in modalitàingest.scan_type: tipo di scansione da eseguire. Deve corrispondere al tipo di scansione del profilo se viene specificatoprofile_id. Per impostazione predefinita, usa il tipo del profilo oppuresecurityper le scansioni senza profilo. I tipi di scansione non di sicurezza richiedono un profilo.commit_sha: commit su cui effettuare il checkout prima della scansione. Per impostazione predefinita, viene usato l’HEAD del branch predefinito del repository.effort:normal(predefinito) usa un livello di ragionamento del modello più basso con batch di indagine più ampi;deepesegue la pipeline completa.interactive: setrue, la scansione si mette in pausa nello statoawaiting_user_inputtra la modellazione delle minacce e l’indagine, per consentire la revisione da parte dell’utente. Il valore predefinito èfalse. Solo le scansioni di sicurezza supportano la revisione interattiva; gli altri tipi di scansione vengono eseguiti senza supervisione.platform: dove vengono eseguite le sessioni della scansione; può essere un’etichetta di piattaforma configurata per l’organizzazione (ad esempiolinux,windowsomacos) oppure il nome di un pool outpost, senza distinzione tra maiuscole e minuscole. Se un nome corrisponde a entrambi, le piattaforme hanno la priorità. Per impostazione predefinita, viene usato il valore predefinito dell’organizzazione.
Errori
400quandoscan_typeè in conflitto con il profilo, viene specificato unscan_typenon relativo alla sicurezza senza un profilo, oppureplatformnon corrisponde a un’etichetta di piattaforma configurata o a un pool outpost (il corpo dell’errore elenca i valori disponibili).403quando l’organizzazione è limitata alle sole scansioni di ingestione e non viene specificato un profilo in modalitàingest.404quando l’organizzazione, il repository o il profilo non sono visibili all’account Enterprise.409quando il backlog delle scansioni dell’organizzazione ha raggiunto il limite. Riprova più tardi.422quando vengono forniti siarepo_namesiareposo nessuno dei due, oppure quandoreposè vuoto.
Autorizzazioni
Credenziale dell'utente del servizio (prefisso: cog_)
Parametri del percorso
ID dell'organizzazione (prefisso: org-)
"org-abc123def456"
Corpo
Corpo della richiesta per avviare un nuovo code scan.
Commit da estrarre prima della scansione.
Livello di approfondimento dello scan: 'normal' (predefinito) utilizza un livello di ragionamento del modello più basso e raggruppa le indagini in batch più grandi; 'deep' esegue l'intera pipeline.
normal, deep Host Git del repository, se noto.
Se true, la scansione viene sospesa tra la modellazione delle minacce e l'indagine per consentire la revisione da parte dell'utente.
Dove vengono eseguite le sessioni della scansione: un'etichetta di piattaforma configurata per l'organizzazione (ad es. 'linux', 'windows', 'macos') o il nome di un pool outpost (BYOB), senza distinzione tra maiuscole e minuscole; se un nome corrisponde sia a una piattaforma sia a un pool, la piattaforma ha la priorità. Se omesso, viene usato il valore predefinito dell'organizzazione. I valori non riconosciuti vengono rifiutati con una risposta 400 il cui corpo elenca le etichette di piattaforma e i nomi dei pool outpost disponibili.
128Profilo di scansione da applicare alla scansione.
Nome completo del repository da sottoporre a scansione. Fornire uno solo dei parametri repo_name o repos.
Repository inclusi in una scansione; la prima voce indica il repository principale della scansione. Fornire uno solo dei parametri repo_name o repos.
200Show child attributes
Show child attributes
Tipo di scansione da eseguire. Deve corrispondere al tipo di scansione del profilo quando viene fornito un profilo; per impostazione predefinita usa il tipo del profilo oppure 'security' per le scansioni senza profilo. I tipi diversi da security richiedono un profilo e vengono rifiutati senza di esso.
security, performance, db-queries, test-coverage, dead-code, code-quality, cleanup, telemetry, accessibility, compliance, general, migration-docs Risposta
Risposta riuscita
Un singolo code scan.
Momento in cui lo scan è stato creato (secondi Unix).
Livello di approfondimento dello scan: 'normal' usa un livello di ragionamento del modello più basso con gruppi di indagine più ampi; 'deep' esegue l'intera pipeline.
normal, deep Host Git della repository, se noto.
Organizzazione a cui appartiene lo scan.
Profilo con cui è stato eseguito lo scan, se presente.
Show child attributes
Show child attributes
Repository principale dello scan. Gli scan multi-repo coprono repository aggiuntive non elencate qui.
Identificatore univoco dello scan.
Tipo di scansione, definito al momento della creazione.
security, performance, db-queries, test-coverage, dead-code, code-quality, cleanup, telemetry, accessibility, compliance, general, migration-docs Stato dello scan: waiting, pending, running, awaiting_user_input, completed, failed o cancelled.
waiting, pending, running, awaiting_user_input, completed, failed, cancelled URL della pagina della scansione nell'applicazione web di Devin.
Pool outpost su cui vengono eseguite le sessioni della scansione, se impostato.
Etichetta della piattaforma ospitata su cui vengono eseguite le sessioni della scansione. Null quando la scansione viene eseguita su un pool outpost o sulla piattaforma predefinita dell'organizzazione.
Identificativo del repository principale comprensivo dell'host (ad es. github.com/org/repo). Null per i depot Perforce, che non hanno un host git.

