/v1/developers/reportsRequest a developer enrichment report (async compute)
search:readThe async-compute half of developer enrichment: request → async generate → retrieve by reportId. Expands a facet selection (bundle macros and/or granular keys) over its dependency DAG across up to 200 developers, dispatches the compute deliverables (AI summaries, dossiers, fit) as background jobs, and returns a durable reportId to poll. The selection MUST include at least one compute facet — a sync/cached-only request is a 400 (use POST /v1/developers instead). Each compute cell is priced at its catalog credit price, charged up front with optimistic ownership so retrieval is free; a failed job refunds. status is generating while any cell is pending, ready once all resolve.
Request body DeveloperReportRequest
developerIdsarray of string requiredThe developers to enrich, up to 200 per report.
min 1 items, max 200 itemsfacetsarray of one of requiredThe facets to resolve, as granular keys and/or bundle macros. At least one must be a background-compute facet; a selection that is entirely synchronous is rejected with a 400 pointing you at `POST /v1/developers`.
min 1 items, max 27 itemsOption 1stringindexsketchportraitreachOption 2stringid.coreprofile.basicscore.crackedgithub.gardentags.matchedsignals.archetypesignals.signature_techsignals.builder_scopescore.gemsignals.ai_usagesignals.commit_factsactivity.contributionssignals.coreai.repo_summariesai.person_summaryidentity.linkedincontact.socialscontact.emailsfit.match_rationalefit.score_vs_jddossier.coredossier.contextualdossier.pitch_sheetcontextRefstringReference to a job-description context you registered earlier. Use this OR `context`.
max 200 charscontextDeveloperReportContextRegister a job description inline and use it as the context for this report. Use this OR `contextRef`.
jdstring requiredThe job description these developers are being judged against.
max 50000 charssearchQuerystringThe search query that surfaced them, when there was one. Extra context for the judgment.
max 200 chars
Responses
200The report id plus the first cell snapshot and its itemised billreportIdstring requiredThe durable id of this report. Poll `GET /v1/developers/reports/{reportId}` with it; retrieval is free and the report is shared by everyone on the account.
statusstring required`generating` = at least one cell is still being computed; poll again after `retryAfterMs`. `ready` = every cell has settled, which means each one reached `ok`, `unavailable` or `failed` — it does NOT mean every cell succeeded. Polling always terminates.
generatingreadycellsarray of object requiredThe first snapshot of the (developer × facet) grid. Compute cells typically start `pending`.
developerIdstring requiredThe developer this cell is about.
max 64 charsfacetKeystring requiredWhich facet this cell answers.
id.coreprofile.basicscore.crackedgithub.gardentags.matchedsignals.archetypesignals.signature_techsignals.builder_scopescore.gemsignals.ai_usagesignals.commit_factsactivity.contributionssignals.coreai.repo_summariesai.person_summaryidentity.linkedincontact.socialscontact.emailsfit.match_rationalefit.score_vs_jddossier.coredossier.contextualdossier.pitch_sheetstatusstring requiredThe outcome for this one (developer × facet) pair. Exactly one status is billed: `ok`. `ok` = delivered, `value` is populated, and you were charged for it (or you already owned it). `pending` = a background job is computing it; poll the report until it settles. Not charged now; the charge is settled by the job. `unavailable` = we ran and there is genuinely nothing to return for this developer, including the case where the source answered with an empty result. Not charged. `failed` = the attempt errored. Not charged, and never retried inside the same report. `report_required` = this facet needs background compute and you asked on a synchronous endpoint that does not dispatch jobs. Not charged; request it via `POST /v1/developers/reports` to get it. Treat every status other than `ok` as "no data", not as a value.
okpendingunavailablefailedreport_requiredvalueobjectThe facet payload. Present only when `status` is `ok`; its shape is specific to the facet key, so read it against the facet you asked for. A cell whose payload came back with nothing in it is downgraded to `unavailable` rather than returned as an empty `ok`, so an `ok` cell always carries at least one real field.
jobIdstringThe background compute job producing this cell. Present only when `status` is `pending`.
pendingboolean requiredTrue while any cell is still `pending`. The same fact as `status === "generating"`, as a boolean.
retryAfterMsinteger | null requiredHow long to wait before polling again, in milliseconds. Null once nothing is pending.
planobject requiredWhat you asked for versus what the dependency graph added and charged.
requestedarray of string requiredThe facet keys you asked for, with any bundle macro expanded into its members.
addedarray of string requiredFacets that were resolved and CHARGED on top because a facet you requested cannot be computed without them. This is why a bill can exceed the price of the keys you named.
billingobject requiredThe itemised bill. Compute cells are charged up front here, which is what makes retrieval free; a job that fails refunds its cell.
itemsarray of object requiredOne line per (developer × facet) cell, including the ones that cost nothing.
developerIdstring requiredThe developer this line item is for.
max 64 charsfacetKeystring requiredThe facet this line item is for.
id.coreprofile.basicscore.crackedgithub.gardentags.matchedsignals.archetypesignals.signature_techsignals.builder_scopescore.gemsignals.ai_usagesignals.commit_factsactivity.contributionssignals.coreai.repo_summariesai.person_summaryidentity.linkedincontact.socialscontact.emailsfit.match_rationalefit.score_vs_jddossier.coredossier.contextualdossier.pitch_sheetcreditsinteger requiredCredits charged for this one cell. Zero unless `state` is `billed`.
min 0statestring required`billed` = charged on this call. `owned` = you had already paid for this cell and it is still within its cache window, so it cost 0 and you still get the value. `included` = a sibling key of the same SKU carried this call's charge, so this cell cost 0 and is fully yours: you buy the SKU, not the key. `not_billed` = the cell did not resolve (failed, unavailable, or report_required), so it cost 0 and you got nothing. A failed cell can never be reported as billed.
ownedbilledincludednot_billed
totalinteger requiredThe sum of `items`, so FACET CELLS ONLY. This is NOT what the call cost — it excludes the route’s own charge. Reconciling a finance integration on this field under-reports every bill. Use `totalCredits`.
min 0baseCreditsinteger requiredThe route’s own charge, separate from enrichment: one credit per developer returned on a search, one per input resolved on a lookup, 0 on a route that is free.
min 0totalCreditsinteger requiredWhat this call actually cost you: `baseCredits + total`. This is the number that matches the `x-cost` response header and the ledger entry. Reconcile on this.
min 0
jobIdsarray of string requiredThe distinct background jobs backing the pending cells, for tracing.
400Empty/oversized arrays, an unknown facet, a misused contextRef, or no compute facet requestedcodestring 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_errormessagestring 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 the credit top-up).
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.
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_errormessagestring 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 the credit top-up).
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.
402Insufficient credit 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_errormessagestring 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 the credit top-up).
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.
429Per-actor rate limit exceededcodestring 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_errormessagestring 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 the credit top-up).
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.