/v1/search/jobs/{id}Poll a deep-search job
The job’s status, live progress meter, per-round delivered/banked history, and the durable delivered result set (the ranked developers, oldest round first). Self-scoped and free — poll as often as you like.
Path parameters
idstring requiredmax 17 chars
Responses
200The job detailjobobject requiredidstring requiredThe job id. Poll `GET /v1/search/jobs/{id}` with it.
statusstring requiredWhere the job stands. A job is still working until it reaches a terminal status; poll rather than assuming a submit returned everything.
queuedrunningsucceededpartialfailedcanceledtargetCountinteger requiredHow many developers you asked this job to find.
targetModestring required`exact` = deliver the target count or report a clean partial. `best_effort` = deliver what the lane can find. Either way an under-delivery is reported as a partial, never padded.
exactbest_effortsavedSearchIdstring | null requiredThe saved search this job belongs to, when it was run from one. Delivered-once uniqueness is enforced across the saved search, so a later job will not repeat developers an earlier one delivered.
projectIdstring | null requiredThe project this job was run for, when one was named.
progressSearchJobProgress requiredCounts so far. Null before the first round has produced anything.
deliveredinteger requiredHow many developers this job has actually handed you so far, across all rounds. This is what you received, NOT what you paid for.
min 0bankedinteger requiredDevelopers found and held back beyond the current target, ready to be handed over by a `/more` round without re-running the search.
min 0roundinteger requiredHow many rounds this job has run. Round 0 is the agentic sweep; later rounds page deterministically.
min 0consideredinteger requiredHow many candidates this job was BILLED on: the ones the agent enriched and put in front of the recruiter judge, most of which are rejected before you ever see them. This is normally several times `delivered`, and the ratio between the two is what you paid for. On a round that fell back to the deterministic pager, billing is per developer delivered and this equals `delivered`.
min 0
errorstring | null requiredWhy a failed job failed, in plain words. Null on every job that ended well.
creditsEstimatedinteger requiredThe estimate made when the job was submitted. Nothing is charged at submit.
creditsChargedinteger requiredCredits actually charged so far. Settled as rounds complete, on candidates considered rather than delivered.
budgetCreditsinteger | null requiredThe ceiling you set on what this job may cost, in total, across every round. Null when you set none.
budgetRemaininginteger | null required`budgetCredits` minus `creditsCharged`: what is still spendable on this job. A `/more` round is truncated to what this buys, and refused with a 402 once it reaches 0. Refunds put credits back here, because it is derived rather than stored. Null when no ceiling was set.
createdAtstring requiredWhen the job was submitted, as an ISO 8601 instant.
updatedAtstring requiredWhen the job last changed, as an ISO 8601 instant.
roundsarray of SearchJobRound requiredPer-round delivered/banked history, oldest first.
max 200 itemsroundinteger requiredThe round number. Round 0 is the agentic sweep.
min 0deliveredinteger requiredDevelopers handed over in this round.
min 0bankedinteger requiredDevelopers found in this round but held back for a later `/more` round.
min 0
resultsarray of SearchJobResult requiredThe durable result set: every developer this job has ranked, delivered or banked, oldest round first. Rows carry ids only; hydrate profiles with `GET /v1/developers/{id}`.
max 5000 itemsdeveloperIdstring requiredThe developer this row refers to. Hydrate the profile with `GET /v1/developers/{id}`.
roundinteger requiredThe round that produced this row.
min 0rankinteger requiredPosition within its round, best first. Ranks are per round, so they repeat across rounds.
scorenumber | null requiredThe ordering key within this round, descending. Comparable only within the round, and not a statement of match quality. Null when the producing lane did not score.
sourcestring requiredWhich lane produced this row: the agentic selector, or the deterministic pager it falls back to when the agent host is unreachable.
repo_fanoutuser_entityinterestslinkedinbankedagent_selectdeliveredboolean requiredTrue when this developer was handed to you. False means banked: found and held for a later `/more` round.
whySearchJobResultWhy requiredWhy the agent selected this developer for THIS role, in its own words. Present on rows the agentic selector produced (the judgment you paid for); null on rows the deterministic pager produced, which does not reason about candidates.
summarystring | null requiredOne sentence on why this developer fits THIS role, in the judge’s own words.
max 5000 charsclaimsarray of string requiredThe supporting statements behind `summary`: the angle they came in on, the fit blurb, and the tags.
max 8 itemsrepoobject | null requiredThe ONE repository the judge picked as relevant to this role. Not their most-starred repo — that is a popularity artifact. Null when the judge found no role-relevant repo.
fullNamestring requiredGitHub `owner/name`.
max 200 charsurlstring requiredThe public github.com URL of the repository.
max 2048 chars
repoSummarystring | null requiredA plain-English sentence about `repo`, written for a human to read or paste.
max 5000 chars
feedbackstring | null requiredThe thumbs verdict you recorded on this developer for this job, if any. Null when none.
updown
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.
404No such search job in this accountcodestring 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.