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"
}Démarrer une analyse de code (API Devin)
Démarre une nouvelle analyse de code Devin sur un ou plusieurs repositories via l’API v3 de l’organisation, éventuellement avec un profil d’analyse, le SHA d’un commit ou un niveau d’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"
}Autorisations
Nécessite un utilisateur de service ou un jeton d’accès personnel doté de l’autorisationUseCodeScans au niveau de l’organisation.
Comportement
Met en file d’attente une nouvelle analyse de code pour le repository indiqué (repo_name) ou les repositories indiqués (repos) dans l’organisation. L’analyse est lancée de manière asynchrone par le répartiteur d’analyses ; la réponse contient l’enregistrement de l’analyse avec un status initial de waiting ou pending. Interrogez périodiquement Lister les analyses de code pour suivre la progression et Lister les constats d’analyse de code (filtrés par scan_id) pour consulter les résultats une fois l’analyse à l’état completed.
L’analyse est attribuée au principal appelant (l’utilisateur de service ou le PAT ayant effectué la requête). L’équivalent au périmètre Enterprise est Démarrer une analyse de code (Enterprise).
Champs de la requête
Fournissez exactement l’un des deux champsrepo_name ou repos.
repo_name: nom complet du repository, par ex.owner/repo. Le repository doit déjà être accessible via l’intégration Git de l’organisation.host: hôte Git du repository, s’il ne peut pas être déduit.repos: repositories couverts par une même analyse multi-repositories, sous forme de liste d’objets comportantrepo_nameet unhostfacultatif (200 au maximum). La première entrée correspond au repository principal de l’analyse.profile_id: profil d’analyse à appliquer. Utilisez Démarrer une analyse d’ingestion pour les profils en modeingest.scan_type: type d’analyse à exécuter. Doit correspondre au type d’analyse du profil siprofile_idest fourni. Utilise par défaut le type du profil ousecuritypour les analyses sans profil. Les types d’analyse autres quesecuritynécessitent un profil.commit_sha: commit à extraire avant l’analyse. Utilise par défaut le dernier commit de la branche par défaut du repository.effort:normal(par défaut) applique un effort de raisonnement du modèle réduit avec des lots d’investigation plus importants ;deepexécute le pipeline complet.interactive: si la valeur esttrue, l’analyse se met en pause à l’étatawaiting_user_inputpour permettre une revue par l’utilisateur entre la modélisation des menaces et l’investigation. Valeur par défaut :false. Seules les analyses de sécurité prennent en charge la revue interactive ; les autres types d’analyse s’exécutent sans intervention.platform: emplacement d’exécution des sessions de l’analyse : soit un libellé de plateforme configuré pour l’organisation (par exemplelinux,windowsoumacos), soit le nom d’un pool Outposts, sans distinction de casse. Si un nom correspond aux deux, la plateforme est prioritaire. Valeur par défaut : celle définie pour l’organisation.
Erreurs
400siscan_typeest incompatible avec le profil, si unscan_typeautre que de sécurité est fourni sans profil, ou siplatformne correspond à aucun libellé de plateforme configuré ni à aucun pool Outposts (le corps de l’erreur indique les valeurs disponibles).403si l’organisation est limitée aux analyses en mode ingestion et qu’aucun profil en modeingestn’est fourni.404si le repository ou le profil n’est pas visible par l’organisation.409si le backlog d’analyses de l’organisation est saturé. Réessayez ultérieurement.422sirepo_nameetrepossont fournis tous les deux ou qu’aucun des deux ne l’est, ou sireposest vide.
Autorisations
Identifiant de compte de service (préfixe : cog_)
Paramètres de chemin
ID de l’organisation (préfixe : org-)
"org-abc123def456"
Corps
Corps de la requête pour lancer une nouvelle analyse de code.
Commit à extraire avant l’analyse.
Niveau d’effort d’analyse : 'normal' (par défaut) réduit l’effort de raisonnement du modèle et utilise des lots d’investigation plus volumineux ; 'deep' exécute l’ensemble du pipeline.
normal, deep Hébergeur Git du repository, s’il est connu.
Si la valeur est true, l’analyse marque une pause pour permettre une revue par l’utilisateur entre la modélisation des menaces et l’investigation.
Attribuez à l’analyse son propre budget d’ACU. Nécessite les autorisations ManageAccountServiceUsers et ManageAcuLimits.
Show child attributes
Show child attributes
Environnement d’exécution des sessions de l’analyse : un libellé de plateforme configuré pour l’organisation (p. ex. 'linux', 'windows', 'macos') ou le nom d’un pool Outposts (BYOB), sans distinction de casse ; les plateformes sont prioritaires lorsqu’un nom correspond aux deux. Si ce paramètre est omis, la valeur par défaut de l’organisation s’applique. Les valeurs non reconnues sont rejetées avec une réponse 400 dont le corps répertorie les libellés de plateforme et les noms de pools Outposts disponibles.
128Profil d’analyse à appliquer à l’analyse.
Nom complet du repository à analyser. Fournissez un seul des deux paramètres repo_name ou repos.
Repositories couverts par une même analyse ; la première entrée correspond au repository principal de l’analyse. Fournissez un seul des deux paramètres repo_name ou repos.
200Show child attributes
Show child attributes
Type d’analyse à exécuter. Si un profil est fourni, ce type doit correspondre à celui du profil. Par défaut, le type du profil est utilisé, ou 'security' pour les analyses sans profil. Les types autres que 'security' nécessitent un profil et sont rejetés en son absence.
security, performance, db-queries, test-coverage, dead-code, code-quality, cleanup, telemetry, accessibility, compliance, general, migration-docs Réponse
Réponse réussie
Une analyse de code.
Date de création de l’analyse (secondes Unix).
Niveau d’effort d’analyse : 'normal' réduit l’effort de raisonnement du modèle et utilise des lots d’investigation plus importants ; 'deep' exécute le pipeline complet.
normal, deep Hôte Git du dépôt, s’il est connu.
Organisation à laquelle l’analyse appartient.
Profil avec lequel l’analyse a été exécutée, le cas échéant.
Show child attributes
Show child attributes
Dépôt principal de l’analyse. Les analyses multi-dépôts couvrent des dépôts supplémentaires non répertoriés ici.
Identifiant unique de l’analyse.
Type d'analyse, défini lors de la création.
security, performance, db-queries, test-coverage, dead-code, code-quality, cleanup, telemetry, accessibility, compliance, general, migration-docs Statut de l’analyse : waiting, pending, running, awaiting_user_input, completed, failed ou cancelled.
waiting, pending, running, awaiting_user_input, completed, failed, cancelled URL de la page de l’analyse dans la webapp Devin.
Pool Outposts sur lequel les sessions de l’analyse s’exécutent, si un pool est défini.
Libellé de la plateforme hébergée sur laquelle les sessions de l’analyse s’exécutent. Null lorsque l’analyse s’exécute sur un pool Outposts ou utilise la configuration par défaut de l’organisation.
Identité du repository principal incluant le nom d’hôte (p. ex. github.com/org/repo). Null pour les dépôts Perforce, qui n’ont pas d’hôte Git.

