curl --request POST \
--url https://api.devin.ai/v3/organizations/{org_id}/code-scans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"commit_sha": "<string>",
"host": "<string>",
"interactive": false,
"new_budget": {
"acu_limit": 500000
},
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/organizations/{org_id}/code-scans"
payload = {
"commit_sha": "<string>",
"host": "<string>",
"interactive": False,
"new_budget": { "acu_limit": 500000 },
"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,
new_budget: {acu_limit: 500000},
platform: '<string>',
profile_id: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/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/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,
'new_budget' => [
'acu_limit' => 500000
],
'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/organizations/{org_id}/code-scans"
payload := strings.NewReader("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"new_budget\": {\n \"acu_limit\": 500000\n },\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/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 \"new_budget\": {\n \"acu_limit\": 500000\n },\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/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 \"new_budget\": {\n \"acu_limit\": 500000\n },\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 (Devin API)
Avvia un nuovo code scan di Devin su uno o più repository tramite l’API v3 dell’organizzazione, facoltativamente con un profilo di scansione, l’SHA di un commit o un livello di effort
curl --request POST \
--url https://api.devin.ai/v3/organizations/{org_id}/code-scans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"commit_sha": "<string>",
"host": "<string>",
"interactive": false,
"new_budget": {
"acu_limit": 500000
},
"platform": "<string>",
"profile_id": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/organizations/{org_id}/code-scans"
payload = {
"commit_sha": "<string>",
"host": "<string>",
"interactive": False,
"new_budget": { "acu_limit": 500000 },
"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,
new_budget: {acu_limit: 500000},
platform: '<string>',
profile_id: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/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/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,
'new_budget' => [
'acu_limit' => 500000
],
'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/organizations/{org_id}/code-scans"
payload := strings.NewReader("{\n \"commit_sha\": \"<string>\",\n \"host\": \"<string>\",\n \"interactive\": false,\n \"new_budget\": {\n \"acu_limit\": 500000\n },\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/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 \"new_budget\": {\n \"acu_limit\": 500000\n },\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/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 \"new_budget\": {\n \"acu_limit\": 500000\n },\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’autorizzazioneUseCodeScans a livello dell’organizzazione.
Comportamento
Accoda una nuova scansione del codice per il repository specificato (repo_name) o per i repository specificati (repos) nell’organizzazione. La scansione del codice viene avviata in modo asincrono dal dispatcher delle scansioni; la risposta contiene il record della scansione del codice con status iniziale waiting o pending. Interroga Elenca Scansioni del codice per monitorarne l’avanzamento e Elenca risultati di Scansioni del codice (filtrati per scan_id) per consultare i risultati quando la scansione del codice raggiunge lo stato completed.
La scansione del codice è attribuita al principal chiamante (l’utente di servizio o il PAT che ha effettuato la richiesta). L’equivalente nell’ambito Enterprise è Avvia Scansione del codice (Enterprise).
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 è il repository principale della scansione.profile_id: un profilo di scansione da applicare. Per i profili in modalitàingest, utilizza Avvia scansione di ingestione.scan_type: tipo di scansione da eseguire. Se viene specificatoprofile_id, deve corrispondere al tipo di scansione del profilo. Per impostazione predefinita, viene usato il tipo del profilo oppuresecurityper le scansioni senza profilo. I tipi di scansione diversi dasecurityrichiedono un profilo.commit_sha: commit da estrarre 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 l’intera pipeline.interactive: setrue, la scansione va 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, ovvero 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à. Il valore predefinito è quello impostato per l’organizzazione.
Errori
400sescan_typeè in conflitto con il profilo, se viene specificato unscan_typenon di sicurezza senza un profilo oppure seplatformnon corrisponde a un’etichetta di piattaforma configurata o a un pool outpost (il corpo dell’errore elenca i valori disponibili).403se l’organizzazione è limitata alle sole scansioni di ingestione e non viene specificato un profilo in modalitàingest.404se il repository o il profilo non è visibile all’organizzazione.409se il backlog delle scansioni dell’organizzazione ha raggiunto il limite. Riprova più tardi.422se vengono forniti siarepo_namesiareposoppure nessuno dei due, o sereposè 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 di cui effettuare il checkout prima della scansione.
Livello di approfondimento dello scan: 'normal' (predefinito) usa un livello di ragionamento del modello più basso con gruppi di indagine più ampi; 'deep' esegue l'intera pipeline.
normal, deep Host Git del repository, se noto.
Se true, la scansione si mette in pausa tra la modellazione delle minacce e l'indagine per consentire la revisione da parte dell'utente.
Assegna alla scansione un budget ACU dedicato. Richiede le autorizzazioni ManageAccountServiceUsers e ManageAcuLimits.
Show child attributes
Show child attributes
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 un errore 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 scansionare. Fornisci uno solo dei due parametri: repo_name o repos.
Repository inclusi in una singola scansione; la prima voce è il repository principale della scansione. Fornisci uno solo dei due parametri: repo_name o repos.
200Show child attributes
Show child attributes
Tipo di scansione da eseguire. Se viene fornito un profilo, deve corrispondere al tipo di scansione del profilo. Il valore predefinito è il tipo del profilo, oppure 'security' per le scansioni senza profilo. I tipi diversi da 'security' richiedono un profilo e vengono rifiutati in sua assenza.
security, performance, db-queries, test-coverage, dead-code, code-quality, cleanup, telemetry, accessibility, compliance, general, migration-docs Risposta
Risposta con esito positivo
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.

