curl --request POST \
--url https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"profile_id": "<string>",
"attachment_urls": [
"<string>"
],
"host": "<string>",
"platform": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion"
payload = {
"profile_id": "<string>",
"attachment_urls": ["<string>"],
"host": "<string>",
"platform": "<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({
profile_id: '<string>',
attachment_urls: ['<string>'],
host: '<string>',
platform: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion', 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/ingestion",
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([
'profile_id' => '<string>',
'attachment_urls' => [
'<string>'
],
'host' => '<string>',
'platform' => '<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/ingestion"
payload := strings.NewReader("{\n \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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/ingestion")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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/ingestion")
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 \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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 d’ingestion (API Devin)
Démarrer une analyse de code Devin en mode d’ingestion qui évalue les constats d’un scanner externe à l’aide d’un profil d’ingestion via l’API Enterprise v3
curl --request POST \
--url https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"profile_id": "<string>",
"attachment_urls": [
"<string>"
],
"host": "<string>",
"platform": "<string>",
"repo_name": "<string>",
"repos": [
{
"repo_name": "<string>",
"host": "<string>"
}
]
}
'import requests
url = "https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion"
payload = {
"profile_id": "<string>",
"attachment_urls": ["<string>"],
"host": "<string>",
"platform": "<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({
profile_id: '<string>',
attachment_urls: ['<string>'],
host: '<string>',
platform: '<string>',
repo_name: '<string>',
repos: [{repo_name: '<string>', host: '<string>'}]
})
};
fetch('https://api.devin.ai/v3/enterprise/organizations/{org_id}/code-scans/ingestion', 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/ingestion",
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([
'profile_id' => '<string>',
'attachment_urls' => [
'<string>'
],
'host' => '<string>',
'platform' => '<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/ingestion"
payload := strings.NewReader("{\n \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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/ingestion")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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/ingestion")
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 \"profile_id\": \"<string>\",\n \"attachment_urls\": [\n \"<string>\"\n ],\n \"host\": \"<string>\",\n \"platform\": \"<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
Requiert un utilisateur de service ou un jeton d’accès personnel disposant de l’autorisationUseAccountCodeScans au niveau de l’entreprise.
Comportement
Met en file d’attente une analyse de code en mode d’ingestion. Au lieu de détecter des problèmes de zéro, une analyse d’ingestion exploite des constats produits ailleurs (par exemple, un rapport SAST) et charge Devin de les trier et de les valider par rapport au dépôt. L’analyse est lancée de manière asynchrone par le répartiteur d’analyses et attribuée au principal appelant.Champs de la requête
Fournissez un seul des deux champs suivants :repo_name ou repos.
repo_name: nom complet du repository, par exempleowner/repo.repos: repositories couverts par une même analyse multidépôt, sous forme d’une liste de 200 objets maximum, chacun contenantrepo_nameet, éventuellement,host. La première entrée correspond au repository principal de l’analyse.
profile_id(obligatoire) : un profil d’analyse en modeingest. Un profil en modediscoverest rejeté avec le code d’état400.host: hôte Git du repository, s’il ne peut pas être déduit.attachment_urls: URL de fichiers joints Devin (par exemple, un rapport de scanner exporté) à fournir à l’analyse. Importez d’abord les fichiers à l’aide de l’API des fichiers joints.
effort:normal(par défaut) réduit l’effort de raisonnement du modèle et traite des lots plus volumineux lors du triage et de la validation ;deepexécute le pipeline complet.platform: plateforme sur laquelle s’exécutent les sessions de l’analyse. Indiquez 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 à la fois à une plateforme et à un pool, la plateforme est prioritaire. En l’absence de valeur, le paramètre par défaut de l’organisation s’applique.
Erreurs
400siprofile_idne correspond pas à un profil en mode d’ingestion, ou siplatformne correspond pas à un libellé de plateforme configuré ou à un pool Outposts (le corps de l’erreur indique les valeurs disponibles).404si l’organisation, le repository ou le profil n’est pas visible par le compte Enterprise.409si le backlog d’analyses de l’organisation est saturé. Réessayez plus tard.422sirepo_nameetrepossont tous deux fournis, si aucun des deux n’est fourni 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 démarrer une analyse de code en mode d’ingestion.
Accepte uniquement un profil d’analyse en mode d’ingestion (ingest-mode) : le profil est exécuté sur le repository indiqué (ou les repositories indiqués).
Profil d’analyse en mode d’ingestion à exécuter. Doit être un profil ingest ; les profils non ingest sont rejetés avec le code 400.
URL des pièces jointes Devin à fournir à l’analyse, par exemple des fichiers téléversés via l’API des pièces jointes. Les pièces jointes doivent appartenir à l’organisation analysée.
101 - 2083Niveau d’effort d’analyse : 'normal' (par défaut) réduit l’effort de raisonnement du modèle et utilise des lots plus volumineux pour le triage et la validation ; 'deep' exécute le pipeline complet.
normal, deep Hôte Git du dépôt, s’il est connu.
Lieu d’exécution des sessions de l’analyse : un libellé de plateforme configuré pour l’organisation (par exemple '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 champ 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.
128Nom complet du repository à analyser. Fournissez un seul des deux champs : 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 champs : repo_name ou repos.
200Show child attributes
Show child attributes
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.

