/v1/searches/planPlan a search from natural language
search:readTurn a plain-language hiring ask into a query plan: the lanes to run, the filters to apply, and how to fuse them. Planning is free and the plan is yours to edit. Send it back to POST /v1/searches/run to execute it, or change a filter first. The plan is honest about its own limits: warnings name the coverage gaps it depends on (a LinkedIn lane only sees the LinkedIn-linked subset, a country filter only sees profiles whose location resolved), the preferences that ended up ranked rather than filtered, and anything you asked for that this corpus cannot answer. Identical queries are served from a cache for seven days. A request that cannot be grounded in the corpus at all answers 422 rather than inventing a plan.
Request body PlanSearchRequest
querystring requiredWhat you are looking for, in plain language. Describe the work you want evidence of, not a boolean query.
max 2000 chars
Responses
200The plan, and what it cannot promiseplanobject requiredThe plan to run. Edit it and POST it to /v1/searches/run.
intentstring requiredmax 300 charslanesarray of one of requiredmin 1 items, max 4 itemsOption 1kindstring requiredusers.bm25textstring requiredmin 1 chars, max 200 chars
Option 2kindstring requiredusers.rankattributestring requiredcreatedAtdirectionstring requiredascdesc
Option 3kindstring requiredrepos.anntextstring requiredmin 1 chars, max 500 charsrepoFiltersarray of arraymax 6 items
Option 4kindstring requiredrepos.bm25textstring requiredmin 1 chars, max 200 charsrepoFiltersarray of arraymax 6 items
Option 5kindstring requiredlinkedin.anntextstring requiredmin 1 chars, max 500 charsliFiltersarray of arraymax 6 items
Option 6kindstring requiredusers.anntextstring requiredmin 1 chars, max 500 chars
userFiltersarray of array default: []max 8 itemspostobjectminDevrankTierstringEliteRareSolid
fuseobject default: {"method":"rrf","k":60}methodstring requiredrrfkinteger default: 60min 1, max 200
warningsarray of string requiredWhat this plan cannot honestly promise: coverage gaps it relies on, preferences that are ranked rather than filtered, and any part of the ask this corpus cannot answer.
max 100 items
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.
403Missing search:readcodestring 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.
422The request could not be turned into a plan (UNPLANNABLE)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_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.
502The planner is unavailablecodestring 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.