/v1/deep-research/jobsStart a deep-research job on up to 25 subjects (developers or repositories)
research:deepdeep_researchRuns full-depth research on each subject and persists a report the whole account can read afterwards. subject: "developers" researches GitHub handles; subject: "repos" researches owner/name repositories — who builds each one (recency-weighted contributors), who validates it (recent starrers plus where the repo’s star audience places, weighing every starrer by the authority of what they themselves build), and identity facts on both. Returns immediately with a job you poll; rounds of five developers run behind it. A developer served from a recent previous research is equivalent in content to a fresh one. Partial success is normal: the job tells you which subjects landed and, for each one that did not, exactly why.
Request body CreateDeepResearchJobRequest
subjectstring requiredResearch developers. The field is a closed vocabulary so more subjects can be added without changing the job contract.
developersloginsarray of string requiredThe GitHub handles to research, up to 25 per job. They are processed in rounds behind the job, not all at once.
min 1 items, max 25 itemsforcebooleanRe-research a subject even when a recent report exists. Costs the same either way, so use this only when you specifically need fresher data.
githubConnectionIdstringIgnored when calling with an API key (that path draws from your GitHub connection pool automatically). Only relevant for a signed-in dashboard member: the id of one of your linked GitHub connections (GET /v1/me/github), required in that case so the job runs on your own GitHub quota.
max 16 chars
subjectstring requiredResearch repositories: who builds each one (recency-weighted contributors), who validates it (recent starrers plus where the repo’s star audience places), and identity facts on both.
reposreposarray of string requiredThe repositories to research as `owner/name` references, up to 25 per job. They are processed in rounds behind the job, not all at once.
min 1 items, max 25 itemsforcebooleanRe-research a subject even when a recent report exists. Costs the same either way, so use this only when you specifically need fresher data.
githubConnectionIdstringIgnored when calling with an API key (that path draws from your GitHub connection pool automatically). Only relevant for a signed-in dashboard member: the id of one of your linked GitHub connections (GET /v1/me/github), required in that case so the job runs on your own GitHub quota.
max 16 chars
Responses
202The job, with every subject pendingjobDeepResearchJob requiredThe job and its per-developer items.
idstring requiredThe job id. Poll it for progress.
namestring | null requiredA short label generated from the developers the job was started with, for showing the job in a list. Null on jobs created before naming existed: fall back to the created time.
subjectstring requiredWhat kind of thing this job researches.
developersreposstatusstring requiredWhere the job stands overall. Individual subjects settle independently; read `items` for the detail.
runningsucceededpartialfailedcreatedAtstring requiredWhen the job was submitted, as an ISO 8601 instant.
finishedAtstring | null requiredWhen the job reached a terminal state, as an ISO 8601 instant. Null while running.
elapsedMsinteger requiredTime so far while running, and total time once finished, in milliseconds. Computed server-side, so it does not depend on your clock.
min 0requestedCountinteger requiredHow many developers you asked for. Not all necessarily land a report: see `deliveredCount`.
min 0deliveredCountinteger requiredHow many developers actually landed a report. A developer whose research failed is not counted here.
min 0itemsarray of DeepResearchItem requiredPer-developer state, including the reason for each one that did not land.
loginstring requiredThe subject reference this item researches: a GitHub handle for the `developers` subject, an `owner/name` for `repos`. The field name predates the second subject; `subjectRef` is the same value under its honest name.
subjectRefstring requiredThe subject reference, same value as `login`: a GitHub handle for `developers`, an `owner/name` for `repos`.
statusstring requiredWhere this one subject stands. Items settle independently: partial success across a job is normal.
pendingrunningdonefailedfailCodestring | null requiredMachine-readable failure reason. Null while the item can still succeed or has succeeded. Branch on this, not on `failMessage`.
not_foundrate_limitedprovider_errortimeoutabandonedengine_errorfailMessagestring | null requiredThe failure explained in words you can show a user, including what to do about it. Null while the item can still succeed.
sourcestring | null requiredWhether the delivered answer was researched fresh or served from a recent previous run. The two are equivalent in content, but a cached answer must not be presented as fresh. Null until an answer lands.
freshcachereportPathstring | null requiredThe API path to read this subject’s report. Null until one exists.
startedAtstring | null requiredWhen this item started, as an ISO 8601 instant. Null while queued.
finishedAtstring | null requiredWhen this item settled, as an ISO 8601 instant. Null until it does.
401No or invalid credentialcodestring requiredStable machine-readable error code. Branch on this, never on the numeric status.
bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.
topupconnect_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
402Plan lacks search:deep, or insufficient balancecodestring requiredStable machine-readable error code. Branch on this, never on the numeric status.
bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.
topupconnect_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
403Missing search:deep (role)codestring requiredStable machine-readable error code. Branch on this, never on the numeric status.
bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.
topupconnect_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
429Submit rate limit or the deep-research quota is exhaustedcodestring requiredStable machine-readable error code. Branch on this, never on the numeric status.
bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.
topupconnect_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.