{"openapi":"3.1.0","info":{"title":"Sprouts Data Platform API","description":"GTM entity search, look-alikes, full records and async research over the Sprouts graph. Authenticate with a server-side `sk_dsp_*` key in the `X-API-Key` header.","version":"1.0.0"},"paths":{"/healthz":{"get":{"tags":["meta"],"summary":"Liveness","operationId":"healthz","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Healthz"}}}}}}},"/readyz":{"get":{"tags":["meta"],"summary":"Readiness","description":"Reports dependency reachability.\n\nReadiness is deliberately *not* all-or-nothing: the dependency-failure\nmatrix (`07 §6`) says a Redis outage fails **open** (the limiter must not\nshed traffic) while mint fails **closed**. Only hard dependencies gate.","operationId":"readyz","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Readyz"}}}}}}},"/v1/credits":{"get":{"tags":["credits"],"summary":"Credit balance for the tenant","description":"What this tenant can spend on the data platform.\n\nAll three numbers are real now that grants carry a `platform_code`\n(`SDP-15`):\n\n- `allocated` — credits earmarked to dsp specifically.\n- `shared` — the tenant's unrestricted credits. **Reported but not\n  spendable here**: dsp is hard-capped (`SDP-30`), so an exhausted\n  allocation is a 402 rather than a quiet fall-through onto the Account OS\n  balance. It is reported anyway because an empty allocation beside a\n  healthy shared balance must read as \"move some across\", not as an empty\n  account.\n- `spendable` — the headline, and the one that agrees with what a charge\n  will actually allow.\n\n`scope` says which of those two worlds produced the answer, so a caller can\ntell a real per-platform figure from the legacy tenant-wide fallback that\nan un-upgraded mint still returns.","operationId":"credits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.usage.read"]}},"/v1/keys/usage":{"get":{"tags":["credits"],"summary":"Spend for the calling key","description":"Spend for the calling key.\n\nOnly the calling key: reading another key's usage needs a scope that does\nnot exist, and inventing one before the dashboard exists would be guessing\nat who may see whose spend.\n\n**Key-authenticated only** (`SDP-27`). mint answers `400 not_a_key_principal`\nfor a human token, and our client translates any non-200 into\n`CreditsUnavailable` → 503 — telling the dashboard that mint is down when\nthe question was simply malformed. Same misdirection class as the signup\n404-mapped-to-503 already recorded in `09`, so the refusal happens here.\n\nThe consequence is honest and worth stating: the dashboard cannot show\nusage at all, because it has no key to call with. That needs a\ntenant-scoped usage endpoint in mint (`W-66`).","operationId":"key_usage","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"granularity","in":"query","required":false,"schema":{"type":"string","pattern":"^(hour|day|month|total)$","default":"day","title":"Granularity"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.usage.read"]}},"/v1/usage/history":{"get":{"tags":["history"],"summary":"Your recent runs","description":"Every billable run this credential made, newest first.\n\nLight rows only — the query, when, what it cost, how it went. The detail\nendpoint carries the request, the resolved plan and the replayable\nsnapshot (searches only; an agent run's results stay free to re-read on\nits own surface instead). Cursor-paginated like every other list on\n`/v1`; there is no page or offset parameter.","operationId":"usage_history","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous page.","title":"Cursor"},"description":"Opaque cursor from a previous page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["dsp.search.fast","dsp.search.auto","dsp.search.deep","dsp.similar","dsp.entities","dsp.relationships","dsp.relationships.ask","dsp.org_chart","dsp.agent.run.minimal","dsp.agent.run.low","dsp.agent.run.medium","dsp.agent.run.high","dsp.agent.run.xhigh"],"type":"string"}},{"type":"null"}],"description":"Only runs of these billable actions. Repeatable — pass it once per action to filter to a family, e.g. all five agent tiers.","title":"Action Type"},"description":"Only runs of these billable actions. Repeatable — pass it once per action to filter to a family, e.g. all five agent tiers."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_HistoryRunSummary_"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.usage.read"]}},"/v1/usage/history/{run_id}":{"get":{"tags":["history"],"summary":"One run, with its replayable snapshot","description":"The full record of one run — request, resolved plan, and the page-1\nsnapshot the dashboard replays without re-running (and re-billing) the\nsearch. `snapshot_state` says why `snapshot` is null when it is null.","operationId":"usage_history_detail","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryRunDetail"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"history.not_found":{"summary":"The run does not exist, or is not this credential's to see","value":{"type":"https://dashboard.sproutsdata.ai/errors/history-not-found","title":"Run not found","status":404,"code":"history.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such run in your history. It may have aged out, or the id may belong to a different credential."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.usage.read"]}},"/v1/usage/metrics":{"get":{"tags":["history"],"summary":"Your run counts, outcomes and credits per day","description":"Requests, ok/failed split and credits per day per action, over this\ncredential's own runs. Window defaults to the last 30 days, same as\n`/v1/keys/usage`.","operationId":"usage_metrics","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryMetricsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.usage.read"]}},"/v1/feedback":{"post":{"tags":["feedback"],"summary":"Report a problem with a search or one of its results","operationId":"report_search","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreated"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"feedback.subject_not_found":{"summary":"The search being reported is not one this credential ran","value":{"type":"https://dashboard.sproutsdata.ai/errors/feedback-subject-not-found","title":"No such search","status":404,"code":"feedback.subject_not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"That request_id is not a search we hold for you. Report a search you ran, using the request_id from its response `meta.request_id`."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read","dsp.usage.read"]},"get":{"tags":["feedback"],"summary":"Reports this credential has filed","description":"What this credential has reported, newest first.\n\nScoped by construction, not by a filter the caller passes: the tenant comes\nfrom the session and the actor from the credential, so a person who belongs\nto two organisations sees each one's reports only while signed into it, and\nnever a colleague's.\n\n`total` counts what the caller has, under that same visibility, so a pager\ncan tell a full page from the last one without asking for the next — and it\nnarrows with the filters, or a pager would offer pages nothing can fill.\n\nA filter value we do not recognise is a `422` rather than an empty list. An\nempty list here reads as \"you never reported that\", which is a different\nfact from \"that is not a tag\", and a typo would otherwise look like good\nnews.","operationId":"list_feedback","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"subject_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Subject Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Status"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Tag"}},{"name":"subject_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Subject Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackListResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.search.read","dsp.usage.read"]}},"/v1/feedback/tags":{"get":{"tags":["feedback"],"summary":"The tag vocabulary, and its version","description":"Served from the same constant validation uses.\n\nOne source of truth on purpose: a client told a tag is valid and then\nrefused it is a bug that only shows up in someone else's integration.","operationId":"list_feedback_tags","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagVocabularyResponse"}}}}}}},"/v1/feedback/votes":{"put":{"tags":["feedback"],"summary":"Vote on a result set, or flag one record","operationId":"feedback_vote_cast","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCastResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read","dsp.usage.read"]},"get":{"tags":["feedback"],"summary":"Your active votes on one response","operationId":"feedback_votes_list","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteListResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.search.read","dsp.usage.read"]}},"/v1/coverage":{"get":{"tags":["coverage"],"summary":"What the index holds, per corpus","description":"Per-corpus totals and embedding coverage — the runtime answer to\n\"which categories are real in this deployment\". Gate category pickers on\nthis rather than hard-coding the schema's list.","operationId":"coverage","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"segment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EntityCategory"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read"]}},"/v1/search":{"post":{"tags":["search"],"summary":"Search a category of the Sprouts corpus","description":"Search one category — companies, persons, or a document vertical.\n\n`mode` decides how the query is interpreted; `resolved_search` in the\nresponse says what we decided it meant.","operationId":"search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_dict_str__Any__"},"examples":{"fintech_berlin":{"summary":"Two company hits, live-prism field vocabulary","value":{"results":[{"id":"hoft.berlin","category":"company","score":1.0,"account_name":"House Of Finance & Tech Berlin","domain":"hoft.berlin","industry":"Finance","sub_industry":"Banking","employee_count":15,"employee_range":{"min":11,"max":50},"founded_year":2024,"technology":["salesforce","hubspot"],"description":"the house of finance & tech berlin serves as …"},{"id":"solarisgroup.com","category":"company","score":0.93,"account_name":"Solaris SE","domain":"solarisgroup.com","industry":"Finance","sub_industry":"Banking","employee_count":611,"employee_range":{"min":501,"max":1000},"founded_year":2016,"technology":["aws","kubernetes"],"description":"solaris is europe's leading embedded finance platform …"}],"total":10000,"total_is_estimate":true,"has_more":true,"next_cursor":"eyJmIjoiMDNjMjUzNzk3MjM3MTI3ZSIsIm8iOjEs…","resolved_search":{"parser_version":"none","mode":"fast","category":"company","query":"fintech companies in berlin","filters":{},"filters_source":"none","semantic_query":"fintech companies in berlin","conflicts":[],"overrides":[]},"attribution":[{"source_corpus":"gtm_index","as_of":"2026-08-12T19:52:31Z"}],"degradation":[],"meta":{"request_id":"fc8735204043c339af9e9cbffaff2b21","environment":"live","as_of":"2026-08-12T19:52:31Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/similar":{"post":{"tags":["search"],"summary":"Find companies similar to a set of anchors","description":"Rank companies by vector similarity to the supplied anchors.\n\nAnchors, not a text query: use `/v1/search` when describing what you want\nin words. Company-only today.","operationId":"similar","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilarRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_dict_str__Any__"},"examples":{"payments_lookalikes":{"summary":"One look-alike hit; `parser_version` is always \"none\" here","value":{"results":[{"id":"market-pay.com","category":"company","score":0.86,"account_name":"Market Pay","domain":"market-pay.com","industry":"Finance","sub_industry":"Payments","employee_count":180,"description":"market pay is a pan-european payment platform …"}],"total":5,"total_is_estimate":false,"has_more":true,"next_cursor":"eyJmIjoiZjhhMmM0OWQxYjc2MzA1ZCIsIm8iOjEs…","resolved_search":{"parser_version":"none","mode":"fast","category":"company","filters":{"anchors":["adyen.com","checkout.com"],"combine":"and"},"filters_source":"caller","conflicts":[],"overrides":[]},"attribution":[{"source_corpus":"gtm_index","as_of":"2026-08-12T19:52:31Z"}],"degradation":[],"meta":{"request_id":"9c41d6a02b8f4e73a5c0d1e2f3a4b5c6","environment":"live","as_of":"2026-08-12T19:52:31Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/lists":{"get":{"tags":["lists"],"summary":"This workspace's saved lists","operationId":"lists_list","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read","dsp.search.read"]},"post":{"tags":["lists"],"summary":"Create a saved list","operationId":"lists_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListName"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedListView"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read","dsp.search.read"]}},"/v1/lists/{list_id}":{"patch":{"tags":["lists"],"summary":"Rename a saved list","operationId":"lists_rename","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListName"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedListView"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]},"delete":{"tags":["lists"],"summary":"Delete a saved list","operationId":"lists_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]}},"/v1/lists/{list_id}/items":{"post":{"tags":["lists"],"summary":"Add records to a saved list","operationId":"lists_add_items","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddItemsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state — a limit it would cross, named in `extra`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.item_cap_reached":{"summary":"A free workspace's saved-items cap would be exceeded","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-item-cap-reached","title":"Saved-items limit reached","status":409,"code":"lists.item_cap_reached","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This workspace can save 500 items; 498 are saved and 5 were added.","extra":{"cap":500,"saved":498,"adding":5}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]},"delete":{"tags":["lists"],"summary":"Remove records from a saved list","operationId":"lists_remove_items","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveItemsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]},"get":{"tags":["lists"],"summary":"The current records in a saved list (not charged)","operationId":"lists_items","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListItemsResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]}},"/v1/lists/{list_id}/export":{"post":{"tags":["lists"],"summary":"Export a saved list as CSV (entitled fields only)","operationId":"lists_export","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"The CSV file.","content":{"text/csv":{}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"lists.not_found":{"summary":"The list does not exist, was deleted, or is another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-not-found","title":"List not found","status":404,"code":"lists.not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"No such list in this workspace."}},"export.not_enabled":{"summary":"CSV export is not enabled in this deployment","value":{"type":"https://dashboard.sproutsdata.ai/errors/export-not-enabled","title":"Not found","status":404,"code":"export.not_enabled","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"CSV export is not available."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.entities.read","dsp.search.read"]}},"/v1/search/export":{"post":{"tags":["lists"],"summary":"Export selected search results as CSV (entitled fields only)","operationId":"search_export","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchExportRequest"}}},"required":true},"responses":{"200":{"description":"The CSV file.","content":{"text/csv":{}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"export.not_enabled":{"summary":"CSV export is not enabled in this deployment","value":{"type":"https://dashboard.sproutsdata.ai/errors/export-not-enabled","title":"Not found","status":404,"code":"export.not_enabled","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"CSV export is not available."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}},"lists.unavailable":{"summary":"The saved-lists store is unavailable; nothing was changed","value":{"type":"https://dashboard.sproutsdata.ai/errors/lists-unavailable","title":"Lists unavailable","status":503,"code":"lists.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Saved lists are unavailable right now. Nothing was changed."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read","dsp.search.read"]}},"/v1/search/filters/{category}/{name}":{"get":{"tags":["search"],"summary":"List the values a document filter can take","description":"The values one filter accepts on one document category.\n\nSeparate from `/search/filters/{name}` because the two namespaces collide:\n`employment_type` is five Title-Case values on a person and ten snake_case\nones on a job posting. Naming the category is what keeps them apart, and it\nis why `name` here is a free string rather than the `FilterName` enum — that\nenum mirrors the company/person set, and mirroring a second one per category\nis exactly the duplication this route exists to remove.\n\nUse `/search/filters/{name}` for `company` and `person`.\n\nA filter that exists but takes free values returns an empty list rather than\nan error — \"this one accepts anything\" is an answer. A 422 means the name is\nnot a filter on that category at all.","operationId":"document_filter_values","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"category","in":"path","required":true,"schema":{"$ref":"#/components/schemas/EntityCategory","description":"Which document category the filter belongs to."},"description":"Which document category the filter belongs to."},{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"The filter name, exactly as the search request spells it.","title":"Name"},"description":"The filter name, exactly as the search request spells it."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Case-insensitive substring match, applied before paging.","title":"Search"},"description":"Case-insensitive substring match, applied before paging."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"1-indexed. Page size is fixed at 20.","default":1,"title":"Page"},"description":"1-indexed. Page size is fixed at 20."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFilterValuesResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read"]}},"/v1/search/filters/{name}":{"get":{"tags":["search"],"summary":"List the values a filter can take","description":"The values one filter accepts — for autocomplete and pickers.\n\n**Geography is the one place the name here differs from the name you\nfilter by.** `geo` spans four levels and has no single vocabulary, so it\nis not a name this route accepts. Enumerate places one level at a time\n(`country`, `state`, `city`, `region`) and feed the answer back as\n`geo.places[].value` with that same `level`.\n\n**Two-level filters.** `industry` and `department` are parent/child. Ask for\nthe rows with `level=parents`, then one branch at a time with\n`parent=<name>` as the user expands it. `department` cannot be done any\nother way: its plain value list is all 248 values of both levels with\nnothing marking which is which. `level=children` gives the other rung,\nde-duplicated.","operationId":"filter_values","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"$ref":"#/components/schemas/FilterName","description":"Which filter's values to list."},"description":"Which filter's values to list."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Case-insensitive substring match, applied before paging.","title":"Search"},"description":"Case-insensitive substring match, applied before paging."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"1-indexed. Page size is fixed at 20.","default":1,"title":"Page"},"description":"1-indexed. Page size is fixed at 20."},{"name":"parent","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"One parent's children, for the two-level filters (`industry`, `sub_industry`, `department`). How a tree picker fills a branch on expand — the child list carries no parent of its own, and no substring search stands in for one. Composes with `search` and `page`. Mutually exclusive with `level`.","title":"Parent"},"description":"One parent's children, for the two-level filters (`industry`, `sub_industry`, `department`). How a tree picker fills a branch on expand — the child list carries no parent of its own, and no substring search stands in for one. Composes with `search` and `page`. Mutually exclusive with `level`."},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(parents|children)$"},{"type":"null"}],"description":"One rung of a two-level filter: `parents` or `children`. `parents` is a tree's first call, and `department` needs it — that filter's value list mixes both levels with nothing marking which is which, so the parents cannot be sliced out client-side. Mutually exclusive with `parent`.","title":"Level"},"description":"One rung of a two-level filter: `parents` or `children`. `parents` is a tree's first call, and `department` needs it — that filter's value list mixes both levels with nothing marking which is which, so the parents cannot be sliced out client-side. Mutually exclusive with `parent`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilterValuesResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read"]}},"/v1/sorts/{category}":{"get":{"tags":["search"],"summary":"List the fields a search can be ordered by","description":"Every sort field one category accepts, complete and unpaginated.\n\nComplete on purpose: the largest set is 26, and a picker that has to page\nthrough a closed list to learn what is legal is the problem this route\nexists to remove.\n\nRead `applies_to` before rendering. On `company` and `person` the same\ncatalogue covers both axes — 13 fields are company-only, 8 person-only, and\n5 work on either — and the engine refuses the wrong pairing.","operationId":"sort_catalog","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"category","in":"path","required":true,"schema":{"$ref":"#/components/schemas/EntityCategory","description":"Which category's sort fields to list."},"description":"Which category's sort fields to list."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SortCatalogResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.search.read"]}},"/v1/relationships":{"post":{"tags":["relationships"],"summary":"Find people connected across companies and institutions","description":"Who is connected to whom, over which shared employers and schools.\n\nTwo questions, chosen with `relation`:\n\n- **`between_companies`** — people at the **first** company who are\n  connected to people at the second. Order is the contract: swap them and\n  you get the mirror question.\n- **`via_institution`** — people at one company affiliated with named\n  institutions.\n\nEvery row carries `via`: which institutions connect them, and how confident\neach match is. That is the answer, not decoration — a person with no reason\nis not a connection.\n\nTwo limits worth knowing before you build on this. A connection here means a\n**shared institution**, not a personal acquaintance: two people who both\nworked at Palantir may never have met. And this cannot answer \"one person\nwho worked at both A and B\" — that is a different question the corpus cannot\nexpress, and asking for it is a 422 rather than an empty page.\n\nTo expand one row into the people they can actually reach, and how they know\neach other, send its `id` to `POST /v1/relationships/reach`.","operationId":"relationships","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipEnvelope"},"examples":{"warm_intro":{"summary":"People at Adyen reachable from Stripe, and the two institutions that bridge them","value":{"results":[{"id":"9f2c1ae07d3b52c8","category":"person","full_name":"Ada Lovelace","title":"VP Engineering","linkedin_url":"linkedin.com/in/ada-lovelace","country":"united kingdom","department":"Engineering / Software","seniority":"VP","number_of_contacts_overlapping_tenure_with":148,"match_reason_count":2,"match_type":["Previously worked at Palantir Technologies","Attended Stanford University"],"is_alum":true,"currently_at_target":false,"via":[{"id":"linkedin.com/company/palantir-technologies","name":"Palantir Technologies","kind":"employment","match_confidence":"url","started":"2016-03-01","ended":"2019-11-01","role":"staff engineer","match_type":"Previously worked at Palantir Technologies"},{"id":"edu:stanford_univ","name":"Stanford University","kind":"education","match_confidence":"edu","started":"2008-09-01","ended":"2012-06-01","role":"bachelors","match_type":"Attended Stanford University"}],"profile_complete":true}],"institutions":[{"id":"edu:stanford_univ","name":"Stanford University","kind":"education","match_confidence":"edu","people_first":12,"people_second":7}],"connection_basis":"overlapping","total":34,"total_is_estimate":false,"has_more":true,"next_cursor":"eyJ1IjoiLi4uIn0.7f1c9a2b","resolved_search":{"parser_version":"none","mode":"fast","category":"person","filters":{"relation":"between_companies","companies":["stripe.com","adyen.com"],"adyen.com seniority":["VP","Director / Head"]},"filters_source":"caller","conflicts":[],"overrides":[]},"attribution":[{"source_corpus":"affiliations","as_of":"2026-08-18T09:12:44Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z3","environment":"live","as_of":"2026-08-18T09:12:44Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/relationships/reach":{"post":{"tags":["relationships"],"summary":"Find who can be reached at a company through one person","description":"Expand one person into the people they can reach at a company.\n\nThe drill-down of `POST /v1/relationships`, and callable on its own: send a\n`person.li_url` — which that route returns on every row as `linkedin_url` —\nand you never have to run the list query first.\n\nEvery row says *how*: the shared institution, both people's roles and dates\nthere, and how many months they overlap. By default only overlapping tenure\ncounts, because a shared former employer without it means very little on a\nlarge company — everyone who ever worked there shares it. Set\n`connection_basis` to `shared` for the broader reading; it is echoed back,\nbecause it decides which rows exist at all.\n\n`institutions` summarises the same answer the rows spell out one person at a\ntime: every institution the two sides connect through, and how many people\nat the target each one reaches. It describes the whole answer rather than\nthis page, so it is often the readable version — \"everyone you reach here,\nyou reach through Microsoft\" — and it is what you send back to\n`POST /v1/relationships` as an `institutions[]` anchor to narrow.\n\nPriced the same as `POST /v1/relationships`: it reads the same corpus and\ncosts the same upstream work.","operationId":"relationships_reach","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipReachRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReachEnvelope"},"examples":{"warm_intro":{"summary":"Who at Microsoft one person at Stripe can reach, and how","value":{"results":[{"id":"9f2c1ae07d3b52c8","category":"person","full_name":"Greg Wirth","title":"Director, Sourcing Engineering","linkedin_url":"linkedin.com/in/greg-wirth","country":"united states","company_name":"microsoft corporation","department":"Operations","seniority":"Director","match_type":["Overlapped at Microsoft Corporation for 6 months"],"how":[{"inst":"linkedin.com/company/microsoft","name":"microsoft corporation","kind":"employment","match_confidence":"url","their_role":"sr. sourcing engineer","their_started":"2001-06-01","their_ended":"2020-05-01","anchor_role":"marketing intern","anchor_started":"2012-06-01","anchor_ended":"2012-12-01","overlap_months":6,"match_type":"Overlapped at Microsoft Corporation for 6 months"}]}],"institutions":[{"id":"linkedin.com/company/microsoft","name":"microsoft corporation","kind":"employment","match_confidence":"url","people_at_target":2104},{"id":"edu:stanford_univ","name":"Stanford University","kind":"education","match_confidence":"edu","people_at_target":74}],"connection_basis":"overlapping","total":2160,"total_is_estimate":false,"has_more":true,"next_cursor":"eyJ1IjoiLi4uIn0.7f1c9a2b","resolved_search":{"parser_version":"none","mode":"fast","category":"person","filters":{"person":"linkedin.com/in/ada-lovelace","target_company":"microsoft.com"},"filters_source":"caller","conflicts":[],"overrides":[]},"attribution":[{"source_corpus":"affiliations","as_of":"2026-08-18T09:12:44Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z4","environment":"live","as_of":"2026-08-18T09:12:44Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/relationships/institutions":{"post":{"tags":["relationships"],"summary":"List the institutions two companies share, without ranking people","description":"Which employers and schools two companies both have people at.\n\nThe bridges on their own, as `results`, with how many distinct people each\ncompany has at each one. `POST /v1/relationships` returns the same list as a\nside-field, but only alongside a ranked page of people — and that ranking is\nthe expensive half of the work, plus a hydration lookup per row. This route\nruns the bridge aggregation and stops there, so it is the cheap way to ask\n\"what do these two actually have in common\" and the only way to *filter* that\nlist without paying for the people again.\n\n**Order matters, even here.** The first company's own institution keys are\nexcluded from the bridges and the second company's are kept, deliberately:\nessentially everyone on the first side has that company as their current\nemployer, so it bridges nobody, while having previously worked at the\n*second* company is the strongest connection the corpus holds. Swap the two\nand you get a different list with different counts.\n\nFour ways to narrow it, each of which changes which institutions qualify\nrather than just what is displayed:\n\n- `companies[].people` — department, seniority and country, applied to that\n  side alone. An institution has to keep enough matching people on **both**\n  sides to survive, so filtering one side can remove bridges entirely.\n- `institution_type` — shared employers only, or schools only.\n- `min_people_per_side` — drops one-person coincidences. Applied after the\n  upstream trim to `limit`, so a high threshold can return fewer than `limit`\n  institutions even when more would have passed it.\n- `name_starts_with` — a case-insensitive **prefix** on the display name, not\n  a substring: `\"stan\"` finds Stanford, `\"ford\"` does not.\n\nEach row's `id` is the affiliation corpus's own key, and it round-trips: send\nit back to `POST /v1/relationships` as an `institutions[]` anchor (`by` is\ndetected as `inst_key`) to get the people who are connected through that one\ninstitution.\n\nTwo things to expect rather than be surprised by. Only the exact key forms\nthe upstream resolved for the first company are excluded, so a company's own\ninstitution can still appear under an alternate key form — `name:microsoft`\nbeside `linkedin.com/company/microsoft` — carrying its own employees'\ncount. And this route is **not paginated**: `has_more` is always `false` and\n`next_cursor` always `null`, `limit` is the whole list, and `truncated` says\nwhether more qualified.\n\nPriced flat per call, whatever comes back: one aggregation is the same work\nwhether it finds three bridges or two hundred.","operationId":"relationships_institutions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipInstitutionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedInstitutionsEnvelope"},"examples":{"shared_bridges":{"summary":"Every employer and school Stripe and Adyen both have people at, with how many on each side","value":{"results":[{"id":"linkedin.com/company/adyen","name":"Adyen","kind":"employment","match_confidence":"url","people_first":41,"people_second":806},{"id":"edu:stanford_univ","name":"Stanford University","kind":"education","match_confidence":"edu","people_first":12,"people_second":7},{"id":"name:mckinsey & company","name":"McKinsey & Company","kind":"employment","match_confidence":"name","people_first":4,"people_second":3}],"total":3,"total_is_estimate":false,"has_more":false,"truncated":false,"resolved_search":{"parser_version":"none","mode":"fast","category":"person","filters":{"companies":["stripe.com","adyen.com"]},"filters_source":"caller","conflicts":[],"overrides":[]},"attribution":[{"source_corpus":"affiliations","as_of":"2026-08-18T09:12:44Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z5","environment":"live","as_of":"2026-08-18T09:12:44Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/relationships/ask":{"post":{"tags":["relationships"],"summary":"Ask a relationship question in words","description":"One box for every relationship question.\n\nSend a sentence. Which of the three questions it turns out to be — people\nbridging two companies, who one named person can reach, or the shared\nemployers and schools themselves — is worked out upstream and reported back\nas `route`, alongside what was understood and anything that had to be\nwidened or dropped.\n\n**Read `route` before the rows.** Exactly one of `relationships`, `reach` and\n`institutions` is populated, and they are different shapes because they are\ndifferent answers. A question that reads two ways is refused rather than\nguessed at: a wrong *kind* of answer is complete, plausible and about\nsomething else, which no field on a successful response can warn you about.\n\nA question this corpus cannot answer is refused with the reason and, where\nthere is one, the endpoint that does answer it. The three typed routes are\nunchanged and remain the way to ask when you already know which you want.\n\nPriced like `POST /v1/relationships` by the rows it returns, or flat like\n`POST /v1/relationships/institutions` when it is routed there.","operationId":"relationships_ask","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipAskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskEnvelope"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/org-chart":{"post":{"tags":["org-chart"],"summary":"Count a company's people by department and seniority","description":"How one company's people distribute across departments and seniorities.\n\n**This is a matrix, not a tree.** The corpus holds no reporting lines — no\nperson document carries a manager — so there is no hierarchy here to walk\nand no `direct_reports` coming later. What you get is every person we hold\nfor the company, grouped by two closed vocabularies: the 23-function\ndepartment taxonomy across one axis and the seven-level seniority ladder\nacross the other.\n\nRead `total` as the headcount and `cells` as the classified part of it. The\ntwo do not match, and the gap is not a bug: someone whose title we hold but\nwhose function we could not infer is counted in `total`, in neither axis\ntotal, and in no cell. Send `include_others: true` to see those people as a\nrow and a column of their own rather than only in the difference.\n\nOrder is fixed rather than reported: departments descend by headcount with\nthe leftover buckets last, and seniorities always run C-Suite to In\nTraining. Two companies' charts therefore read the same way, and a column\nthat is missing is a column with nobody in it.\n\nNarrow with any of the filters and the counts change rather than the\ndisplay — `country: [\"Netherlands\"]` returns the Dutch org chart, not the\nglobal one with cells hidden. `POST /v1/org-chart/locations` is where the\nplace names come from.\n\nTo see the people behind a cell, search for them: `POST /v1/search` with\n`category: \"person\"`, `include_domains: [\"<domain>\"]` and `department` /\n`seniority` filters set to that cell's labels. The one exception is a cell\nlabelled `Others`, which is not a value the search filters accept — it\nnames the absence of a value, and there is nothing to filter on.","operationId":"org_chart","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartResponse"},"examples":{"grid":{"summary":"Stripe's people, counted by department and seniority","value":{"company":{"domain":"stripe.com"},"total":8214,"departments":["Engineering / Software","Sales","Others"],"seniorities":["C-Suite","VP","Director / Head","IC","Others"],"cells":[{"department":"Engineering / Software","seniority":"C-Suite","count":4},{"department":"Engineering / Software","seniority":"VP","count":38},{"department":"Engineering / Software","seniority":"Director / Head","count":121},{"department":"Engineering / Software","seniority":"IC","count":2604},{"department":"Sales","seniority":"VP","count":26},{"department":"Sales","seniority":"Director / Head","count":94},{"department":"Sales","seniority":"IC","count":1187},{"department":"Others","seniority":"Others","count":402}],"department_totals":{"Engineering / Software":2801,"Sales":1329,"Others":402},"seniority_totals":{"C-Suite":4,"VP":64,"Director / Head":215,"IC":3791,"Others":402},"attribution":[{"source_corpus":"gtm_index","as_of":"2026-09-10T11:04:22Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z3","environment":"live","as_of":"2026-09-10T11:04:22Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/org-chart/departments":{"post":{"tags":["org-chart"],"summary":"Break a company's departments into sub-departments","description":"One level below the grid: each department's sub-functions.\n\nThe same population as `POST /v1/org-chart` under the same filters, grouped\none level finer — Engineering into Backend, Frontend, SRE and the rest —\nwith each sub-function's own seniority counts.\n\nTwo things differ from the grid and will look like inconsistencies if you\nexpect otherwise. The labels are the corpus's raw values rather than the\ngrid's relabelled taxonomy, so a department name here can be absent from\nthe grid's `departments`. And people with no sub-function are named\n`Uncategorized` where the grid would say `Others` — two routes aggregating\ntwo fields, whose vocabularies this service does not merge, because\nrenaming an upstream's labels is how two systems start disagreeing about\ncounts.\n\nThere is no company total here: the upstream counts departments and not the\ncompany, and summing them would invent a headcount that silently excludes\neveryone it could not place. `POST /v1/org-chart` is where `total` lives.","operationId":"org_chart_departments","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartDepartmentsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartDepartmentsResponse"},"examples":{"sub_departments":{"summary":"Stripe's engineering department, by sub-function","value":{"company":{"domain":"stripe.com"},"departments":[{"name":"Engineering / Software","headcount":2801,"sub_departments":[{"name":"Backend Development","headcount":812,"seniority_counts":{"IC":744,"Manager":51,"Director / Head":17}},{"name":"DevOps / Platform / SRE","headcount":194,"seniority_counts":{"IC":171,"Manager":23}},{"name":"Uncategorized","headcount":88,"seniority_counts":{"IC":88}}]}],"attribution":[{"source_corpus":"gtm_index","as_of":"2026-09-10T11:04:22Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z4","environment":"live","as_of":"2026-09-10T11:04:22Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/org-chart/locations":{"post":{"tags":["org-chart"],"summary":"List where a company's people are, with headcounts","description":"Where one company's people are, as a country to city tree with counts.\n\nTwo uses. On its own it is the geographic shape of the company. Beside\n`POST /v1/org-chart` it is that route's vocabulary: these are the exact\nstrings its `country`, `state` and `city` filters accept, which is why\nguessing at place names is unnecessary and unreliable.\n\nA parent's count is not the sum of its children. Someone with a country and\nno city is counted at the country and in no city beneath it, so the levels\neach answer \"how many people do we place at least this precisely\".\n\n`search` is for typeahead: a case-insensitive substring matched across all\nthree levels at once. It filters people rather than labels, so matching a\ncity keeps that city's country and state in the tree with their counts\nreduced to the matching people — the branch stays navigable instead of\nreturning a city with no parent.\n\nUnlike the other two routes this one takes no people filters. It *is* the\nlocation vocabulary, so filtering it by location would be asking it to\ndescribe an answer you already hold.","operationId":"org_chart_locations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartLocationsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgChartLocationsResponse"},"examples":{"tree":{"summary":"Where Stripe's people sit, country to city","value":{"company":{"domain":"stripe.com"},"locations":[{"country":"united states","count":4912,"states":[{"state":"california","count":2711,"cities":[{"city":"san francisco","count":2104},{"city":"south san francisco","count":311}]},{"state":"washington","count":402,"cities":[{"city":"seattle","count":388}]}]},{"country":"ireland","count":611,"states":[{"state":"leinster","count":598,"cities":[{"city":"dublin","count":594}]}]}],"attribution":[{"source_corpus":"gtm_index","as_of":"2026-09-10T11:04:22Z"}],"degradation":[],"meta":{"request_id":"req_01J8Z5","environment":"live","as_of":"2026-09-10T11:04:22Z","credential":"api_key"}}}}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.search.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/companies":{"post":{"tags":["entities"],"summary":"Look up companies by id","operationId":"entities_companies","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_CompanyRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/persons":{"post":{"tags":["entities"],"summary":"Look up persons by id","operationId":"entities_persons","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_PersonRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/patents":{"post":{"tags":["entities"],"summary":"Look up patents by id","operationId":"entities_patents","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_PatentRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/trends":{"post":{"tags":["entities"],"summary":"Look up trends by id","operationId":"entities_trends","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_TrendRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/academic-reports":{"post":{"tags":["entities"],"summary":"Look up academic reports by id","operationId":"entities_academic_reports","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_AcademicReportRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/news":{"post":{"tags":["entities"],"summary":"Look up news articles by id or name","operationId":"entities_news","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamedDocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_NewsRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/market-reports":{"post":{"tags":["entities"],"summary":"Look up market reports by id or name","operationId":"entities_market_reports","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamedDocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_MarketReportRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/fundings":{"post":{"tags":["entities"],"summary":"Look up funding rounds by id or company name","operationId":"entities_fundings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamedDocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_FundingRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/entities/job-openings":{"post":{"tags":["entities"],"summary":"Look up job openings by id or job role, most recent first","operationId":"entities_job_openings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamedDocumentEntitiesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EntityHit_JobOpeningRecord__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"A dependency did not answer in time. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.timeout":{"summary":"The retrieval engine did not answer in time (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-timeout","title":"Upstream timed out","status":504,"code":"upstream.timeout","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine did not answer in time. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.entities.read"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Makes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again."}]}},"/v1/agents/runs":{"post":{"tags":["agents"],"summary":"Start an agent run","description":"Start a run. 202 with a handle; stream `/events` or poll the run.\n\nOrdered so that nothing irreversible happens before something reversible has\nbeen checked. The replay lookup comes first because a replay must never place a\nsecond hold; the hold comes before the engine call because an unaffordable run\nmust not start; and the run row is written only once the engine has accepted the\nrun, so a refusal leaves nothing behind but a released hold.","operationId":"agent_run_create","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Required. A unique value per intent, at most 255 characters. Reuse it when retrying the same request, and you get the original run back.","title":"Idempotency-Key"},"description":"Required. A unique value per intent, at most 255 characters. Reuse it when retrying the same request, and you get the original run back."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunHandle"}}}},"200":{"description":"A replay: this `Idempotency-Key` already started a run, so its handle comes back and no second run starts or is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunHandle"}}}},"400":{"description":"A required header is missing or malformed. The message names it.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A run was started without an `Idempotency-Key`","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Idempotency-Key is required","status":400,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Starting a run reserves credits and can take minutes, so a retry must be recognisable. Send a unique Idempotency-Key per intent and reuse it when retrying the same one."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Out of data-platform credits. Fixed by buying, not by waiting — never conflated with 429.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"credits.insufficient":{"summary":"The allocation cannot fund this action","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-insufficient","title":"Insufficient credits","status":402,"code":"credits.insufficient","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This action costs 0.5 credits; 0 available.","extra":{"available":0,"required":0.5,"action_type":"dsp.search.fast"}}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests. Honour the `Retry-After` header — it says how many seconds to wait before retrying.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"quota.burst_exceeded":{"summary":"Interactive burst limit hit — wait `Retry-After` seconds","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-burst-exceeded","title":"Too many playground requests","status":429,"code":"quota.burst_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Slow down, or use an API key for automated access."}},"quota.entity_ceiling":{"summary":"The credential has been shown its 30-day ceiling of distinct entities","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-entity-ceiling","title":"Entity ceiling reached","status":429,"code":"quota.entity_ceiling","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential has been shown 5,000,000 distinct entities in the last 30 days, at or above its ceiling of 5,000,000. Contact us to raise it.","extra":{"seen":5000000,"limit":5000000}}},"quota.concurrency_exceeded":{"summary":"Too many runs are being started at once for this credential","value":{"type":"https://dashboard.sproutsdata.ai/errors/quota-concurrency-exceeded","title":"Too many runs starting at once","status":429,"code":"quota.concurrency_exceeded","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential is already starting 5 runs at the same time. Wait a moment, then try again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"The engine behind this route failed to process the request. The cause is logged against `request_id`. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The agent engine failed to process the request","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"The search engine failed to run this request","status":502,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab"}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.agents.write"]},"get":{"tags":["agents"],"summary":"List your recent runs","description":"This tenant's runs, newest first.\n\nReads the edge's rows alone -- no fan-out to the engine. A list view that made\none upstream call per row would be the slowest endpoint in the API, and the\nfields it shows are all ours anyway.","operationId":"agent_runs_list","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunList"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.agents.read","dsp.agents.write"]}},"/v1/agents/runs/{run_id}":{"get":{"tags":["agents"],"summary":"Get a run's status and outcome","description":"One run's outcome, from the edge's record plus the engine's live state.","operationId":"agent_run_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResult"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"The agent run does not exist, or belongs to another workspace","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"No such run","status":404,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This run does not exist, or belongs to another tenant."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"The engine behind this route failed to process the request. The cause is logged against `request_id`. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The agent engine failed to process the request","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"The search engine failed to run this request","status":502,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab"}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.agents.read","dsp.agents.write"]}},"/v1/agents/runs/{run_id}/cancel":{"post":{"tags":["agents"],"summary":"Cancel a run","description":"Cancel a run and release its hold. Idempotent.\n\nCancelling releases rather than settles: the customer stopped the work, so they\nare charged nothing. A run that had already finished stays finished -- the engine\nowns that rule, so both callers get the same answer.","operationId":"agent_run_cancel","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResult"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"The agent run does not exist, or belongs to another workspace","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"No such run","status":404,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This run does not exist, or belongs to another tenant."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"The engine behind this route failed to process the request. The cause is logged against `request_id`. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The agent engine failed to process the request","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"The search engine failed to run this request","status":502,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab"}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.agents.write"]}},"/v1/agents/runs/{run_id}/results":{"get":{"tags":["agents"],"summary":"Page through a run's results","description":"A finished run's rows, as the same envelope every other list endpoint returns.\n\n**This is what makes a run worth starting.** Without it a caller could watch a run\nreach `universe_exhausted`, be charged for it, and never see the answer.\n\nPaginated with a real signed cursor, unlike `mode=deep`. The distinction is not\narbitrary: deep search cannot mint a faithful cursor because continuing it would\nmean re-executing an agentic predicate, which is not reproducible. A stored run\nanswer is already decided, so paging through it cannot shift under the reader.\n\nFree. The run was charged when it settled, and charging again to read what was paid\nfor would be indefensible -- so this route is named in the billing test's\nfree-under-a-metered-prefix list rather than inferred.","operationId":"agent_run_results","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_dict_str__Any__"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"The agent run does not exist, or belongs to another workspace","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"No such run","status":404,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This run does not exist, or belongs to another tenant."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"The engine behind this route failed to process the request. The cause is logged against `request_id`. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The agent engine failed to process the request","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"The search engine failed to run this request","status":502,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab"}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scopes":["dsp.agents.read","dsp.agents.write"]}},"/v1/agents/runs/{run_id}/events":{"get":{"tags":["agents"],"summary":"Stream a run's progress as server-sent events","description":"A run's event stream, resumable with `Last-Event-ID`.\n\nOwnership is checked here, before the stream opens. Inside a generator an\nauthorisation failure cannot become a status code, so it would have to be an\nerror frame on a 200 -- which a client can easily mistake for data.\n\nFrames are proxied unchanged. Their SSE `id` is the engine's durable per-run\nsequence number, and rewriting it would break the only property that makes the\nstream resumable.","operationId":"agent_run_events","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `id` of the last frame you received, to resume after it.","title":"Last-Event-Id"},"description":"The `id` of the last frame you received, to resume after it."}],"responses":{"200":{"description":"Server-sent events, one frame per step. Each frame's `id` is a sequence number; reconnect with `Last-Event-ID` to resume.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"The agent run does not exist, or belongs to another workspace","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"No such run","status":404,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This run does not exist, or belongs to another tenant."}}}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.agents.read","dsp.agents.write"]}},"/v1/members/resolve":{"post":{"tags":["members"],"summary":"Resolve one email to a member of the credential's organisation","description":"Is this person one of ours, and may they act here?\n\nExists because `GET /v1/members` cannot answer it for a key. That route\nforwards the caller's own token to auth-service, and a key's delegation\ntoken carries no user at all — so an integration that must attribute work\nto a person before spending the organisation's credits had no way to ask.\ndsp-slack is the first: Slack is a shared prompt, and a run nobody can be\nbilled for is the failure it exists to prevent.\n\nOne email per call, not a listing. A key asking \"is this specific person a\nmember\" needs one bit; handing it the roster would disclose every\ncolleague's address to an integration that never needed them.","operationId":"members_resolve","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberResolveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberResolveResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request is invalid: field validation failed (`extra.errors` names the fields) or a cursor could not be used.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"request.invalid":{"summary":"A field failed validation (`extra.errors` has the detail)","value":{"type":"https://dashboard.sproutsdata.ai/errors/request-invalid","title":"Invalid request","status":422,"code":"request.invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"One or more fields failed validation.","extra":{"errors":[{"type":"less_than_equal","loc":["body","limit"],"msg":"Input should be less than or equal to 100","input":500,"ctx":{"le":100}}]}}},"pagination.cursor_invalid":{"summary":"The cursor could not be read (e.g. a filter changed mid-pagination)","value":{"type":"https://dashboard.sproutsdata.ai/errors/pagination-cursor-invalid","title":"Invalid cursor","status":422,"code":"pagination.cursor_invalid","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The cursor could not be read. Start the search again."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.agents.write","dsp.search.read"]}},"/v1/billing/top-up/intents":{"post":{"tags":["billing"],"summary":"Start a credit top-up in the browser","description":"Mint a handle and return the dashboard URL that settles it.\n\nTakes **no body**. There is no amount, no platform and no tenant parameter —\nthe amount is chosen by the human in the browser, the platform is fixed, and\nthe tenant comes from the credential. A request cannot influence any of them,\nwhich is what makes a leaked or model-fabricated call to this route boring.","operationId":"topup_intent_create","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopUpIntentResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"501":{"description":"Not built yet. The server is the limitation, not the request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"not_implemented":{"summary":"A capability that is not available yet","value":{"type":"https://dashboard.sproutsdata.ai/errors/not-implemented","title":"Not implemented","status":501,"code":"not_implemented","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This capability is not available yet."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"APIKeyHeader":[]}],"x-scopes":["dsp.usage.read"]}},"/v1/billing/top-up/intents/{topup_id}":{"get":{"tags":["billing"],"summary":"Has this top-up been paid?","description":"Poll target. Free, and safe to call every few seconds.\n\nReads without consuming: dsp-mcp polls this until it flips, and the dashboard\nreads it on page load. See `app/billing/topup.py` for why replay is harmless\nhere and fatal in the stores this one otherwise resembles.","operationId":"topup_intent_status","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"topup_id","in":"path","required":true,"schema":{"type":"string","title":"Topup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopUpStatusResponse"}}}},"401":{"description":"Not authenticated. One generic reply for every pre-auth failure — the specific cause is logged against `request_id`, never narrated to an anonymous caller.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.unauthorized":{"summary":"No usable credential (cause deliberately unspecified)","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-unauthorized","title":"Unauthorized","status":401,"code":"auth.unauthorized","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Authentication required. Send a valid `X-API-Key`, or sign in if you are using the dashboard. Quote the request_id if you need help."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Authenticated, but not allowed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"auth.insufficient_scope":{"summary":"The credential does not hold the required scope","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-insufficient-scope","title":"Insufficient scope","status":403,"code":"auth.insufficient_scope","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This credential holds none of: dsp.search.read."}},"auth.browser_origin":{"summary":"A secret key was used from a browser","value":{"type":"https://dashboard.sproutsdata.ai/errors/auth-browser-origin","title":"API keys are server-side only","status":403,"code":"auth.browser_origin","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This request carried an Origin header, which means it came from a browser. Secret keys must never be used in client-side code."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found for this credential. Deliberately identical whether the thing does not exist or belongs to someone else.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"payment.topup_not_found":{"summary":"The top-up is unknown, expired, or another workspace's","value":{"type":"https://dashboard.sproutsdata.ai/errors/payment-topup-not-found","title":"No such top-up","status":404,"code":"payment.topup_not_found","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"This top-up does not exist, has expired, or belongs to another workspace."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"A dependency is unavailable; the work did not happen. Retry shortly.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"upstream.unavailable":{"summary":"The retrieval engine is unreachable (not charged)","value":{"type":"https://dashboard.sproutsdata.ai/errors/upstream-unavailable","title":"Upstream unavailable","status":503,"code":"upstream.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"The retrieval engine is unreachable. Retry shortly."}},"credits.unavailable":{"summary":"The billing service could not confirm the charge; retry with the same Idempotency-Key","value":{"type":"https://dashboard.sproutsdata.ai/errors/credits-unavailable","title":"Credits service unavailable","status":503,"code":"credits.unavailable","request_id":"bd22794d0c5c06f1d3e7045e3c0e32ab","detail":"Could not verify credits. Retry shortly."}}}},"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-scopes":["dsp.usage.read"]}}},"components":{"schemas":{"AcademicAuthor":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"employment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employment"}},"type":"object","title":"AcademicAuthor"},"AcademicCitation":{"properties":{"doi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doi"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}},"type":"object","title":"AcademicCitation"},"AcademicCitationCounts":{"properties":{"citations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Citations"},"references":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"References"}},"type":"object","title":"AcademicCitationCounts"},"AcademicReference":{"properties":{"doi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doi"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}},"type":"object","title":"AcademicReference"},"AcademicReportRecord":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"doi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doi"},"abstract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abstract"},"published_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Date"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"paper_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paper Type"},"authors":{"items":{"$ref":"#/components/schemas/AcademicAuthor"},"type":"array","title":"Authors"},"funded_by":{"items":{"type":"string"},"type":"array","title":"Funded By"},"citation_counts":{"anyOf":[{"$ref":"#/components/schemas/AcademicCitationCounts"},{"type":"null"}]},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"urls":{"items":{"type":"string"},"type":"array","title":"Urls"},"full_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text"},"references":{"items":{"$ref":"#/components/schemas/AcademicReference"},"type":"array","title":"References"},"citations":{"items":{"$ref":"#/components/schemas/AcademicCitation"},"type":"array","title":"Citations"}},"type":"object","title":"AcademicReportRecord","description":"`labels` (ingest quality markers like \"content unavailable\", not\nsubject tags) and `obtained_at` are deliberately not declared."},"AddItemsResponse":{"properties":{"saved_list":{"$ref":"#/components/schemas/SavedListView"},"added":{"type":"integer","title":"Added"},"already_present":{"type":"integer","title":"Already Present"},"suppressed":{"type":"integer","title":"Suppressed","description":"Items refused because the entity is on the Do-Not-Contact list."}},"type":"object","required":["saved_list","added","already_present","suppressed"],"title":"AddItemsResponse"},"AllocatedCredits":{"properties":{"granted":{"type":"number","title":"Granted","description":"Credits, to at most three decimals."},"remaining":{"type":"number","title":"Remaining","description":"Credits, to at most three decimals."},"reserved":{"type":"number","title":"Reserved","description":"Credits, to at most three decimals.","default":0.0},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["granted","remaining"],"title":"AllocatedCredits"},"AskEnvelope":{"properties":{"route":{"type":"string","enum":["relationships","reach","institutions","compare","fan_out"],"title":"Route","description":"Which question this turned out to be, and therefore which field below holds the answer.\n\n`relationships` — people at one company connected to another. `reach` — who one named person can reach somewhere. `institutions` — the employers and schools two companies share, with nobody ranked. `compare` — two ways in, weighed against each other. `fan_out` — people, each with what *they* can reach."},"reading":{"$ref":"#/components/schemas/AskReading","description":"What we understood. Check it before trusting the rows."},"relationships":{"anyOf":[{"$ref":"#/components/schemas/RelationshipEnvelope"},{"type":"null"}]},"reach":{"anyOf":[{"$ref":"#/components/schemas/ReachEnvelope"},{"type":"null"}]},"institutions":{"anyOf":[{"$ref":"#/components/schemas/SharedInstitutionsEnvelope"},{"type":"null"}]},"compare":{"anyOf":[{"$ref":"#/components/schemas/ComparisonEnvelope"},{"type":"null"}]},"fan_out":{"anyOf":[{"$ref":"#/components/schemas/FanOutEnvelope"},{"type":"null"}]},"credits_charged":{"anyOf":[{"type":"number","description":"Credits, to at most three decimals."},{"type":"null"}],"title":"Credits Charged","description":"What this question cost, in credits, to at most three decimals. Here rather than on a `meta`, because a two-part answer carries one per part and the charge covers the whole question. Priced like a relationship page, or flat like `/relationships/institutions` when it was routed there."}},"additionalProperties":false,"type":"object","required":["route"],"title":"AskEnvelope","description":"One answer to one question asked in words.\n\nA discriminated envelope rather than one flattened result shape: the routes\nreturn genuinely different things — ranked people, the people one person can\nreach, the bridges themselves, two sides weighed against each other — and a\ncommon row would throw away whichever part did not fit.\n\nRead `route` first, then the field it names. Exactly one is populated.\n\nThe last two are **two-part** answers, and neither is paginated: a\ncomparison is a fixed pair and a fan-out a fixed number of drill-downs, so\nthere is no window to advance. `next_cursor` is null on both, and it means\n\"there are no pages\" rather than \"you reached the last one\"."},"AskReading":{"properties":{"span":{"type":"string","title":"Span","description":"The part of your question this answer covers, in your own words. On a single question it is the whole sentence.","default":""},"searches":{"type":"integer","minimum":1.0,"title":"Searches","description":"How many searches this answer took.","default":1},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"What was widened, capped or could not be applied — in plain language, one entry per thing. Empty means nothing was dropped."}},"additionalProperties":false,"type":"object","title":"AskReading","description":"What the question was understood to mean.\n\nNot telemetry. It is the correction affordance: a router that decides which\nkind of question a sentence is will sometimes decide wrongly, and a wrong\n*kind* changes the shape of the answer as well as its contents — so nothing\nin a well-formed page says it answered a different question. This block is\nwhat lets a reader notice."},"Attribution":{"properties":{"source_corpus":{"$ref":"#/components/schemas/SourceCorpus"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"as_of":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"As Of"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"RESERVED for per-fact citation. Always null in v1."},"quote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote","description":"RESERVED for per-fact citation. Always null in v1."}},"type":"object","required":["source_corpus"],"title":"Attribution","description":"Where this response's content came from.\n\nResponse-level in v1: a source, not a citation. Per-*field* provenance —\n`headcount: 412, from LinkedIn, seen 2026-07-24` — is a property of a value\nand belongs inside the record, not here."},"Breakdown":{"properties":{"group_by":{"type":"string","enum":["department","seniority","country","institution"],"title":"Group By"},"groups":{"items":{"$ref":"#/components/schemas/BreakdownGroup"},"type":"array","title":"Groups"},"exact":{"type":"boolean","title":"Exact","description":"`false` when a count is an estimate, when values were merged under one label, or when the question required several institutions at once — each group is then an upper bound.","default":true},"more_groups":{"type":"boolean","title":"More Groups","description":"Smaller groups exist and were not returned.","default":false}},"additionalProperties":false,"type":"object","required":["group_by"],"title":"Breakdown","description":"The matching people broken down by one axis — present only when the\nquestion asked for one (\"by department\", \"most common school\")."},"BreakdownGroup":{"properties":{"key":{"type":"string","title":"Key","description":"The value as the index holds it."},"label":{"type":"string","title":"Label","description":"What to show: a department or seniority label, or the institution's name."},"people":{"type":"integer","minimum":0.0,"title":"People","description":"Distinct people in this group."},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"`employment` or `education`, for an institution breakdown."}},"additionalProperties":false,"type":"object","required":["key","label","people"],"title":"BreakdownGroup","description":"One row of a breakdown."},"CertificationDetail":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}},"type":"object","title":"CertificationDetail"},"CompanyEntitiesRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"minItems":1,"title":"Ids"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Restrict the returned fields. Omit for the full record."},"by":{"anyOf":[{"type":"string","enum":["auto","domain","li_url","name"]},{"type":"null"}],"title":"By","description":"When set, `ids` are raw identifier values instead of prism's internal id: `auto` classifies each one independently (mirrors the anchor detection `/v1/similar` uses); any other value forces every entry to that one kind. Omit for the default: `ids` are prism ids. The `id` on a search or similar hit is not a prism id (it is the company's domain or an opaque 16-hex hash), so look a hit up by its own fields instead: a company with `by: domain` and its `domain`, a person with `by: li_url` and its `linkedin_url`."}},"additionalProperties":false,"type":"object","required":["ids"],"title":"CompanyEntitiesRequest","description":"`POST /v1/entities/companies` (DEC-045 — one route per category,\nsuperseding the single category-in-body `/v1/entities`).","examples":[{"ids":["000006dddc0f7a39","definitely_not_real"]},{"by":"domain","fields":["account_name","industry","employee_count"],"ids":["adyen.com","checkout.com"]}]},"CompanyKeywordsFilter":{"properties":{"include":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Include"},"exclude":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Exclude"},"match_all":{"type":"boolean","title":"Match All","default":false},"target_fields":{"items":{"type":"string","enum":["name","keywords","description"]},"type":"array","minItems":1,"title":"Target Fields","description":"Which company fields to search. At least one is required."}},"additionalProperties":false,"type":"object","required":["target_fields"],"title":"CompanyKeywordsFilter","description":"Multi-field keyword match over company name / keywords / description.\n\n`target_fields` is required and must hold at least one field: with an empty\nlist the upstream builder produces no clause at all, so the filter would\nread as applied while matching everything."},"CompanyRecord":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"sub_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Industry"},"other_industries":{"items":{"type":"string"},"type":"array","title":"Other Industries"},"revenue":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue"},"employee_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Count"},"employee_range":{"anyOf":[{"$ref":"#/components/schemas/EmployeeRange"},{"type":"null"}]},"global_presence":{"anyOf":[{"$ref":"#/components/schemas/GlobalPresence"},{"type":"null"}]},"linkedin_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linkedin Followers"},"founded_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founded Year"},"total_funding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Funding"},"last_funding_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Funding Amount"},"last_funding_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Funding Date"},"funding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Stage"},"business_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Classification"},"ownership":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership"},"profit_non_profit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profit Non Profit"},"govt_non_govt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Govt Non Govt"},"technology":{"items":{"type":"string"},"type":"array","title":"Technology"},"naics":{"items":{"type":"string"},"type":"array","title":"Naics"},"sic":{"items":{"type":"string"},"type":"array","title":"Sic"},"company_keyword":{"items":{"type":"string"},"type":"array","title":"Company Keyword"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"job_openings":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Job Openings"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"region":{"items":{"type":"string"},"type":"array","title":"Region"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"logo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"street_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"facebook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Url"},"twitter_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Url"},"revenue_range":{"anyOf":[{"$ref":"#/components/schemas/RevenueRange"},{"type":"null"}]},"department_headcount":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"number"}]},"type":"object"},{"type":"null"}],"title":"Department Headcount"},"employees_by_country":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"number"}]},"type":"object"},{"type":"null"}],"title":"Employees By Country"},"business_models":{"items":{"type":"string"},"type":"array","title":"Business Models"},"company_types":{"items":{"type":"string"},"type":"array","title":"Company Types"},"operating_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Status"},"growth_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Growth Stage"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"ipo_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ipo Status"},"products":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Products"},"parent_organization":{"anyOf":[{"$ref":"#/components/schemas/Organisation"},{"type":"null"}]},"subsidiaries":{"items":{"$ref":"#/components/schemas/Organisation"},"type":"array","title":"Subsidiaries"},"acquisitions":{"items":{"$ref":"#/components/schemas/Deal"},"type":"array","title":"Acquisitions"},"acquired_by":{"items":{"$ref":"#/components/schemas/Deal"},"type":"array","title":"Acquired By"},"investors":{"items":{"type":"string"},"type":"array","title":"Investors"},"funding_rounds":{"items":{"$ref":"#/components/schemas/FundingRound"},"type":"array","title":"Funding Rounds"},"partnerships":{"items":{"type":"string"},"type":"array","title":"Partnerships"},"clients":{"items":{"type":"string"},"type":"array","title":"Clients"},"suppliers":{"items":{"type":"string"},"type":"array","title":"Suppliers"},"office_locations":{"items":{"$ref":"#/components/schemas/OfficeLocation"},"type":"array","title":"Office Locations"}},"type":"object","title":"CompanyRecord"},"ComparisonEnvelope":{"properties":{"sides":{"items":{"$ref":"#/components/schemas/ComparisonSideEnvelope"},"type":"array","title":"Sides","description":"One per half of your question, in the order you asked."},"stronger":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stronger","description":"Index into `sides`, or `null` when no side is named.\n\n`null` is a real answer, not a missing one, and it covers more than a tie: if either count is approximate the two cannot be ranked against each other, because the difference between them may be smaller than the error on either. Both counts are still reported — read them rather than this field when it is `null`."},"comparable":{"type":"boolean","title":"Comparable","description":"`false` when the sides cannot be meaningfully weighed — one found nobody, or the counts are approximate. The sides are still returned; what is withheld is the comparison.","default":true},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"Applied to **both** sides. A comparison across two readings of *knows* is not a comparison.","default":"overlapping"}},"additionalProperties":false,"type":"object","title":"ComparisonEnvelope","description":"Two ways in, weighed against each other.\n\n**Both sides always come back, with their evidence.** Not a winner: a\ncomparison whose losing side is invisible cannot be checked, and the\ncommonest reason one side wins is that its company name resolved to\nsomething larger rather than to a better route in."},"ComparisonSideEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RelationshipHit"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"institutions":{"items":{"$ref":"#/components/schemas/SharedInstitution"},"type":"array","title":"Institutions"},"breakdown":{"anyOf":[{"$ref":"#/components/schemas/Breakdown"},{"type":"null"}],"description":"Present only when the question asked for a breakdown."},"share":{"anyOf":[{"$ref":"#/components/schemas/Share"},{"type":"null"}],"description":"Present only when the question asked for a proportion."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"Which definition of *knows* produced `number_of_contacts_overlapping_tenure_with`.\n\n`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point, which on a large employer counts everyone who ever passed through.\n\nEchoed because it changes what the number means, not by a little: one measured row counts 16,630 people under `overlapping` and 100,085 under `shared`.","default":"overlapping"},"span":{"type":"string","title":"Span","description":"The half of your question this side answers, in your own words.","default":""}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"ComparisonSideEnvelope","description":"One side of a comparison, as the ordinary relationship envelope.\n\nNot a bespoke shape: a side *is* a relationship answer, so a client that\nalready renders one renders this with no new code path, and\n`resolved_search` tells the reader which company this side actually\nresolved to — the commonest way a comparison misleads."},"Connection":{"properties":{"inst":{"type":"string","title":"Inst"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"`employment` — a shared employer — or `education`."},"match_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Confidence"},"their_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Their Role","description":"What the reachable person did there."},"their_started":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Their Started"},"their_ended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Their Ended","description":"Absent means still there."},"anchor_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchor Role","description":"What the person you asked through did there."},"anchor_started":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchor Started"},"anchor_ended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchor Ended"},"overlap_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Overlap Months","description":"Whole months the two were there at the same time.\n\nAbsent when either side's start date is unknown — not `0`, which would say they were never there together. That is a stronger claim than not knowing, and the difference matters: an overlap of three years and an overlap of one month are otherwise the same row."},"match_type":{"type":"string","title":"Match Type","description":"Why this counts as a connection, in words. Overlap-aware when the dates allow it — `\"Overlapped at Acme for 14 months\"` — and a plainer `\"Also worked at Acme\"` / `\"Attended Stanford University together\"` when either side's dates are unknown. The row's own top-level `match_type` is this same string, one per `how` entry, reordered by strength."}},"type":"object","required":["inst","match_type"],"title":"Connection","description":"How one reachable person knows the anchor, at one shared institution."},"Coverage":{"properties":{"universe":{"type":"integer","minimum":0.0,"title":"Universe","description":"Records matching the resolved query, counted, not sampled."},"universe_is_exact":{"type":"boolean","title":"Universe Is Exact","description":"False when the count hit a cap. Always serialized: a capped count presented as exact is the same lie as an unmeasured one."},"enumerated":{"type":"integer","minimum":0.0,"title":"Enumerated","description":"How many of them this answer carries."},"enumeration_recall":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Enumeration Recall","description":"`enumerated / universe`. Null when the universe was not exact, because a ratio over an estimate is not a recall figure. Note this measures coverage of the *resolved query*, not of the user's intent -- a wrong predicate can be exhaustively enumerated."},"universe_exhausted":{"type":"boolean","title":"Universe Exhausted","description":"Every matching record was returned and the count agrees. The claim an unbounded-corpus search engine cannot make.","default":false},"truncated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Truncated By","description":"Which limit stopped the enumeration short, when one did."},"constraints_unmet":{"items":{"type":"string"},"type":"array","title":"Constraints Unmet","description":"Requirements in your query that the search could not express, in your own words. Non-empty means part of the question was not answered -- most often because it needs a dataset this search cannot reach (job postings, employment history, patents, news, funding dates). When this is non-empty, `universe_exhausted` is withheld: 'we returned everything that matches' cannot be true of a question that was never asked."},"audited":{"type":"boolean","title":"Audited","description":"Whether the query was checked against the executed filter for dropped requirements. Reported because an empty `constraints_unmet` only means something if something looked.","default":false},"criteria":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Criteria","description":"Per criterion: evaluated, passed, success_rate, and whether it was *proven* by the query or *judged* by a model. Without this a thin result leaves the caller guessing which requirement thinned it."},"similarity":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Similarity","description":"Narrowings done by ranking rather than by predicate. Each entry carries the concept, how many ids it resolved to, the `k` asked for, whether the list was cut at that ceiling, and the fraction of candidates that could be compared at all. Non-empty means `universe_exhausted` is withheld on purpose: a cosine is a degree, so a top-k ranking has no complete state, and 2.9% of companies carry no embedding to compare."},"linkage":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Linkage","description":"One entry per other dataset this answer joined against: `corpus`, `join_key`, `observable`, `of_constrained`, `ratio`, `is_lower_bound`. `ratio` is the fraction of your matching accounts that dataset can even see -- measured at 5-60% depending on the dataset and how large the companies are, and never 100%. Non-empty therefore means `universe_exhausted` is withheld by construction: we returned everything reachable, and a dataset cannot see the rest."},"linkage_coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Linkage Coverage","description":"The joins combined, as a **product** rather than a minimum: two datasets seeing 27% and 24% of your accounts jointly see about 6.5%, not 24%. Null when no join was performed or when any leg's coverage is unknown."},"linkage_coverage_is_lower_bound":{"type":"boolean","title":"Linkage Coverage Is Lower Bound","description":"True when a key set was capped or coverage was estimated rather than measured, making `linkage_coverage` a floor. Narrowing the question makes it exact.","default":false}},"type":"object","required":["universe","universe_is_exact","enumerated"],"title":"Coverage","description":"How much of the addressable set this answer represents (`W-108`).\n\nThe differentiator, stated as data. Every agentic-search product answers \"here\nare some results\"; measured recall across the field runs 19-61% against 77-84%\nprecision, because an unbounded web has no denominator and nobody can say what\nwas missed. Ours is countable, so `universe` is a real number and\n`enumeration_recall` is a real fraction rather than a claim.\n\n`universe_exhausted` is the one thing a web-scale competitor structurally cannot\nreturn: every matching record was enumerated and the count agrees. It is never\ninferred from an agent's confidence -- it requires the enumeration and the count\nto match -- and the numbers that justify it ship beside it so a caller can check\nthe arithmetic instead of trusting the label."},"CoverageResponse":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/CoverageSegmentOut"},"type":"array","title":"Segments"},"not_in_index":{"items":{"type":"string"},"type":"array","title":"Not In Index","description":"What we know we do not have. Published deliberately — a coverage number without its holes invites exactly the question it cannot answer."},"as_of":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"As Of"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["segments","meta"],"title":"CoverageResponse"},"CoverageSegmentOut":{"properties":{"name":{"type":"string","title":"Name"},"category":{"$ref":"#/components/schemas/EntityCategory"},"total":{"type":"integer","title":"Total"},"with_embeddings":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"With Embeddings"},"with_domain":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"With Domain"},"freshest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Freshest"},"stalest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Stalest"}},"type":"object","required":["name","category","total"],"title":"CoverageSegmentOut"},"CreditsResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"scope":{"type":"string","enum":["platform","tenant_wide_fallback"],"title":"Scope","description":"`tenant_wide_fallback` means mint cannot yet attribute grants to a platform, so only `spendable` is answerable — `allocated` and `shared` are null. They are deliberately null rather than filled with the tenant-wide totals, which are not this platform's to report."},"allocated":{"anyOf":[{"$ref":"#/components/schemas/AllocatedCredits"},{"type":"null"}]},"shared":{"anyOf":[{"$ref":"#/components/schemas/SharedCredits"},{"type":"null"}]},"spendable":{"type":"number","title":"Spendable","description":"What this tenant can spend on this platform right now."},"as_of":{"type":"string","format":"date-time","title":"As Of"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["platform","scope","spendable","as_of","meta"],"title":"CreditsResponse"},"DateBound":{"properties":{"gte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gte"},"lte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lte"},"preset":{"anyOf":[{"$ref":"#/components/schemas/DatePreset"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"DateBound","description":"An inclusive date window, or a named relative preset.\n\nBounds accept ISO-8601 dates (`\"2024-01-01\"`) or Elasticsearch date math\n(`\"now-30d\"`, `\"now/M\"`). Both bounds are inclusive — `gt`/`lt` deliberately\ndo not exist on the wire."},"DatePreset":{"type":"string","enum":["last_7_days","last_30_days","last_90_days","last_6_months","last_year","last_3_years","last_5_years"],"title":"DatePreset","description":"Sugar for the common relative windows, as an alternative to gte/lte."},"Deal":{"properties":{"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"announced_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announced On"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"}},"type":"object","title":"Deal","description":"An acquisition the company made (`acquisitions`) or suffered (`acquired_by`)."},"Degradation":{"properties":{"reason":{"$ref":"#/components/schemas/DegradationReason"},"detail":{"type":"string","title":"Detail"},"impact":{"type":"string","enum":["recall","precision","freshness","fields"],"title":"Impact"},"source_corpus":{"anyOf":[{"$ref":"#/components/schemas/SourceCorpus"},{"type":"null"}]}},"type":"object","required":["reason","detail","impact"],"title":"Degradation","description":"What we could not do for this request, and what it cost the answer.\n\nAn empty list means we checked and nothing degraded. It never means\n\"unknown\" — a result set that quietly dropped a corpus is a result set that\nlies about its own coverage, which is the one thing this product is\npositioned against."},"DegradationReason":{"type":"string","enum":["vector_coverage_incomplete","lexical_scoring_unavailable","corpus_unavailable","corpus_timeout","field_not_indexed","mode_downgraded","billing_bypassed","pagination_truncated","axis_not_applicable","anchor_list_capped","planner_step_incomplete","upstream_advisory"],"title":"DegradationReason","description":"Why an answer is less than it should be.\n\nClosed, because a client that cannot branch on the reason can only show the\nuser a shrug. These are the honest constraints — partial vector coverage,\n`smry` mapped as `keyword` so it cannot be scored lexically, a federated\ncorpus being unreachable — surfaced at runtime instead of in a footnote."},"DepartmentHeadcountBound":{"properties":{"department":{"type":"string","minLength":1,"title":"Department"},"min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max"}},"additionalProperties":false,"type":"object","required":["department"],"title":"DepartmentHeadcountBound","description":"One department's headcount bound. Entries in a filter are ANDed."},"DepartmentHeadcountFilter":{"properties":{"bounds":{"items":{"$ref":"#/components/schemas/DepartmentHeadcountBound"},"type":"array","maxItems":1000,"minItems":1,"title":"Bounds"}},"additionalProperties":false,"type":"object","required":["bounds"],"title":"DepartmentHeadcountFilter","description":"Per-department headcount bounds. Every bound must be satisfied."},"DiscoverFilters":{"properties":{"geo":{"anyOf":[{"$ref":"#/components/schemas/GeoFilter"},{"type":"null"}]},"industry":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"sub_industry":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"b2b_b2c":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"product_service":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"naics":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"sic":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"profit_nonprofit":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"gov_nongov":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"industries_served":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"employee_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"founded_year":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"linkedin_followers":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"global_presence":{"anyOf":[{"$ref":"#/components/schemas/GlobalPresenceFilter"},{"type":"null"}]},"employee_by_department":{"anyOf":[{"$ref":"#/components/schemas/DepartmentHeadcountFilter"},{"type":"null"}]},"company":{"anyOf":[{"$ref":"#/components/schemas/EntityFilter"},{"type":"null"}]},"owned_by_organization":{"anyOf":[{"$ref":"#/components/schemas/EntityFilter"},{"type":"null"}]},"is_subsidiary":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"domain_presence":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"linkedin_presence":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"listing_status":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"stock_exchange":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"technology":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"company_keyword":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"keywords":{"anyOf":[{"$ref":"#/components/schemas/CompanyKeywordsFilter"},{"type":"null"}]},"funding_stage":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"investors":{"anyOf":[{"$ref":"#/components/schemas/EntityFilter"},{"type":"null"}]},"total_funding":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"last_funding_amount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"last_funding_date":{"anyOf":[{"$ref":"#/components/schemas/DateBound"},{"type":"null"}]},"hiring_role":{"anyOf":[{"$ref":"#/components/schemas/TextFilter"},{"type":"null"}]},"hiring_type":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"hiring_location":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"hiring_recency":{"anyOf":[{"$ref":"#/components/schemas/DateBound"},{"type":"null"}]},"seniority":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"governance_level":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"employment_type":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"has_direct_access_to_c_suite":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"department":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"title":{"anyOf":[{"$ref":"#/components/schemas/TextFilter"},{"type":"null"}]},"person":{"anyOf":[{"$ref":"#/components/schemas/TextFilter"},{"type":"null"}]},"skills":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"certifications":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"employment_history":{"anyOf":[{"$ref":"#/components/schemas/EmploymentHistoryFilter"},{"type":"null"}]},"university":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"degree":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"tenure":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"years_worked":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]},"last_job_changed":{"anyOf":[{"$ref":"#/components/schemas/DateBound"},{"type":"null"}]},"linkedin_connections":{"anyOf":[{"$ref":"#/components/schemas/RangeFilter"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"DiscoverFilters","description":"Every filter accepted for `category: company` and `category: person`.\n\nNames match prism's filter vocabulary exactly — this is a contract mirror,\nnot a re-design, so a name that reads oddly (`gov_nongov`) stays as it is\nrather than being prettied up into something prism would reject.\n\nWhich side a filter applies to is not encoded here: prism routes a\nperson-side filter through `has_child` when the search targets companies\n(and vice versa), so `seniority` is meaningful on a company search. The one\nhonest statement this model can make is which filters *exist*."},"DocumentEntitiesRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Ids"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Restrict the returned fields. Omit for the full record."}},"additionalProperties":false,"type":"object","required":["ids"],"title":"DocumentEntitiesRequest","description":"`POST /v1/entities/{patents,news,trends,market-reports,fundings,\nacademic-reports,job-openings}` (DEC-045). No `by` — none of these\ncategories has a domain/LinkedIn-URL/name identifier to resolve by.","examples":[{"ids":["a9f4c1e07d3b52c8","definitely_not_real"]}]},"DocumentFilterValuesResponse":{"properties":{"category":{"$ref":"#/components/schemas/EntityCategory"},"filter":{"type":"string","title":"Filter"},"values":{"items":{"type":"string"},"type":"array","title":"Values","description":"Empty for a filter with no fixed vocabulary — every range, and the free-text and entity filters. That is an answer, not a failure: those take values you supply."},"total":{"type":"integer","title":"Total","description":"Matches for `search`, or the whole vocabulary without one."},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size","description":"Always 20 — set upstream, not a parameter here."},"has_more":{"type":"boolean","title":"Has More"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["category","filter","values","total","page","page_size","has_more","meta"],"title":"DocumentFilterValuesResponse","description":"Same shape as :class:`FilterValuesResponse`, with two differences.\n\n`filter` is a plain string rather than :class:`FilterName`: that enum\nmirrors the company/person vocabulary, and mirroring a second one per\ndocument category is the duplication this route exists to remove. The\nengine validates the name and 404s a typo, which is a better place for the\ncheck than a copy of its vocabulary living here.\n\n`category` is echoed because the same filter name means different things on\ndifferent categories, so a response that did not say which one it answered\nfor would be ambiguous."},"DrillDownEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ReachHit"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"seeds":{"anyOf":[{"items":{"$ref":"#/components/schemas/SeedReach"},"type":"array"},{"type":"null"}],"title":"Seeds","description":"When the question ran through several named people: how many each one reaches on their own. `total` is then the sum of these — an upper bound, since somebody reachable by two of them counts twice."},"targets":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReachTarget"},"type":"array"},{"type":"null"}],"title":"Targets","description":"When the question reached into several companies: each one, what it resolved to and how many it holds. Rows are grouped by company in this order, each row's `target_index` says which, and `limit` applies per company. `total` is then the sum of these — exact, since one person has one current employer."},"institutions":{"items":{"$ref":"#/components/schemas/ReachInstitution"},"type":"array","title":"Institutions","description":"Every institution connecting the anchor to people at the target company, with how many people each one reaches. Describes the whole answer, not this page — the rows are a window, this is not."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point.\n\nEchoed because it decides which rows exist at all here, not just how a count is worded.","default":"overlapping"},"person_id":{"type":"string","title":"Person Id","description":"The `id` in `results` of the person this hangs under.","default":""}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"DrillDownEnvelope","description":"What one person from the first half can reach, as a reach envelope."},"EducationEntry":{"properties":{"school":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School"},"degree":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Degree"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","title":"EducationEntry"},"EmployeeRange":{"properties":{"min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max"}},"type":"object","title":"EmployeeRange"},"EmploymentEntry":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain"},"company_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Linkedin Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"is_primary":{"type":"boolean","title":"Is Primary","default":false}},"type":"object","title":"EmploymentEntry","description":"One job the person holds or held, newest start first. `is_primary` marks the current one."},"EmploymentHistoryFilter":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/EmploymentHistoryGroup"},"type":"array","maxItems":1000,"minItems":1,"title":"Groups"}},"additionalProperties":false,"type":"object","required":["groups"],"title":"EmploymentHistoryFilter","description":"Independently-scoped past-job conditions (filters v3)."},"EmploymentHistoryGroup":{"properties":{"company":{"anyOf":[{"$ref":"#/components/schemas/EntityFilter"},{"type":"null"}]},"title":{"anyOf":[{"$ref":"#/components/schemas/TermsFilter"},{"type":"null"}]},"role_started":{"anyOf":[{"$ref":"#/components/schemas/DateBound"},{"type":"null"}]},"role_ended":{"anyOf":[{"$ref":"#/components/schemas/DateBound"},{"type":"null"}]},"tenure_gte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Tenure Gte"},"tenure_lte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Tenure Lte"}},"additionalProperties":false,"type":"object","title":"EmploymentHistoryGroup","description":"One independently-scoped past job.\n\nMirrors `prism.schema.search.discover.EmploymentHistoryGroup` (filters\nv3, replaces the old `prior_company` field plus `title`/`tenure`'s\n`previous_*` sugar) — matched against its own `p_comp` array entry\nserver-side, so naming two groups requires two different entries, not\none shared row."},"EntityCategory":{"type":"string","enum":["company","person","patent","news_article","trend","market_report","funding_round","academic_report","job_opening"],"title":"EntityCategory","description":"*What* to search, and what a returned row is.\n\nOne parameter carries both, because they are the same fact: a search of\n`patent` returns patents. The alternative — a `source`/`vertical` selector\nbeside a narrower `category` — lets a caller ask for patents from the\npeople index, a combination that has no meaning and would need rejecting\nat runtime. A closed set that cannot express the contradiction is better\nthan a validator that catches it.\n\nValues are exactly prism's own row types, so `category` in the request and\n`results[].category` in the response are always the same string.\n\n`company` and `person` are the GTM index; the rest are separate corpora\nwith their own filters, freshness and coverage. Not everything applies\neverywhere: see `SearchRequest`, which rejects the GTM-only parameters\nrather than ignoring them.\n\n`job_opening` is a document corpus like `patent`/`news_article`/etc — a\nposting, not an entity — but its records carry a domain (the posting\ncompany's) all the same. It is deliberately **not** in `GTM_CATEGORIES`\n(that set is about the entity/document distinction, and a job posting is\nstill a document), but it *is* in `DOMAIN_FILTERABLE_CATEGORIES`, which\nexists specifically to separate those two axes."},"EntityFilter":{"properties":{"include":{"items":{"$ref":"#/components/schemas/EntityRef"},"type":"array","maxItems":1000,"title":"Include"},"exclude":{"items":{"$ref":"#/components/schemas/EntityRef"},"type":"array","maxItems":1000,"title":"Exclude"}},"additionalProperties":false,"type":"object","title":"EntityFilter","description":"Include / exclude over entities resolved from names, domains or ids."},"EntityHit_AcademicReportRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/AcademicReportRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[AcademicReportRecord]"},"EntityHit_CompanyRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/CompanyRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[CompanyRecord]"},"EntityHit_FundingRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/FundingRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[FundingRecord]"},"EntityHit_JobOpeningRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/JobOpeningRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[JobOpeningRecord]"},"EntityHit_MarketReportRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/MarketReportRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[MarketReportRecord]"},"EntityHit_NewsRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/NewsRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[NewsRecord]"},"EntityHit_PatentRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/PatentRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[PatentRecord]"},"EntityHit_PersonRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/PersonRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[PersonRecord]"},"EntityHit_TrendRecord_":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/EntityCategory"},"found":{"type":"boolean","title":"Found"},"matches":{"items":{"$ref":"#/components/schemas/TrendRecord"},"type":"array","title":"Matches"}},"type":"object","required":["id","category","found"],"title":"EntityHit[TrendRecord]"},"EntityRef":{"properties":{"value":{"type":"string","minLength":1,"title":"Value"},"by":{"anyOf":[{"$ref":"#/components/schemas/ResolveBy"},{"type":"null"}],"description":"Force a resolution mode. When omitted the server classifies the token."}},"additionalProperties":false,"type":"object","required":["value"],"title":"EntityRef","description":"One reference to an entity that needs resolution before querying."},"Envelope_EntityHit_AcademicReportRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_AcademicReportRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[AcademicReportRecord]]"},"Envelope_EntityHit_CompanyRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_CompanyRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[CompanyRecord]]"},"Envelope_EntityHit_FundingRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_FundingRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[FundingRecord]]"},"Envelope_EntityHit_JobOpeningRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_JobOpeningRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[JobOpeningRecord]]"},"Envelope_EntityHit_MarketReportRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_MarketReportRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[MarketReportRecord]]"},"Envelope_EntityHit_NewsRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_NewsRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[NewsRecord]]"},"Envelope_EntityHit_PatentRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_PatentRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[PatentRecord]]"},"Envelope_EntityHit_PersonRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_PersonRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[PersonRecord]]"},"Envelope_EntityHit_TrendRecord__":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntityHit_TrendRecord_"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[EntityHit[TrendRecord]]"},"Envelope_HistoryRunSummary_":{"properties":{"results":{"items":{"$ref":"#/components/schemas/HistoryRunSummary"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[HistoryRunSummary]"},"Envelope_dict_str__Any__":{"properties":{"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"Envelope[dict[str, Any]]"},"Environment":{"type":"string","enum":["live","test"],"title":"Environment"},"ErrorCode":{"type":"string","enum":["auth.unauthorized","auth.missing_key","auth.invalid_key","auth.expired","auth.insufficient_scope","auth.unavailable","auth.browser_origin","auth.invalid_credentials","auth.account_exists","auth.session_required","auth.csrf","auth.mfa_required","request.invalid","request.too_large","request.unsupported","relationship.anchor_ambiguous","history.not_found","feedback.subject_not_found","feedback.unavailable","journey.unavailable","enrichment.unavailable","lists.not_found","lists.item_cap_reached","lists.unavailable","export.not_enabled","cohort.not_offered","cohort.impersonation_cannot_answer","referral.already_claimed","referral.impersonation_cannot_claim","pagination.cursor_invalid","pagination.cursor_expired","pagination.depth_exceeded","idempotency.in_flight","idempotency.fingerprint_mismatch","quota.burst_exceeded","quota.daily_exhausted","quota.monthly_exhausted","quota.concurrency_exceeded","quota.entity_ceiling","credits.insufficient","credits.unavailable","credits.unknown_action","payment.invalid_amount","payment.forbidden","payment.unavailable","payment.declined","payment.no_method","payment.topup_not_found","upstream.unavailable","upstream.timeout","not_implemented","internal"],"title":"ErrorCode"},"ExpectedCorrection":{"properties":{"should_include":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Should Include"},"should_exclude":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Should Exclude"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","title":"ExpectedCorrection","description":"What the user thinks should have happened.\n\nThe most valuable field on the request. A rating says something was wrong; a\ncorrection says what right looks like, and only the second settles an\nargument or trains anything. Omitting it entirely means \"I don't know\",\nwhich is a legitimate answer and is stored as absent."},"FanOutEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RelationshipHit"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"institutions":{"items":{"$ref":"#/components/schemas/SharedInstitution"},"type":"array","title":"Institutions"},"breakdown":{"anyOf":[{"$ref":"#/components/schemas/Breakdown"},{"type":"null"}],"description":"Present only when the question asked for a breakdown."},"share":{"anyOf":[{"$ref":"#/components/schemas/Share"},{"type":"null"}],"description":"Present only when the question asked for a proportion."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"Which definition of *knows* produced `number_of_contacts_overlapping_tenure_with`.\n\n`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point, which on a large employer counts everyone who ever passed through.\n\nEchoed because it changes what the number means, not by a little: one measured row counts 16,630 people under `overlapping` and 100,085 under `shared`.","default":"overlapping"},"drill_downs":{"items":{"$ref":"#/components/schemas/DrillDownEnvelope"},"type":"array","title":"Drill Downs","description":"One per person that could be drilled into, in the same rank order as `results`. Shorter than `k` when a row carries no LinkedIn URL — see `skipped`, which is why a short list is never a claim that somebody can reach nobody."},"skipped":{"type":"integer","minimum":0.0,"title":"Skipped","description":"People in the top `k` that could not be drilled into. Reaching through somebody needs their LinkedIn URL, and a row without one is skipped rather than guessed at.","default":0},"k":{"type":"integer","minimum":1.0,"title":"K","description":"How many of the results were drilled into. Capped: each drill-down is a full search, so this is the one question whose cost multiplies.","default":3}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"FanOutEnvelope","description":"The people your first half asked for, each with what they can reach.\n\nThe first half's page is complete on its own: ignore `drill_downs` and this\nis exactly the answer the one-part question would have given you. That is\nwhat makes a failed drill-down survivable — it costs the extra, not the\nanswer."},"FeedbackCreated":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"target_verified":{"type":"boolean","title":"Target Verified"},"tag_vocab_version":{"type":"integer","title":"Tag Vocab Version","default":2}},"type":"object","required":["feedback_id","created_at","target_verified"],"title":"FeedbackCreated"},"FeedbackListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/FeedbackView"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total","default":0},"limit":{"type":"integer","title":"Limit","default":0},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","required":["results"],"title":"FeedbackListResponse"},"FeedbackRequest":{"properties":{"subject_ref":{"anyOf":[{"$ref":"#/components/schemas/SubjectRef"},{"type":"null"}],"description":"The search or run reported. Required unless `context` is 'help'."},"context":{"anyOf":[{"type":"string","const":"help"},{"type":"null"}],"title":"Context","description":"'help' for a general problem report from the dashboard's Help menu — about the product, not one search, so `subject_ref` may be omitted and `target.kind` must be 'result_set'."},"target":{"$ref":"#/components/schemas/FeedbackTarget"},"sentiment":{"type":"string","enum":["bad","good"],"title":"Sentiment","default":"bad"},"tags":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Tags"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Free text. Deliberately unbounded."},"expected":{"anyOf":[{"$ref":"#/components/schemas/ExpectedCorrection"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["target"],"title":"FeedbackRequest"},"FeedbackSubject":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"action_type":{"type":"string","title":"Action Type"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"status":{"type":"string","title":"Status"},"result_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Count"},"result_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Total"},"result_total_is_estimate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Result Total Is Estimate"},"run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Id"}},"type":"object","required":["query","action_type","occurred_at","status","result_count","run_id"],"title":"FeedbackSubject","description":"The run a report points at.\n\n**Read at request time, never copied onto the report.** The report records what\na user said; the run is a separate fact with its own 90-day retention. Storing\na copy would freeze a snapshot of something that expires on its own schedule,\nand the two would then disagree with nothing to say which was right.\n\nEvery field is what a triager asks before anything else: *what did they search\nfor, on which endpoint, and what came back?* Without them a report reads\n`wrong_entity · stripe.com · req_01JB…`, which nobody can act on."},"FeedbackTarget":{"properties":{"kind":{"type":"string","enum":["result","result_set"],"title":"Kind"},"entity_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Entity Id"},"entity_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Entity Type"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"FeedbackTarget"},"FeedbackView":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id"},"subject_kind":{"type":"string","title":"Subject Kind"},"subject_id":{"type":"string","title":"Subject Id"},"target_kind":{"type":"string","title":"Target Kind"},"target_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Entity Id"},"sentiment":{"type":"string","title":"Sentiment"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"tag_vocab_version":{"type":"integer","title":"Tag Vocab Version"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"expected":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Expected"},"target_verified":{"type":"boolean","title":"Target Verified"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"subject":{"anyOf":[{"$ref":"#/components/schemas/FeedbackSubject"},{"type":"null"}]}},"type":"object","required":["feedback_id","subject_kind","subject_id","target_kind","target_entity_id","sentiment","tags","tag_vocab_version","comment","expected","target_verified","status","created_at"],"title":"FeedbackView"},"FilterName":{"type":"string","enum":["country","state","city","region","industry","sub_industry","b2b_b2c","product_service","naics","sic","profit_nonprofit","gov_nongov","industries_served","employee_count","revenue","founded_year","linkedin_followers","global_presence","employee_by_department","company","owned_by_organization","is_subsidiary","domain_presence","linkedin_presence","listing_status","stock_exchange","technology","company_keyword","keywords","funding_stage","investors","total_funding","last_funding_amount","last_funding_date","hiring_role","hiring_type","hiring_location","hiring_recency","seniority","governance_level","employment_type","has_direct_access_to_c_suite","department","title","person","skills","certifications","employment_history","university","degree","tenure","years_worked","last_job_changed","linkedin_connections"],"title":"FilterName","description":"Filter names whose values can be looked up.\n\nEvery field of `DiscoverFilters` **except `geo`**, plus the four per-level\ngeo names. `geo` is a request-side directive spanning all four levels and\nhas no value list of its own; the four levels below are how you enumerate\nplaces, and each answer belongs in `geo.places[].value` with the matching\n`level`. Upstream 404s on `geo` for exactly this reason.\n\nA closed set rather than a validator: FastAPI turns it into a 422 that\nlists the accepted names and an OpenAPI enum callers can read, and neither\nof those is something a hand-written check gives you.\n\nKept explicit rather than derived from `DiscoverFilters.model_fields` so it\nstays readable in the generated schema; `tests/test_filters_schema.py`\nenforces that the two never diverge."},"FilterValueItem":{"properties":{"value":{"type":"string","title":"Value"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"type":"object","required":["value"],"title":"FilterValueItem","description":"A row with more than a name on it. Company only, today.\n\n`value` is what to put in the filter; `name` is what to show beside it. A\npicker that has these can render \"stripe (stripe.com)\" instead of asking\nsomeone to choose between two bare domains."},"FilterValuesResponse":{"properties":{"filter":{"$ref":"#/components/schemas/FilterName"},"values":{"items":{"type":"string"},"type":"array","title":"Values","description":"Empty for a filter with no fixed vocabulary — every range, and the free-text and entity filters. That is an answer, not a failure: those take values you supply."},"total":{"type":"integer","title":"Total","description":"Matches for `search`, or the whole vocabulary without one."},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size","description":"Always 20 — set upstream, not a parameter here."},"has_more":{"type":"boolean","title":"Has More"},"items":{"items":{"$ref":"#/components/schemas/FilterValueItem"},"type":"array","title":"Items","description":"Aligned with `values`, for the filters that have more than a name. Empty for the rest — read it when present, fall back to `values`."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["filter","values","total","page","page_size","has_more","meta"],"title":"FilterValuesResponse"},"FundingAmountNative":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","title":"FundingAmountNative"},"FundingCompany":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"employees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employees"},"total_funding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Funding"},"founded":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Founded"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"}},"type":"object","title":"FundingCompany"},"FundingInvestor":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_lead":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Lead"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","title":"FundingInvestor"},"FundingRecord":{"properties":{"funding_round_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Round Id"},"announced_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announced On"},"round_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Round Type"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"amount_native":{"anyOf":[{"$ref":"#/components/schemas/FundingAmountNative"},{"type":"null"}]},"company":{"anyOf":[{"$ref":"#/components/schemas/FundingCompany"},{"type":"null"}]},"investors":{"items":{"$ref":"#/components/schemas/FundingInvestor"},"type":"array","title":"Investors"},"company_trends":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Company Trends"}},"type":"object","title":"FundingRecord","description":"`company_profile` (11-array company enrichment block) is\ndeliberately not declared — it duplicates `/v1/entities/companies`,\nreachable via `company.domain` on this same record, at the same\ndepth. `source` (a scraping-provenance URL, not a funding source) is\ndropped for the same reason: not useful data, just left undeclared."},"FundingRound":{"properties":{"announced_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announced On"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"investors":{"items":{"type":"string"},"type":"array","title":"Investors"}},"type":"object","title":"FundingRound"},"GeoFilter":{"properties":{"places":{"items":{"$ref":"#/components/schemas/GeoPlace"},"type":"array","maxItems":1000,"minItems":1,"title":"Places"}},"additionalProperties":false,"type":"object","required":["places"],"title":"GeoFilter","description":"Unified geography — one filter for country, state, city and region."},"GeoLevel":{"type":"string","enum":["country","state","city","region"],"title":"GeoLevel"},"GeoPlace":{"properties":{"value":{"type":"string","minLength":1,"title":"Value"},"level":{"$ref":"#/components/schemas/GeoLevel","description":"Required: there is no place-name -> level resolver on the request path, so `berlin` is only a city because you said so."},"scope":{"$ref":"#/components/schemas/GeoScope","default":"subject"},"negate":{"type":"boolean","title":"Negate","description":"Exclude this place instead of requiring it.","default":false}},"additionalProperties":false,"type":"object","required":["value","level"],"title":"GeoPlace","description":"One place, pinned to a level and optionally to an entity side."},"GeoScope":{"type":"string","enum":["subject","company","person"],"title":"GeoScope","description":"Whose location a place constrains.\n\n`subject` (default) is whatever record type is being searched.\n`company`/`person` force that side regardless of the search target, which is\nwhat lets a contact search constrain the parent company's HQ."},"GlobalPresence":{"properties":{"hq_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hq Country"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"country_count":{"type":"integer","title":"Country Count","default":0}},"type":"object","title":"GlobalPresence","description":"The countries a company employs in — lowercase ISO3 codes, largest\nheadcount first. `hq_country` is null when the HQ country has no ISO3 entry."},"GlobalPresenceFilter":{"properties":{"countries":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Countries","description":"Countries (names or ISO3 codes) or regions (EU, APAC, Nordics, DACH, LATAM, ...)."},"match_all":{"type":"boolean","title":"Match All","description":"People in EVERY place named, not any one.","default":false},"gte":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Gte","description":"Per-country headcount floor."},"lte":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Lte"},"min_countries":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Min Countries"}},"additionalProperties":false,"type":"object","title":"GlobalPresenceFilter","description":"Country-footprint filter: where a company has people, not where it is headquartered.\n\n`countries` names the places: a country (\"germany\", ISO3 \"deu\") or a region (\"EU\", \"APAC\",\n\"Nordics\"), which any one of its member countries satisfies. A company matches with at least\n`gte` (default 1) people in ANY place named, or in EVERY place with `match_all` (\"offices in\nGermany and France\"). With `min_countries` instead, it matches companies present in at least\nthat many countries. Prism refuses a place it does not know with `request.invalid`."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HistoryMetricsBucket":{"properties":{"day":{"type":"string","format":"date-time","title":"Day"},"action_type":{"type":"string","title":"Action Type"},"requests":{"type":"integer","title":"Requests"},"ok":{"type":"integer","title":"Ok"},"failed":{"type":"integer","title":"Failed"},"pending":{"type":"integer","title":"Pending","default":0},"credits":{"type":"number","title":"Credits","description":"Credits, to at most three decimals."}},"type":"object","required":["day","action_type","requests","ok","failed","credits"],"title":"HistoryMetricsBucket"},"HistoryMetricsResponse":{"properties":{"period_from":{"type":"string","format":"date-time","title":"Period From"},"period_to":{"type":"string","format":"date-time","title":"Period To"},"total_requests":{"type":"integer","title":"Total Requests"},"total_ok":{"type":"integer","title":"Total Ok"},"total_failed":{"type":"integer","title":"Total Failed"},"total_pending":{"type":"integer","title":"Total Pending","default":0},"total_credits":{"type":"number","title":"Total Credits","description":"Credits, to at most three decimals."},"buckets":{"items":{"$ref":"#/components/schemas/HistoryMetricsBucket"},"type":"array","title":"Buckets"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["period_from","period_to","total_requests","total_ok","total_failed","total_credits","meta"],"title":"HistoryMetricsResponse","description":"Requests, outcomes and credits per day, over the caller's own runs.\n\nMirrors `UsageResponse`'s window-plus-totals shape. Credits are what the\nledger charged, so they agree with it by construction. `pending`\nruns are counted in `requests` and in neither outcome, so a success rate is\n`ok / (ok + failed)`."},"HistoryRunDetail":{"properties":{"id":{"type":"integer","title":"Id"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"action_type":{"type":"string","title":"Action Type","description":"The billable action, one of the `dsp.*` strings mint prices — searches by mode, similar, entities, relationships, and agent runs by effort tier — so history rows join cleanly against spend."},"actor_type":{"type":"string","title":"Actor Type","description":"`user` (a session) or `api_key`."},"environment":{"type":"string","title":"Environment"},"status":{"type":"string","enum":["pending","ok","failed"],"title":"Status"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Why a failed run failed. `incomplete`: the request never finished, so whatever it was charged stands. `unsettled`: an agent run no one read after its hold expired, which cost nothing."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"What makes the run recognisable: the search text, joined anchor values for /similar, joined ids for /entities/*, the company pair for /relationships, the run's query for agent runs."},"result_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Count"},"credits_charged":{"type":"number","title":"Credits Charged","description":"What the ledger charged, in credits to at most three decimals. A call is charged once its response is built, so a run that failed before that reads zero; one that failed after keeps its charge, as the ledger does. `0` for rows already paid for: a cursor sent again, or a request repeated with the same `Idempotency-Key` on the same UTC day. A pending run shows what it has cost so far."},"latency_ms":{"type":"integer","title":"Latency Ms"},"request":{"additionalProperties":true,"type":"object","title":"Request","description":"The original request body, minus the cursor — what a re-run posts."},"resolved_search":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Resolved Search"},"snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Snapshot"},"snapshot_state":{"type":"string","enum":["present","expired","omitted_too_large","absent","continuation"],"title":"Snapshot State"},"snapshot_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Snapshot Expires At"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["id","occurred_at","action_type","actor_type","environment","status","credits_charged","latency_ms","request","snapshot_state","meta"],"title":"HistoryRunDetail","description":"Everything the list omits — enough to replay the run for free.\n\n`snapshot` is the page-1 response envelope exactly as it was served.\n`expired`, `omitted_too_large`, `continuation` (a later page) and `absent`\n(pending and failed runs, and agent runs — which store none because their\nresults stay free to re-read) all serialize `snapshot: null`;\n`snapshot_state` says which, so the dashboard can offer a re-run instead of\nguessing."},"HistoryRunSummary":{"properties":{"id":{"type":"integer","title":"Id"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"action_type":{"type":"string","title":"Action Type","description":"The billable action, one of the `dsp.*` strings mint prices — searches by mode, similar, entities, relationships, and agent runs by effort tier — so history rows join cleanly against spend."},"actor_type":{"type":"string","title":"Actor Type","description":"`user` (a session) or `api_key`."},"environment":{"type":"string","title":"Environment"},"status":{"type":"string","enum":["pending","ok","failed"],"title":"Status"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Why a failed run failed. `incomplete`: the request never finished, so whatever it was charged stands. `unsettled`: an agent run no one read after its hold expired, which cost nothing."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"What makes the run recognisable: the search text, joined anchor values for /similar, joined ids for /entities/*, the company pair for /relationships, the run's query for agent runs."},"result_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Count"},"credits_charged":{"type":"number","title":"Credits Charged","description":"What the ledger charged, in credits to at most three decimals. A call is charged once its response is built, so a run that failed before that reads zero; one that failed after keeps its charge, as the ledger does. `0` for rows already paid for: a cursor sent again, or a request repeated with the same `Idempotency-Key` on the same UTC day. A pending run shows what it has cost so far."},"latency_ms":{"type":"integer","title":"Latency Ms"}},"type":"object","required":["id","occurred_at","action_type","actor_type","environment","status","credits_charged","latency_ms"],"title":"HistoryRunSummary","description":"One row of the history list. Light on purpose — no request, no\nresolved plan, no snapshot: the list is for recognising a run, the detail\nendpoint is for replaying it."},"ItemRefIn":{"properties":{"entity_category":{"$ref":"#/components/schemas/EntityCategory"},"entity_id":{"type":"string","maxLength":255,"minLength":1,"title":"Entity Id","description":"The record's natural id: a company's domain, a person's LinkedIn URL, a patent number, a DOI, a trend name, or the id a document lookup takes. Normalised on the way in (a domain is lower-cased and stripped of scheme and `www.`; a LinkedIn URL is reduced to `linkedin.com/in/<slug>`)."}},"additionalProperties":false,"type":"object","required":["entity_category","entity_id"],"title":"ItemRefIn"},"ItemsRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ItemRefIn"},"type":"array","minItems":1,"title":"Items"}},"additionalProperties":false,"type":"object","required":["items"],"title":"ItemsRequest"},"JobCompany":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"li_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Li Url"}},"type":"object","title":"JobCompany"},"JobDepartment":{"properties":{"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"sub_department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Department"}},"type":"object","title":"JobDepartment"},"JobLocation":{"properties":{"country":{"items":{"type":"string"},"type":"array","title":"Country"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"street_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street Address"}},"type":"object","title":"JobLocation"},"JobOpeningRecord":{"properties":{"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"department":{"$ref":"#/components/schemas/JobDepartment"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"employment_type":{"items":{"type":"string"},"type":"array","title":"Employment Type"},"work_arrangement":{"$ref":"#/components/schemas/JobWorkArrangement"},"location":{"$ref":"#/components/schemas/JobLocation"},"salary":{"anyOf":[{"$ref":"#/components/schemas/JobSalary"},{"type":"null"}]},"posted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posted At"},"last_modified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified At"},"company":{"$ref":"#/components/schemas/JobCompany"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"JobOpeningRecord"},"JobSalary":{"properties":{"low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Low"},"high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"as_reported":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Reported"}},"type":"object","title":"JobSalary"},"JobWorkArrangement":{"properties":{"remote":{"type":"boolean","title":"Remote","default":false},"hybrid":{"type":"boolean","title":"Hybrid","default":false}},"type":"object","title":"JobWorkArrangement"},"ListItemsResponse":{"properties":{"saved_list":{"$ref":"#/components/schemas/SavedListView"},"items":{"items":{"$ref":"#/components/schemas/SavedItemView"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"field_tier":{"type":"string","enum":["free","unlocked"],"title":"Field Tier"}},"type":"object","required":["saved_list","items","next_cursor","field_tier"],"title":"ListItemsResponse"},"ListName":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"additionalProperties":false,"type":"object","required":["name"],"title":"ListName"},"ListsResponse":{"properties":{"lists":{"items":{"$ref":"#/components/schemas/SavedListView"},"type":"array","title":"Lists"},"saved_items":{"type":"integer","title":"Saved Items","description":"Distinct entities saved across this workspace's lists."},"saved_items_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saved Items Cap","description":"This workspace's cap, or null when it has none (paid, or no cap set)."},"field_tier":{"type":"string","enum":["free","unlocked"],"title":"Field Tier"}},"type":"object","required":["lists","saved_items","saved_items_cap","field_tier"],"title":"ListsResponse"},"MarketReportRecord":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"published_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Date"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"body_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Free"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"}},"type":"object","title":"MarketReportRecord","description":"`tags` (report boilerplate, not a usable facet vocabulary),\n`token_counts`, and `obtained_at` are deliberately not declared —\npipeline artifacts, not report data."},"MemberResolveRequest":{"properties":{"email":{"type":"string","maxLength":320,"title":"Email","description":"The email to look up. Matched case-insensitively. There is no `tenant_id` field on purpose — the organisation is the credential's own, never the caller's choice."}},"additionalProperties":false,"type":"object","required":["email"],"title":"MemberResolveRequest"},"MemberResolveResponse":{"properties":{"found":{"type":"boolean","title":"Found","description":"True when this email belongs to a member of the credential's organisation. **False is an answer, not an error** — this route returns 200 for 'not a member', and reserves every non-2xx for 'could not determine'. A client that conflates the two will either refuse a colleague whenever auth-service blinks, or admit a stranger when it does."},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"email":{"type":"string","title":"Email"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"Their DSP role, or null if they have not been given one."},"state":{"type":"string","title":"State","description":"As `Member.state`. `unknown` when this email is not a member."},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["found","email","state","meta"],"title":"MemberResolveResponse"},"NamedDocumentEntitiesRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Ids"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Restrict the returned fields. Omit for the full record."},"by":{"type":"string","enum":["id","name"],"title":"By","description":"How to interpret `ids`: `\"name\"` (default) treats each entry as a free-text name — an article headline, a report title, a job posting's role, or the company a funding round belongs to — and looks it up the way you'd look up a trend by name. `\"id\"` treats each entry as a prism id, same as every other category. The `id` on a search hit is an opaque hash, not a prism id, so it does not resolve here.","default":"name"}},"additionalProperties":false,"type":"object","required":["ids"],"title":"NamedDocumentEntitiesRequest","description":"`POST /v1/entities/{news,market-reports,fundings,job-openings}`\n(DEC-052, DEC-053).\n\nThe four document categories with an external name/title distinct\nfrom their internal id (see the other three: a patent number, a trend\nname and a DOI already *are* the id, so they keep the plain\n`DocumentEntitiesRequest` above with no `by` at all).\n\nUnlike the id path, a name is not a unique key — `\"stripe\"` can be a\nreal hit on several funding rounds, and a job title like `\"Software\nEngineer\"` can hit hundreds of open postings. `EntityHit.matches`\n(`app/schemas/envelope.py`, DEC-055) is always a list; `by=\"name\"` is\nsimply the mode where it can hold more than one entry, while `by=\"id\"`\nalways resolves to exactly one. Job-openings' `matches` are ordered\nmost-recent-first rather than by match score, the one place this\ncategory's `by=\"name\"` diverges from the others.","examples":[{"by":"name","ids":["stripe"]},{"by":"id","ids":["a9f4c1e07d3b52c8"]}]},"NewsCompanyLinks":{"properties":{"direct_link":{"items":{"$ref":"#/components/schemas/NewsCompanyRef"},"type":"array","title":"Direct Link"},"linked":{"items":{"$ref":"#/components/schemas/NewsCompanyRef"},"type":"array","title":"Linked"}},"type":"object","title":"NewsCompanyLinks","description":"Both groups are real links — the NER `name_match` signal (dominated\nby stock-phrase false positives) is never returned; see prism's own\n`NewsCompanyLinks` for the matching source-side removal."},"NewsCompanyRef":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"NewsCompanyRef"},"NewsPlaces":{"properties":{"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"cities":{"items":{"type":"string"},"type":"array","title":"Cities"}},"type":"object","title":"NewsPlaces"},"NewsPublication":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"popularity_rank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popularity Rank"}},"type":"object","title":"NewsPublication"},"NewsRecord":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"publication":{"anyOf":[{"$ref":"#/components/schemas/NewsPublication"},{"type":"null"}]},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"companies":{"anyOf":[{"$ref":"#/components/schemas/NewsCompanyLinks"},{"type":"null"}]},"products":{"items":{"type":"string"},"type":"array","title":"Products"},"places":{"anyOf":[{"$ref":"#/components/schemas/NewsPlaces"},{"type":"null"}]},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","title":"NewsRecord","description":"`stats` (word count), `links` (outbound-link scrape), and\n`headings` (h1/h2/h3 scrape) are deliberately not declared — scraper\nartifacts, not article content a caller is looking for."},"OfficeLocation":{"properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","title":"OfficeLocation"},"OrgChartCell":{"properties":{"department":{"type":"string","title":"Department"},"seniority":{"type":"string","title":"Seniority"},"count":{"type":"integer","minimum":0.0,"title":"Count"}},"type":"object","required":["department","seniority","count"],"title":"OrgChartCell","description":"One department x seniority count. Absent pairs are zero, not listed."},"OrgChartCity":{"properties":{"city":{"type":"string","title":"City"},"count":{"type":"integer","minimum":0.0,"title":"Count"}},"type":"object","required":["city","count"],"title":"OrgChartCity"},"OrgChartCompany":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"}},"type":"object","title":"OrgChartCompany","description":"Which company answered, echoed as the identifier that resolved it.\n\nBoth keys are always present and exactly one is set — whichever the\nrequest carried. The domain is echoed normalized, so a pasted URL comes\nback as the host the counts are actually for, and it is `null` on the\nLinkedIn path because a company reached that way generally has no domain\nat all. The internal id used upstream is deliberately not here."},"OrgChartCountry":{"properties":{"country":{"type":"string","title":"Country"},"count":{"type":"integer","minimum":0.0,"title":"Count"},"states":{"items":{"$ref":"#/components/schemas/OrgChartState"},"type":"array","title":"States"}},"type":"object","required":["country","count","states"],"title":"OrgChartCountry"},"OrgChartDepartment":{"properties":{"name":{"type":"string","title":"Name"},"headcount":{"type":"integer","minimum":0.0,"title":"Headcount"},"sub_departments":{"items":{"$ref":"#/components/schemas/OrgChartSubDepartment"},"type":"array","title":"Sub Departments"}},"type":"object","required":["name","headcount","sub_departments"],"title":"OrgChartDepartment","description":"One department, broken into sub-departments."},"OrgChartDepartmentsRequest":{"properties":{"domain":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Domain","description":"The company's domain. A pasted URL is accepted and reduced to its host, so `https://www.stripe.com/about` and `stripe.com` are the same request. Give this or `linkedin_url`, not both."},"linkedin_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Linkedin Url","description":"The company's LinkedIn page, e.g. `linkedin.com/company/stripe`. Use it when the record carries no domain, which is common. A personal profile or a `/school/` page is refused: neither is a company with an org chart."},"country":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Country","description":"Case-insensitive; OR within the level and AND across levels, so `country=[Netherlands]` with `city=[Amsterdam]` means both. Send `__unknown__` to match people with no country recorded. The values come from `POST /v1/org-chart/locations`."},"state":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"State","description":"As `country`. `__unknown__` matches an absent state."},"city":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"City","description":"As `country`. `__unknown__` matches an absent city."},"governance_level":{"items":{"type":"string","enum":["Founder","Co Founder","Owner","Partner","Board Member","Investor","Advisor"]},"type":"array","title":"Governance Level","description":"Founders, owners, board members and advisors. Orthogonal to seniority rather than a level of it."},"employment_type":{"items":{"type":"string","enum":["Full Time","Part Time","Freelancer","Contractor","Consultant (External)"]},"type":"array","title":"Employment Type","description":"How the person is engaged. Orthogonal to seniority."},"has_direct_access_to_c_suite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Direct Access To C Suite","description":"Tri-state. `true` keeps only people the corpus marks as having direct access, `false` only those it marks as not, and omitting it filters on neither — the three answer different questions, because people with no value recorded match neither `true` nor `false`."}},"additionalProperties":false,"type":"object","title":"OrgChartDepartmentsRequest","description":"`POST /v1/org-chart/departments`.","examples":[{"domain":"stripe.com"},{"linkedin_url":"linkedin.com/company/stripe"}]},"OrgChartDepartmentsResponse":{"properties":{"company":{"$ref":"#/components/schemas/OrgChartCompany"},"departments":{"items":{"$ref":"#/components/schemas/OrgChartDepartment"},"type":"array","title":"Departments","description":"Departments with people, headcount descending. A department whose name is absent from `POST /v1/org-chart`'s `departments` can appear here: that route relabels onto a closed taxonomy and this one reports what is stored."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["company","departments","meta"],"title":"OrgChartDepartmentsResponse","description":"The sub-department breakdown.\n\nNo `total`: the upstream counts departments here and not the company, and\nsumming the departments would invent a headcount that excludes everyone it\ncould not place. `POST /v1/org-chart` is where the total lives."},"OrgChartLocationsRequest":{"properties":{"domain":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Domain","description":"The company's domain. A pasted URL is accepted and reduced to its host, so `https://www.stripe.com/about` and `stripe.com` are the same request. Give this or `linkedin_url`, not both."},"linkedin_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Linkedin Url","description":"The company's LinkedIn page, e.g. `linkedin.com/company/stripe`. Use it when the record carries no domain, which is common. A personal profile or a `/school/` page is refused: neither is a company with an org chart."},"search":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Search","description":"Case-insensitive substring over all three levels, for typeahead. It filters *people*, not labels, so a match on a city keeps that city's country and state in the tree with counts reduced to the matching people."}},"additionalProperties":false,"type":"object","title":"OrgChartLocationsRequest","description":"`POST /v1/org-chart/locations`.\n\nNo people filters. This route *is* the location vocabulary, so filtering it\nby location would be asking it to describe the answer you already have.","examples":[{"domain":"stripe.com","search":"amst"},{"linkedin_url":"linkedin.com/company/stripe"}]},"OrgChartLocationsResponse":{"properties":{"company":{"$ref":"#/components/schemas/OrgChartCompany"},"locations":{"items":{"$ref":"#/components/schemas/OrgChartCountry"},"type":"array","title":"Locations","description":"Countries with people, in the upstream's order. Labels are the corpus's own casing; `__unknown__` names the people with no value at that level, and is accepted back as a filter."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["company","locations","meta"],"title":"OrgChartLocationsResponse","description":"Where the company's people are.\n\nA count at every level, because a country's count is not the sum of its\nstates: someone with a country and no state is counted at the country and\nin no state below it."},"OrgChartRequest":{"properties":{"domain":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Domain","description":"The company's domain. A pasted URL is accepted and reduced to its host, so `https://www.stripe.com/about` and `stripe.com` are the same request. Give this or `linkedin_url`, not both."},"linkedin_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Linkedin Url","description":"The company's LinkedIn page, e.g. `linkedin.com/company/stripe`. Use it when the record carries no domain, which is common. A personal profile or a `/school/` page is refused: neither is a company with an org chart."},"country":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Country","description":"Case-insensitive; OR within the level and AND across levels, so `country=[Netherlands]` with `city=[Amsterdam]` means both. Send `__unknown__` to match people with no country recorded. The values come from `POST /v1/org-chart/locations`."},"state":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"State","description":"As `country`. `__unknown__` matches an absent state."},"city":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"City","description":"As `country`. `__unknown__` matches an absent city."},"governance_level":{"items":{"type":"string","enum":["Founder","Co Founder","Owner","Partner","Board Member","Investor","Advisor"]},"type":"array","title":"Governance Level","description":"Founders, owners, board members and advisors. Orthogonal to seniority rather than a level of it."},"employment_type":{"items":{"type":"string","enum":["Full Time","Part Time","Freelancer","Contractor","Consultant (External)"]},"type":"array","title":"Employment Type","description":"How the person is engaged. Orthogonal to seniority."},"has_direct_access_to_c_suite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Direct Access To C Suite","description":"Tri-state. `true` keeps only people the corpus marks as having direct access, `false` only those it marks as not, and omitting it filters on neither — the three answer different questions, because people with no value recorded match neither `true` nor `false`."},"include_others":{"type":"boolean","title":"Include Others","description":"Count the people the upstream could not classify onto an axis. Off by default: an `Others` row is usually large, always undrillable, and would otherwise lead the chart.","default":false}},"additionalProperties":false,"type":"object","title":"OrgChartRequest","description":"`POST /v1/org-chart`.","examples":[{"domain":"stripe.com"},{"linkedin_url":"linkedin.com/company/stripe"},{"country":["Netherlands"],"domain":"stripe.com","employment_type":["Full Time"]}]},"OrgChartResponse":{"properties":{"company":{"$ref":"#/components/schemas/OrgChartCompany"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Everyone at the company under the filters. `sum(cells.count)` is not the headcount and can differ either way: people the corpus could not place on either axis are counted here and appear in no cell, while a person with several departments or seniorities is counted once here and in each of their cells. Read this as the headcount and the cells as the classified breakdown."},"departments":{"items":{"type":"string"},"type":"array","title":"Departments","description":"Row order: headcount descending, with the leftover buckets (`Others`, `General`) last however large they are."},"seniorities":{"items":{"type":"string"},"type":"array","title":"Seniorities","description":"Column order: C-Suite, VP, Director / Head, Manager, IC, Entry, In Training, then `Others`. A fixed ladder, not a frequency order, so two companies' charts read the same way."},"cells":{"items":{"$ref":"#/components/schemas/OrgChartCell"},"type":"array","title":"Cells"},"department_totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Department Totals","description":"Per-row totals. Not the sum of that row's cells: someone with a department and no seniority is counted here and in no cell."},"seniority_totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Seniority Totals","description":"Per-column totals, with the same caveat as `department_totals`."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["company","total","departments","seniorities","cells","department_totals","seniority_totals","meta"],"title":"OrgChartResponse","description":"The grid."},"OrgChartState":{"properties":{"state":{"type":"string","title":"State"},"count":{"type":"integer","minimum":0.0,"title":"Count"},"cities":{"items":{"$ref":"#/components/schemas/OrgChartCity"},"type":"array","title":"Cities"}},"type":"object","required":["state","count","cities"],"title":"OrgChartState"},"OrgChartSubDepartment":{"properties":{"name":{"type":"string","title":"Name","description":"The sub-function's name, or `Uncategorized` for people in the department with no sub-function recorded."},"headcount":{"type":"integer","minimum":0.0,"title":"Headcount"},"seniority_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Seniority Counts","description":"Counts by seniority within this sub-department. Keys are the upstream's raw labels, so `Uncategorized` appears here where the grid says `Others` — the two routes aggregate different fields and their vocabularies are not merged."}},"type":"object","required":["name","headcount","seniority_counts"],"title":"OrgChartSubDepartment","description":"One sub-department, with its own seniority breakdown."},"Organisation":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"type":"object","title":"Organisation","description":"A parent or subsidiary, with the relationship's type."},"PatentApplicant":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"country":{"anyOf":[{"$ref":"#/components/schemas/PatentCountry"},{"type":"null"}]},"company_connection":{"anyOf":[{"$ref":"#/components/schemas/PatentCompanyConnection"},{"type":"null"}]}},"type":"object","title":"PatentApplicant"},"PatentApplication":{"properties":{"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"filed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filed"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code"},"office":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office"},"office_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office Name"}},"type":"object","title":"PatentApplication"},"PatentClassificationDetail":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Definition"}},"type":"object","title":"PatentClassificationDetail"},"PatentCompanyConnection":{"properties":{"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"}},"type":"object","title":"PatentCompanyConnection"},"PatentCountry":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"PatentCountry"},"PatentInventor":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"PatentInventor"},"PatentPriorityFiling":{"properties":{"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}},"type":"object","title":"PatentPriorityFiling"},"PatentPublication":{"properties":{"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code"},"granted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"PatentPublication"},"PatentRecord":{"properties":{"patent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Patent Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"abstract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abstract"},"status":{"anyOf":[{"type":"string","enum":["granted","applied","unknown"]},{"type":"null"}],"title":"Status"},"granted_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted Date"},"application":{"anyOf":[{"$ref":"#/components/schemas/PatentApplication"},{"type":"null"}]},"family_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Number"},"applicants":{"items":{"$ref":"#/components/schemas/PatentApplicant"},"type":"array","title":"Applicants"},"inventors":{"items":{"$ref":"#/components/schemas/PatentInventor"},"type":"array","title":"Inventors"},"classification":{"items":{"type":"string"},"type":"array","title":"Classification"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"publications":{"items":{"$ref":"#/components/schemas/PatentPublication"},"type":"array","title":"Publications"},"priority":{"items":{"$ref":"#/components/schemas/PatentPriorityFiling"},"type":"array","title":"Priority"},"classification_detail":{"items":{"$ref":"#/components/schemas/PatentClassificationDetail"},"type":"array","title":"Classification Detail"}},"type":"object","title":"PatentRecord"},"PeopleConstraints":{"properties":{"department":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Department","description":"Department (Function) labels, the same vocabulary the org chart uses: one of the 23 Function names, or the `General` / `Others` sentinels. Renamed as of 2026-08 — e.g. `Engineering / Software` (was `Engineering & Technical`), `IT & Infrastructure` (was `Information Technology`), `Human Resources / People`, `Medical & Health`, `Legal, Risk & Compliance`. `Data, Analytics & AI` and `Security` are now their own Functions rather than children of engineering and IT."},"seniority":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Seniority","description":"Seniority levels. Exactly 7 values, most senior first: `C-Suite`, `VP`, `Director / Head`, `Manager`, `IC`, `Entry`, `In Training`. Note `Director` and `Head` are ONE level, spelled `Director / Head`. The pre-2026-08 vocabulary (`C Suite` without the hyphen, `Director`, `Head`, `Senior`, `President`, `Intern`, `Founder`, `Owner`, `Partner`, `Investor`, `Advisor`, `Consultant`, `Freelancer`, `Educator`, `Healthcare Professional`, `Utility Worker`, `Speciality Service Provider`, `Unemployed`) is no longer indexed and matches nothing. Founder / Owner / Partner / Investor / Advisor are governance roles and Consultant / Freelancer are employment types; neither is filterable on this axis, and the remaining four are departments, not levels."},"country":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Country"}},"additionalProperties":false,"type":"object","title":"PeopleConstraints","description":"Which people on one side of a relationship count.\n\nThese hang off a company rather than off the request, because a\nrelationship has two sides and they are constrained independently.\n\"Directors at Acme who know anyone at Globex\" and \"anyone at Acme who knows\ndirectors at Globex\" are different questions, and a request-level seniority\nfilter cannot tell them apart — it would constrain both at once.\n\nOnly three axes, because the affiliation corpus carries only three. It holds\nno firmographics, so industry, headcount, funding and technology cannot be\napplied to the people on a relationship at all. They are rejected rather\nthan ignored: `POST /v1/search` is where those questions belong."},"PersonEntitiesRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"minItems":1,"title":"Ids"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Restrict the returned fields. Omit for the full record."},"by":{"anyOf":[{"type":"string","enum":["auto","li_url","name"]},{"type":"null"}],"title":"By","description":"When set, `ids` are raw identifier values instead of prism's internal id: `auto` classifies each one independently (mirrors the anchor detection `/v1/similar` uses); any other value forces every entry to that one kind. Omit for the default: `ids` are prism ids. The `id` on a search or similar hit is not a prism id (it is the company's domain or an opaque 16-hex hash), so look a hit up by its own fields instead: a company with `by: domain` and its `domain`, a person with `by: li_url` and its `linkedin_url`."}},"additionalProperties":false,"type":"object","required":["ids"],"title":"PersonEntitiesRequest","description":"`POST /v1/entities/persons` (DEC-045). No `domain` in `by` — a person\nhas no domain, so the Literal itself refuses it, no validator needed.","examples":[{"fields":["contact_name","title","seniority"],"ids":["00871f2ea4c39b06"]},{"by":"li_url","ids":["https://www.linkedin.com/in/example-person"]}]},"PersonRecord":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"cmp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cmp Id"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"sub_department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Department"},"skills":{"items":{"type":"string"},"type":"array","title":"Skills"},"certifications":{"items":{"type":"string"},"type":"array","title":"Certifications"},"prior_company":{"items":{"type":"string"},"type":"array","title":"Prior Company"},"university":{"items":{"type":"string"},"type":"array","title":"University"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"region":{"items":{"type":"string"},"type":"array","title":"Region"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"sub_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Industry"},"other_industries":{"items":{"type":"string"},"type":"array","title":"Other Industries"},"revenue":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue"},"employee_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Count"},"employee_range":{"anyOf":[{"$ref":"#/components/schemas/EmployeeRange"},{"type":"null"}]},"global_presence":{"anyOf":[{"$ref":"#/components/schemas/GlobalPresence"},{"type":"null"}]},"linkedin_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linkedin Followers"},"founded_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founded Year"},"total_funding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Funding"},"last_funding_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Funding Amount"},"last_funding_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Funding Date"},"funding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Stage"},"business_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Classification"},"ownership":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership"},"profit_non_profit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profit Non Profit"},"govt_non_govt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Govt Non Govt"},"technology":{"items":{"type":"string"},"type":"array","title":"Technology"},"naics":{"items":{"type":"string"},"type":"array","title":"Naics"},"sic":{"items":{"type":"string"},"type":"array","title":"Sic"},"company_keyword":{"items":{"type":"string"},"type":"array","title":"Company Keyword"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"job_openings":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Job Openings"},"account_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account City"},"account_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account State"},"account_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Country"},"account_region":{"items":{"type":"string"},"type":"array","title":"Account Region"},"account_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Location"},"company_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Linkedin Url"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"employment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employment Type"},"linkedin_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linkedin Connections"},"position_start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Start Date"},"has_direct_access_to_c_suite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Direct Access To C Suite"},"governance_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Governance Level"},"employment_history":{"items":{"$ref":"#/components/schemas/EmploymentEntry"},"type":"array","title":"Employment History"},"education":{"items":{"$ref":"#/components/schemas/EducationEntry"},"type":"array","title":"Education"},"certification_details":{"items":{"$ref":"#/components/schemas/CertificationDetail"},"type":"array","title":"Certification Details"},"company":{"anyOf":[{"$ref":"#/components/schemas/CompanyRecord"},{"type":"null"}]}},"type":"object","title":"PersonRecord","description":"Employer firmographics are merged inline (`account_`-prefixed /\n`company_linkedin_url`), same flat shape prism has always returned —\nsee `CompanyRecord` for what each of those means. They are now filled from\nthe person's parent company, and the complete parent record also arrives\nnested as `company` (null when the parent is missing). New callers should\nread `company`; the flat employer keys are the older way to the same facts."},"Problem":{"properties":{"type":{"type":"string","title":"Type","description":"Absolute URI for this error class."},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"code":{"$ref":"#/components/schemas/ErrorCode","description":"Machine-readable, closed set."},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"instance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra","description":"Error-specific fields."}},"type":"object","required":["type","title","status","code"],"title":"Problem","description":"The response body. Served as `application/problem+json`."},"Product":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"Product"},"RangeFilter":{"properties":{"gte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Gte"},"lte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Lte"}},"additionalProperties":false,"type":"object","title":"RangeFilter","description":"Inclusive numeric range. Either bound may be omitted (half-open).\n\n`int | float` rather than plain `float` so integral filters (`founded_year`,\n`employee_count`) keep their integer form all the way to Elasticsearch\ninstead of arriving as `2015.0`."},"ReachEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ReachHit"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"seeds":{"anyOf":[{"items":{"$ref":"#/components/schemas/SeedReach"},"type":"array"},{"type":"null"}],"title":"Seeds","description":"When the question ran through several named people: how many each one reaches on their own. `total` is then the sum of these — an upper bound, since somebody reachable by two of them counts twice."},"targets":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReachTarget"},"type":"array"},{"type":"null"}],"title":"Targets","description":"When the question reached into several companies: each one, what it resolved to and how many it holds. Rows are grouped by company in this order, each row's `target_index` says which, and `limit` applies per company. `total` is then the sum of these — exact, since one person has one current employer."},"institutions":{"items":{"$ref":"#/components/schemas/ReachInstitution"},"type":"array","title":"Institutions","description":"Every institution connecting the anchor to people at the target company, with how many people each one reaches. Describes the whole answer, not this page — the rows are a window, this is not."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point.\n\nEchoed because it decides which rows exist at all here, not just how a count is worded.","default":"overlapping"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"ReachEnvelope","description":"`Envelope[ReachHit]`, the institutions behind it, and what *knows* meant.\n\n`institutions` summarises what the rows spell out one person at a time —\n\"everyone you reach here, you reach through Microsoft and Stanford\" — and it\ndescribes the whole answer rather than this page, so a caller does not have\nto walk every page and union each row's `how` to reconstruct it."},"ReachHit":{"properties":{"id":{"type":"string","title":"Id","description":"Use with `POST /v1/entities/persons` for the full record."},"category":{"$ref":"#/components/schemas/EntityCategory","default":"person"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"how":{"items":{"$ref":"#/components/schemas/Connection"},"type":"array","title":"How","description":"Why this person is reachable. Never empty on a returned row — sharing something with the anchor is the only reason they are here."},"match_type":{"items":{"type":"string"},"type":"array","title":"Match Type","description":"Every reason this person is reachable, as a phrase — `array[0]` is the strongest connection. A longer, known overlap outranks an unknown-duration one. Each entry corresponds 1:1 to a `how` entry's own `match_type`, reordered by strength rather than by `how`'s own order, which reflects fetch order, not connection quality."},"reached_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reached By","description":"When the question ran through several named people: which of them (by person id) can reach this person."},"target_index":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Target Index","description":"When the question reached into several companies: which one this person is at, as an index into the envelope's `targets`."}},"type":"object","required":["id"],"title":"ReachHit","description":"One person reachable through the anchor, and how."},"ReachInstitution":{"properties":{"id":{"type":"string","title":"Id","description":"The institution's key in the affiliation corpus. The same value `POST /v1/relationships` returns, and the value to send back as an `institutions[]` anchor there to narrow to this one."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"`employment` — a shared employer — or `education`."},"match_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Confidence","description":"How this institution was identified: `url` from a canonical LinkedIn URL, `edu` from a school record, or `name` from a normalised name. `name` matches are a genuinely weaker signal, because names are not unique."},"people_at_target":{"type":"integer","title":"People At Target","description":"Distinct people at the target company reachable through this institution.\n\nAlways a real count, never null: an institution nobody is behind is not returned at all. Read it together with the envelope's `connection_basis` — under `shared` a large former employer counts everyone who ever passed through it, so the same institution can count an order of magnitude higher than under `overlapping`.","default":0}},"type":"object","required":["id"],"title":"ReachInstitution","description":"An institution the anchor shares with people at the target company.\n\nDeliberately *not* `SharedInstitution`, which carries a count per company.\nA reach question has one anchor *person* facing one target company, so the\nanchor's own count would be `1` on every row — a number that reads as a\nmeasurement while only ever restating the shape of the question, and one a\ncaller would reasonably trust because the count beside it is real.\n\nSo one count, of the side that varies. Everything else matches\n`SharedInstitution` on purpose: a client that already renders a bridge list\nneeds no second code path for this one."},"ReachTarget":{"properties":{"index":{"type":"integer","minimum":0.0,"title":"Index","description":"Rows at this company carry the same `target_index`."},"value":{"type":"string","title":"Value","description":"The company as the question named it."},"cid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cid","description":"The company it resolved to."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"What it resolved to, by name. Read this before trusting a zero."},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"People reachable at this company.","default":0},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","default":false},"same_as":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Same As","description":"Set when this name resolved to the same company as an earlier target. That company was reached once; its rows and total are under the `index` this points to, and this entry holds none of its own."}},"additionalProperties":false,"type":"object","required":["index","value"],"title":"ReachTarget","description":"One of several companies a reach question reached into."},"RelationKind":{"type":"string","enum":["between_companies","via_institution"],"title":"RelationKind","description":"Which relationship question `POST /v1/relationships` is answering.\n\nClosed set — it appears in `resolved_search.filters.relation`.\n\nNamed for the *question*, not for the upstream's internal query shapes.\nPrism has its own vocabulary for how a relationship is executed, several\nmembers of which are the same question asked from a different angle; a\npublic enum that tracks an internal one becomes a breaking change the first\ntime the internal one is refactored. The mapping lives in\n`app/retrieval/prism.py` and is this contract's business, not the caller's.\n\nBoth are *bridge* questions: people at one company who share an\ninstitution — a former employer, or a school — with the other side. None of\nthem answers \"one person who worked at both A and B\". That question is not\nexpressible on the affiliation corpus at all, because the field naming a\nperson's employer holds their single current one, denormalized onto every\nedge; a query written against it matches nobody and reads as \"no such\npeople\". Asking for it is a 422, not an empty page."},"RelationshipAskRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"The question, in words. Any kind of relationship question:\n\n- *who at Adyen do we know from Stripe* — people who bridge two companies\n- *is there anyone at Canva who used to work with Melanie Perkins* — who one named person can reach\n- *what do Stripe and Adyen people have in common* — the shared employers and schools themselves\n\nWhich of the three it turns out to be is worked out for you and reported back as `route`. A question this corpus cannot answer is refused with the reason and, where there is one, the endpoint that does answer it — never answered narrowly."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Page on. The cursor carries the plan that was worked out for your question, so paging never re-reads the sentence and never charges for interpreting it twice."}},"additionalProperties":false,"type":"object","required":["query"],"title":"RelationshipAskRequest","description":"`POST /v1/relationships/ask` — a relationship question in words.\n\nDeliberately three fields. This is the sentences-only surface: every\nstructural knob lives on the three typed routes, and adding them here would\nrecreate the thing it exists to remove — a caller having to know which\nendpoint answers their question before they can ask it.\n\nA new route rather than a widened `POST /v1/relationships`, for three reasons\nthat each stand alone. The cursor fingerprint is a hash over the whole\nserialised body, so **any** field added to that request invalidates every\ncursor in flight. The three routes return genuinely different shapes, and\nthat route's typed response model is a contract worth keeping. And a new\nroute carries its own billing action from the first day rather than having a\nprice split retrofitted onto a flat one."},"RelationshipCompany":{"properties":{"value":{"type":"string","maxLength":300,"minLength":1,"title":"Value"},"by":{"type":"string","enum":["auto","name","domain","li_url","id"],"title":"By","description":"How to read `value`. `auto` infers it from the value's shape — `stripe.com` is a domain, `linkedin.com/company/stripe` a LinkedIn URL, `Stripe` a name — using the same detection `/v1/similar` and `/v1/entities` use.\n\nSet it explicitly to override. Prefer `domain` or `li_url` when you have one: `name` is not a unique key, so it resolves to the best-ranked candidate and 377 companies are called `stripe`.","default":"auto"},"people":{"$ref":"#/components/schemas/PeopleConstraints"}},"additionalProperties":false,"type":"object","required":["value"],"title":"RelationshipCompany","description":"A company on the relationship, plus which of its people count."},"RelationshipEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RelationshipHit"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"institutions":{"items":{"$ref":"#/components/schemas/SharedInstitution"},"type":"array","title":"Institutions"},"breakdown":{"anyOf":[{"$ref":"#/components/schemas/Breakdown"},{"type":"null"}],"description":"Present only when the question asked for a breakdown."},"share":{"anyOf":[{"$ref":"#/components/schemas/Share"},{"type":"null"}],"description":"Present only when the question asked for a proportion."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"Which definition of *knows* produced `number_of_contacts_overlapping_tenure_with`.\n\n`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point, which on a large employer counts everyone who ever passed through.\n\nEchoed because it changes what the number means, not by a little: one measured row counts 16,630 people under `overlapping` and 100,085 under `shared`.","default":"overlapping"}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"RelationshipEnvelope","description":"`Envelope[RelationshipHit]` plus the bridges themselves.\n\n`institutions` is often the answer on its own — \"you both know people from\nStanford and McKinsey\" — and it is what a caller narrows by on the next\nrequest, so it is returned rather than left to be inferred from the union of\nevery row's `via`."},"RelationshipHit":{"properties":{"id":{"type":"string","title":"Id","description":"Use with `POST /v1/entities/persons` for the full record."},"category":{"$ref":"#/components/schemas/EntityCategory","description":"Always `person`. Present so a row is self-describing in the same way every other category's rows are.","default":"person"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department","description":"The same department vocabulary the request filters on."},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"number_of_contacts_overlapping_tenure_with":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number Of Contacts Overlapping Tenure With","description":"How many people at the **other** company this person can reach.\n\n`0` is a computed, checked answer — we ran the count and found nobody reachable under the current `connection_basis`. It is not the same as `null`/absent, which means the count was never attempted: a `via_institution` query has no other side to count against, so it is skipped rather than defaulted to `0`.\n\nRead it together with `connection_basis` on the envelope — the same person counts 16,630 under `overlapping` and 100,085 under `shared`, because sharing a large former employer means sharing it with everyone who ever worked there."},"match_reason_count":{"type":"integer","title":"Match Reason Count","description":"How many distinct institutions connect this person to the other side. Exact, not an estimate — `0` never appears here, because a row with no reason is not returned at all (see `via`). The sort key when ranking by strength of connection rather than by name.","default":0},"match_type":{"items":{"type":"string"},"type":"array","title":"Match Type","description":"Every reason this person matched, as a phrase — `array[0]` is the strongest. Not `via`'s own order: `via` is ordered by how many affiliation records back an institution, which is a volume measure, not a strength one. This array is ranked by connection strength instead — currently employed at the other side outranks having once shared a school with someone there.\n\nEach entry corresponds 1:1 to a `via` entry's own `match_type`, just reordered. Read together, not as two independent sources of truth."},"is_alum":{"type":"boolean","title":"Is Alum","description":"Previously worked at the company on the other side. The strongest single signal, and weighted accordingly.","default":false},"currently_at_target":{"type":"boolean","title":"Currently At Target","description":"Currently employed or enrolled at the **other** company/side specifically — not merely at some institution shared with it.\n\nRenamed from `currently_there`, which was scored over *any* matched institution: a person still enrolled at a shared university could read `currently_there: true` with no employment at the other side at all. This field answers the narrower, correct question, in parity with `is_alum`, which was always scoped this way.","default":false},"via":{"items":{"$ref":"#/components/schemas/ViaInstitution"},"type":"array","title":"Via","description":"Why this person matched. Never empty on a returned row."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Present only with `include_company_context`."},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain"},"profile_complete":{"type":"boolean","title":"Profile Complete","description":"False when the affiliation graph knows this person but the entity index has no record for them — a real connection with a thin profile.\n\nThey are returned rather than dropped: removing them would shrink a page while leaving `total` describing the unshrunk set.","default":true}},"type":"object","required":["id"],"title":"RelationshipHit","description":"One person, and why they are connected."},"RelationshipInstitution":{"properties":{"value":{"type":"string","maxLength":300,"minLength":1,"title":"Value"},"by":{"type":"string","enum":["auto","name","li_url","inst_key"],"title":"By","description":"How to read `value`. `auto` infers it: an `edu:` / `name:` key — what `institutions[].id` returns — is an `inst_key`, a LinkedIn company or school URL is an `li_url`, anything else is a name.","default":"auto"},"kind":{"type":"string","enum":["company","school","unknown"],"title":"Kind","description":"`unknown` lets the upstream decide from the index. When a name is genuinely both — Cambridge is a company and a university — the request is refused with both options rather than resolved by coin flip, so say which one if you know.","default":"unknown"}},"additionalProperties":false,"type":"object","required":["value"],"title":"RelationshipInstitution","description":"An institution the connection must run through."},"RelationshipInstitutionsRequest":{"properties":{"companies":{"items":{"$ref":"#/components/schemas/RelationshipCompany"},"type":"array","maxItems":2,"minItems":2,"title":"Companies","description":"Exactly two. A shared institution is a comparison between two populations, so one company has nothing to share and a third has no defined pairing.\n\n**Order still matters**, even though nothing about the returned list looks one-sided. The upstream excludes the **first** company's own institution keys from the bridges and keeps the second's, on purpose: the first company is essentially everyone's current employer on that side, so it bridges nothing, while \"previously worked at the *other* company\" is the single strongest connection in the corpus and was measured as the top bridge for the highest-ranked row. So swapping the two changes which institutions come back and what `people_first` / `people_second` count. It is not a symmetric request.\n\nEach company's own `people` constraints apply to that side only, and they change both *which* institutions qualify — an institution needs `min_people_per_side` matching people on each side to survive — and the per-side counts returned for the ones that do."},"institution_type":{"anyOf":[{"type":"string","enum":["employment","education"]},{"type":"null"}],"title":"Institution Type","description":"Restrict the bridges to shared employers, or to schools. Unset returns both, which is the usual question."},"min_people_per_side":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Min People Per Side","description":"How many distinct people each side must have at an institution for it to count. The quality knob: at the default `1` a single coincidence — one person on each side who happened to attend the same school — is a bridge, and on a large pair of companies those dominate the tail by count.\n\nOne consequence worth knowing, because it is not what the name suggests: the threshold is applied to the exact per-side counts *after* the upstream has already trimmed to the strongest `limit` institutions, not before. So a high threshold can return fewer than `limit` institutions while institutions that would have passed it exist further down the untrimmed list. Raise `limit` alongside it when the answer looks short.","default":1},"name_starts_with":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name Starts With","description":"Keep only institutions whose display name **starts with** this, case-insensitively.\n\nA prefix, not a substring and not a fuzzy match: `\"stan\"` finds Stanford University, and `\"ford\"` does not. That is the honest limit rather than a simplification — the institution name is a bare keyword in the affiliation corpus with no analysed subfield, so a substring search is not on offer.\n\nIt narrows the documents before they are bucketed, so it also makes the answer arrive faster rather than costing anything. For one institution you can already name, send it to `POST /v1/relationships` as an `institutions[]` anchor instead; this is for narrowing a list you have not seen yet."},"limit":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Limit","description":"How many institutions to return, strongest bridge first. Not a page size — there is no cursor and no page 2. When more exist than this, `truncated` on the response is `true`; raise `limit` or narrow with the filters above to see them.","default":200}},"additionalProperties":false,"type":"object","required":["companies"],"title":"RelationshipInstitutionsRequest","description":"`POST /v1/relationships/institutions`.\n\nThe institution list on its own — which employers and schools two companies\nhave people at in common, and how many on each side. `POST /v1/relationships`\nalready returns this as `institutions[]`, but only alongside a ranked page of\npeople, which is the expensive half of that answer and often not the half\nthat was wanted. There was also no way to *narrow* the list without paying\nfor the ranking again.\n\nNo `relation` field: there is only one shape here. A bridge needs two\npopulations to compare, so `via_institution` — one company plus a named\ninstitution — has no institution list to compute; it is already the answer to\na question that names its own institutions.\n\nNo `query` field, and no `cursor`. The upstream route is structured only, and\nthe answer is a single aggregation rather than a ranked window: `limit` is how\nmany institutions come back, `truncated` on the response says more exist, and\nthere is no page 2 to ask for.","examples":[{"companies":[{"value":"stripe.com"},{"value":"adyen.com"}]},{"companies":[{"by":"domain","value":"stripe.com"},{"by":"domain","people":{"seniority":["VP","Director"]},"value":"adyen.com"}],"institution_type":"education","limit":50,"min_people_per_side":2,"name_starts_with":"stan"}]},"RelationshipPerson":{"properties":{"li_url":{"type":"string","maxLength":300,"minLength":1,"title":"Li Url","description":"Any common form — scheme, `www.`, trailing slash and tracking params are all tolerated.\n\nThe only accepted form of person, and `POST /v1/relationships` returns it on every row as `linkedin_url`, so the two calls compose. It is exact, and present for every person in the affiliation graph.\n\nNot an internal id: an id means nothing to whoever reads the answer, and a caller holding one cannot tell whether it is the right person. Not a name: names are not unique, and the wrong person does not return a thin result — it returns a confident result about somebody else."}},"additionalProperties":false,"type":"object","required":["li_url"],"title":"RelationshipPerson","description":"The person a reach question runs through, by LinkedIn URL."},"RelationshipReachRequest":{"properties":{"person":{"$ref":"#/components/schemas/RelationshipPerson"},"target_company":{"$ref":"#/components/schemas/RelationshipCompany","description":"The company being reached into. Its people are what comes back."},"people":{"$ref":"#/components/schemas/PeopleConstraints","description":"Constrains the people being *reached* — the only side with more than one person on it."},"institution_type":{"anyOf":[{"type":"string","enum":["employment","education"]},{"type":"null"}],"title":"Institution Type"},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","default":"overlapping"},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","required":["person","target_company"],"title":"RelationshipReachRequest","description":"Who can be reached at one company through one named person.\n\nThe drill-down of `POST /v1/relationships`, and callable on its own: the\nanchor is a LinkedIn URL, which that route returns on every row, so a caller\nthat already knows who it cares about never has to run the list query first.\n\nNo `query` field. The list route takes a sentence because \"who at Stripe\nknows people at Adyen\" is a question people ask in words; this one starts\nfrom a specific person, so there is nothing to parse.","examples":[{"people":{"seniority":["VP","Director"]},"person":{"li_url":"linkedin.com/in/ada-lovelace"},"target_company":{"by":"domain","value":"microsoft.com"}},{"connection_basis":"shared","person":{"li_url":"https://www.linkedin.com/in/ada-lovelace/"},"target_company":{"by":"domain","value":"adyen.com"}}]},"RelationshipRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Query","description":"The question in words — \"who at Adyen do we know from Stripe\". Send this **or** the structured fields below, never both.\n\nThe upstream plans it into the same structured shape a caller could have sent, and that plan comes back in `resolved_search.filters` so the interpretation is inspectable rather than a black box. A sentence that does not describe a relationship is a 422 naming what was missing, not an empty page."},"relation":{"$ref":"#/components/schemas/RelationKind","description":"Which question this is. Rejected alongside `query` — the planner derives it, and a caller value beside a sentence has no defined precedence.","default":"between_companies"},"companies":{"items":{"$ref":"#/components/schemas/RelationshipCompany"},"type":"array","maxItems":2,"title":"Companies","description":"**Order is the contract.** For `between_companies`, the first company's people are what comes back and the second is who they are connected to. Swap them and you get the mirror question."},"institutions":{"items":{"$ref":"#/components/schemas/RelationshipInstitution"},"type":"array","maxItems":10,"title":"Institutions"},"institutions_combine":{"type":"string","enum":["any","all"],"title":"Institutions Combine","description":"`any` — affiliated with at least one. `all` — affiliated with every one, which is a per-person conjunction the upstream cannot paginate as cheaply, so totals on a large `all` query may be reported as estimates.","default":"any"},"institution_type":{"anyOf":[{"type":"string","enum":["employment","education"]},{"type":"null"}],"title":"Institution Type","description":"Restrict the shared institution to a former employer, or a school."},"connection_basis":{"type":"string","enum":["overlapping","shared"],"title":"Connection Basis","description":"What counts as *knowing* someone when counting `number_of_contacts_overlapping_tenure_with`.\n\n`overlapping` — the two people were at the shared institution at the same time. `shared` — both were there at some point.\n\nThe default is deliberate. On a large former employer `shared` counts everyone who ever passed through: one measured row reaches 100,085 people under `shared` and 16,630 under `overlapping`. The broader reading is available because it is sometimes the question, not because it is a better default.","default":"overlapping"},"exclude_current":{"type":"boolean","title":"Exclude Current","description":"Only count institutions the person has left. This is what 'previously worked at' means, and it is not the same as leaving the field unset.","default":false},"include_company_context":{"type":"boolean","title":"Include Company Context","description":"Add each person's current employer. Costs a further lookup upstream.","default":false},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","title":"RelationshipRequest","description":"`POST /v1/relationships`.\n\nA separate route from `/v1/search` on purpose. Employees-of-Acme and\npaths-to-Acme are different questions against different corpora with\ndifferent costs, and `category` could not carry the difference: these rows\nare people, and `person` already means \"employees matching a description\".\n\n`relation` decides which shape this is, and the validators below refuse the\ncombinations that cannot mean anything — before any upstream work, so a\nrequest that cannot mean anything is a free 422.","examples":[{"companies":[{"value":"stripe.com"},{"people":{"seniority":["VP","Director / Head"]},"value":"adyen.com"}],"limit":10,"relation":"between_companies"},{"companies":[{"by":"domain","value":"stripe.com"}],"institutions":[{"kind":"school","value":"Stanford University"}],"relation":"via_institution"}]},"RemoveItemsResponse":{"properties":{"saved_list":{"$ref":"#/components/schemas/SavedListView"},"removed":{"type":"integer","title":"Removed"}},"type":"object","required":["saved_list","removed"],"title":"RemoveItemsResponse"},"ResolveBy":{"type":"string","enum":["name","domain","li","id"],"title":"ResolveBy","description":"Forced resolution mode for an `EntityRef`."},"ResolvedSearch":{"properties":{"parser_version":{"type":"string","title":"Parser Version"},"mode":{"$ref":"#/components/schemas/SearchMode"},"category":{"$ref":"#/components/schemas/EntityCategory"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"},"filters_source":{"type":"string","enum":["caller","parser","caller+parser","none"],"title":"Filters Source","default":"none"},"semantic_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Query"},"semantic_scope":{"anyOf":[{"type":"string","enum":["company","person"]},{"type":"null"}],"title":"Semantic Scope"},"sort":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Sort"},"conflicts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conflicts"},"overrides":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Overrides"}},"type":"object","required":["parser_version","mode","category"],"title":"ResolvedSearch","description":"What we decided the request meant.\n\nShips in v1 even though the conversational refine surface does not. It is\nthe contract shape, not the feature, and it earns its place on grounds that\nhave nothing to do with refine: the caller can re-run exactly the search\nthey got, and `parser_version` is how a retuned extraction prompt stays\nexplainable instead of being a silent quality regression nobody can\nreconstruct after the fact."},"ResponseMeta":{"properties":{"request_id":{"type":"string","title":"Request Id"},"environment":{"$ref":"#/components/schemas/Environment","description":"Echoed on every response so a developer can never mistake a test-key result for a live one."},"as_of":{"type":"string","format":"date-time","title":"As Of"},"credential":{"type":"string","enum":["api_key","session"],"title":"Credential","description":"Which credential produced this response. `session` means the dashboard playground ran it as the signed-in user rather than as an API key — so it is billed to the user, subject to interactive rate limits, and carries no integration compatibility guarantee. Additive and defaulted, so it breaks no existing client.","default":"api_key"},"credits_charged":{"anyOf":[{"type":"number","description":"Credits, to at most three decimals."},{"type":"null"}],"title":"Credits Charged","description":"What this request cost, in credits, to at most three decimals. `0` when it cost nothing: a Basic or AI search that found nothing, rows this search already paid for (a cursor sent again, or a request repeated with the same `Idempotency-Key` on the same UTC day), or a test key. A request without a cursor or a repeated key is a new search, so keep the first page rather than asking for it again. `null` on a free endpoint."}},"type":"object","required":["request_id","environment","as_of"],"title":"ResponseMeta","description":"Present on every 2xx, including the ones that are not paginated."},"RevenueRange":{"properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max"}},"type":"object","title":"RevenueRange","description":"Annual revenue band; either side may be absent."},"RunHandle":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["run_id","status","meta"],"title":"RunHandle"},"RunList":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RunListItem"},"type":"array","title":"Results"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["results","meta"],"title":"RunList"},"RunListItem":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["run_id","status","query","created_at","finished_at"],"title":"RunListItem"},"RunRequest":{"properties":{"query":{"type":"string","maxLength":4000,"minLength":1,"title":"Query"},"category":{"type":"string","enum":["company","person"],"title":"Category","description":"What the run looks for: companies or people.","default":"company"},"effort":{"type":"string","enum":["minimal","low","medium","high","xhigh","auto"],"title":"Effort","description":"How hard the run works, and what it costs once it succeeds: `minimal` 1.02 credits, `low` 2.125, `medium` (the default) 8.5, `high` 42.5, `xhigh` 85. `auto` holds 85 while it chooses, and is charged the price of the tier it ran. A failed or cancelled run is charged nothing.","default":"medium"},"criteria":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Criteria"},"enrichments":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Enrichments"},"exclusion":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Exclusion"}},"additionalProperties":false,"type":"object","required":["query"],"title":"RunRequest"},"RunResult":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"stop_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stop Reason"},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}]},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation","description":"Ways this run is less than it should be, in a closed vocabulary a client can branch on. `billing_bypassed` means the work was done and nothing was charged -- either a test credential or a deployment configured to run on an empty wallet. Stated rather than left to be inferred from a zero."},"insights":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Insights","description":"Cited statements about the market or technology behind your question, from research reports, papers and trend records. A separate channel from the rows and from `coverage`: those corpora have no company linkage, so an insight is never a matching account and cannot have changed `universe`. Each carries the sources it rests on; a statement we could not cite is not returned."},"insight_sources":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Insight Sources","description":"The documents the insights rest on, so a citation number resolves to something you can show. Present even when `insights` is empty -- that means we found relevant documents and would not assert a statement from them, which is a result worth rendering rather than an empty panel."},"summary":{"type":"string","title":"Summary","description":"Two or three sentences on what came back and the bar actually applied, which is often not the bar that was asked for. Empty when the run could not produce one.","default":""},"exclusions":{"items":{"type":"string"},"type":"array","title":"Exclusions","description":"What was left out, and why -- a criterion a row failed, a constraint no reachable dataset can express, accounts a joined corpus cannot see. Named here rather than implied by a smaller row count."},"credits_charged":{"anyOf":[{"type":"number","description":"Credits, to at most three decimals."},{"type":"null"}],"title":"Credits Charged","description":"What this run cost, in credits, once settled. Null while it is still running — never 0, which would read as free."},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort","description":"The effort tier requested: `minimal` to `xhigh`, or `auto`."},"effort_ran":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort Ran","description":"The effort tier the run actually ran at, and was charged at, once it has settled. For an `auto` run this is the tier it chose. Null until then."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["run_id","status","meta"],"title":"RunResult"},"SavedItemView":{"properties":{"entity_category":{"type":"string","title":"Entity Category"},"entity_id":{"type":"string","title":"Entity Id"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"added_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Added By"},"available":{"type":"boolean","title":"Available","description":"False when the record cannot be read right now; it stays in the list."},"unavailable_reason":{"anyOf":[{"type":"string","enum":["not_found","retrieval_unavailable"]},{"type":"null"}],"title":"Unavailable Reason"},"record":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Record","description":"The current record, with the fields this workspace may see: card-visible fields for a free workspace, the full record for a paid one."}},"type":"object","required":["entity_category","entity_id","added_at","added_by","available","record"],"title":"SavedItemView"},"SavedListView":{"properties":{"id":{"type":"string","title":"Id","description":"The list's opaque id (a UUID)."},"name":{"type":"string","title":"Name"},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"item_count":{"type":"integer","title":"Item Count"}},"type":"object","required":["id","name","created_by","created_at","updated_at","item_count"],"title":"SavedListView"},"SearchExportRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ItemRefIn"},"type":"array","minItems":1,"title":"Items"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id","description":"The search these rows came from, for attribution. Optional."}},"additionalProperties":false,"type":"object","required":["items"],"title":"SearchExportRequest"},"SearchMode":{"type":"string","enum":["fast","auto","deep"],"title":"SearchMode","description":"How hard to work on the query.\n\nThe distinction is *what the words mean*, not how many results come back:\n\n- ``fast``  — match my words. The query is matched by meaning (vector\n  retrieval, falling back to keywords where vectors are unavailable); no\n  LLM in the path, so nothing is extracted into filters.\n- ``auto``  — understand my intent. The parser extracts filters.\n- ``deep``  — reason about it. Multi-step, slowest, most expensive.\n\n`fast` was very nearly defined as \"filters only, no LLM\", which would have\nmade `query` — the primary parameter — silently inert. A parameter that\ndoes nothing is worse than one that is missing."},"SearchRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Query"},"mode":{"$ref":"#/components/schemas/SearchMode","default":"fast"},"category":{"anyOf":[{"$ref":"#/components/schemas/EntityCategory"},{"type":"null"}],"description":"What to search. Omit it to have prism classify `query` and pick a category automatically (`POST /v1/search/query` upstream). That path takes `query` only — no `filters`, no domain restrictions, and only under `mode: auto`, since classification is itself one LLM call routing into an already-parsed vertical."},"filters":{"anyOf":[{"$ref":"#/components/schemas/DiscoverFilters"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"For `company` and `person`, the typed discover vocabulary documented above — unknown names and wrong shapes are refused here, by name. For the document categories, a free-form mapping of that vertical's own top-level filters, validated upstream."},"include_domains":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Include Domains","description":"`company`, `person`, and `job_opening` only (the company that posted the role) — every other category is a document with no domain of its own."},"exclude_domains":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Exclude Domains","description":"`company`, `person`, and `job_opening` only."},"sort":{"anyOf":[{"items":{"$ref":"#/components/schemas/SortClause"},"type":"array","maxItems":3},{"type":"null"}],"title":"Sort","description":"How to order the results, strongest key first. Omit it to get the engine's own ordering — relevance when there is a query to be relevant to, and a quality ranking when there is not. Every field accepts both `asc` and `desc`. Ask `GET /v1/sorts/{category}` for the fields a category accepts, with labels and default directions; do not hardcode a list."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","title":"SearchRequest","examples":[{"category":"company","limit":10,"mode":"fast","query":"industrial automation companies in Germany"},{"category":"company","filters":{"employee_count":{"gte":500,"lte":5000},"industry":{"include":["Software & Technology"]}},"limit":10},{"limit":10,"mode":"auto","query":"recent funding rounds in the payments space"}]},"SearchSuggestion":{"properties":{"kind":{"type":"string","enum":["search","agentic"],"title":"Kind","description":"`search` — a different `category` fits. `agentic` — no single search fits; use `POST /v1/agents`."},"category":{"anyOf":[{"$ref":"#/components/schemas/EntityCategory"},{"type":"null"}],"description":"The category to search instead. Set iff `kind` is `search`."},"message":{"type":"string","title":"Message","description":"One ready-to-show sentence."}},"type":"object","required":["kind","message"],"title":"SearchSuggestion","description":"A better way to have asked this question.\n\nAdvisory only. The search the caller asked for is the search that ran and\nthe search these `results` came from — this says a *different* request\nwould probably have answered better.\n\nThe split is **search vs agentic**, because that is the bigger question\nand the one a caller answers first:\n\n- `kind: \"search\"` — a plain `POST /v1/search` still answers this, just\n  not in the category it was asked in. `category` names the one that\n  fits, and drops straight into the next request.\n- `kind: \"agentic\"` — no single search answers this, whatever the\n  category: it needs several steps, or several corpora joined. `category`\n  is null, because the category is not the problem. Act on it with\n  `POST /v1/agents`.\n\nThere is deliberately **no `mode` field**. `mode: deep` does run the\nagentic engine, so naming it here was tempting and wrong: the customer-\nfacing agentic surface is its own endpoint, and a suggestion that said\n`deep` would point at a parameter rather than at the thing that actually\nanswers the question.\n\nNever the category the caller already searched: \"you should have searched\nwhat you searched\" is noise, and it is suppressed upstream rather than\nleft for a client to filter. Null on the common case, on every page after\nthe first, and whenever the request carried filters but no `query` —\nthere is no question to re-place if nobody asked one in words."},"SeedReach":{"properties":{"id":{"type":"string","title":"Id","description":"The named person's id."},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","default":false}},"additionalProperties":false,"type":"object","required":["id","total"],"title":"SeedReach","description":"One of several named people a reach question ran through."},"Share":{"properties":{"population":{"type":"integer","minimum":0.0,"title":"Population","description":"Every person currently at the subject company who meets the same person filters, with no connection required. The denominator."},"population_is_estimate":{"type":"boolean","title":"Population Is Estimate","default":false},"share":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Share","description":"`total / population`. `null` when the population is zero."}},"additionalProperties":false,"type":"object","required":["population"],"title":"Share","description":"The answer as a proportion of the subject's own people — present only\nwhen the question asked for one (\"what percentage of their sales org\")."},"SharedCredits":{"properties":{"remaining":{"type":"number","title":"Remaining","description":"Unrestricted grants, usable on any platform."}},"type":"object","required":["remaining"],"title":"SharedCredits"},"SharedInstitution":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"match_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Confidence"},"people_first":{"type":"integer","title":"People First","description":"Distinct people at the first company.","default":0},"people_second":{"type":"integer","title":"People Second","description":"Distinct people at the second company.","default":0}},"type":"object","required":["id"],"title":"SharedInstitution","description":"An institution bridging the two sides, with how many people each has."},"SharedInstitutionsEnvelope":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SharedInstitution"},"type":"array","title":"Results"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"total_is_estimate":{"type":"boolean","title":"Total Is Estimate","description":"Always serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact."},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present."},"resolved_search":{"anyOf":[{"$ref":"#/components/schemas/ResolvedSearch"},{"type":"null"}]},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/SearchSuggestion"},{"type":"null"}],"description":"A better way to have asked this question -- a different `category` (`kind: search`), or agentic search via `POST /v1/agents` (`kind: agentic`). Advisory: these `results` came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client."},"coverage":{"anyOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"null"}],"description":"How much of the addressable set this answer represents. Null means coverage was not measured for this request -- `fast` and `auto` do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"degradation":{"items":{"$ref":"#/components/schemas/Degradation"},"type":"array","title":"Degradation"},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns","description":"The answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is `{name, description, source}`; the value for each sits on every row in `results` keyed by the column `name`. Null means a plain entity table. Additive, so it breaks no existing client."},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"truncated":{"type":"boolean","title":"Truncated","description":"`true` when more institutions qualified than `limit` returned.\n\nA first-class field rather than a `degradation[]` entry, because it is the one thing about this response a caller must branch on and `has_more` — the field they would normally read for it — is structurally `false` here. A clipped list that looked complete would be a wrong answer rather than a short one: `institutions` is frequently the whole point (\"you both know people from Stanford and McKinsey\").\n\nRaise `limit`, or narrow with `institution_type` / `name_starts_with`, to see the rest. `degradation[]` still carries anything the upstream itself reported about the answer being narrower than the question; this field is not restated there, because one condition reported twice is a condition clients learn to ignore.","default":false}},"type":"object","required":["results","total","total_is_estimate","has_more","meta"],"title":"SharedInstitutionsEnvelope","description":"`Envelope[SharedInstitution]` — the bridges as the results themselves.\n\nThe house list shape rather than a bespoke one: the institutions arrive in\n`results`, so a client that already renders an envelope renders this with no\nnew code path, and `resolved_search` / `attribution` / `degradation` / `meta`\nmean here exactly what they mean everywhere else.\n\n**This endpoint is not paginated, so `has_more` is always `False` and\n`next_cursor` is always `null`.** That is not \"you reached the end of the\npages\" — there are no pages. The answer is one aggregation over the\naffiliation graph, `limit` is how much of it comes back, and `truncated`\nbelow is how \"more qualified than you asked for\" is communicated. The two\nenvelope fields stay present and stay honest about themselves rather than\nbeing dropped: `Envelope`'s invariant is `has_more == (next_cursor is not\nNone)`, both readings hold at `False`/`null`, and a client that branches on\n`has_more` to decide whether to page again correctly decides not to."},"SimilarAnchor":{"properties":{"value":{"type":"string","minLength":1,"title":"Value","description":"The company's name, domain, or LinkedIn URL."},"by":{"type":"string","enum":["domain","li_url","name"],"title":"By","default":"domain"},"weight":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Weight","description":"Relative influence of this anchor (0 = ignore, 1 = full). `combine: and` averages into one centroid; `combine: or` uses this as a per-anchor boost.","default":1.0}},"additionalProperties":false,"type":"object","required":["value"],"title":"SimilarAnchor"},"SimilarRequest":{"properties":{"anchors":{"items":{"$ref":"#/components/schemas/SimilarAnchor"},"type":"array","maxItems":10,"minItems":1,"title":"Anchors"},"combine":{"type":"string","enum":["and","or"],"title":"Combine","description":"`and` — look-alikes similar to all anchors together. `or` — look-alikes similar to any one of them.","default":"and"},"category":{"type":"string","enum":["company"],"description":"Look-alike search covers companies only.","default":"company"},"filters":{"anyOf":[{"$ref":"#/components/schemas/DiscoverFilters"},{"type":"null"}],"description":"Narrow the look-alikes — \"companies like Stripe, but in Germany and over 500 people\". Anchors decide who is similar; filters decide which of those come back. Not an intent on their own."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","required":["anchors"],"title":"SimilarRequest","examples":[{"anchors":[{"by":"domain","value":"adyen.com"},{"by":"domain","value":"checkout.com"}],"combine":"and","limit":10}]},"SortCatalogResponse":{"properties":{"category":{"$ref":"#/components/schemas/EntityCategory"},"sorts":{"items":{"$ref":"#/components/schemas/SortFieldInfo"},"type":"array","title":"Sorts","description":"Empty for a category that cannot be ordered explicitly. That is an answer: the engine still orders the results, it just does not take instruction."},"directions":{"items":{"type":"string"},"type":"array","title":"Directions"},"total":{"type":"integer","title":"Total"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["category","sorts","directions","total","meta"],"title":"SortCatalogResponse"},"SortClause":{"properties":{"field":{"type":"string","maxLength":64,"minLength":1,"title":"Field"},"direction":{"$ref":"#/components/schemas/SortDirection","default":"desc"}},"additionalProperties":false,"type":"object","required":["field"],"title":"SortClause","description":"One level of an ordering.\n\n`field` is a plain string rather than `DiscoverSortField` because the same\nclause serves the document categories, whose names this module does not\nmirror. `SearchRequest` narrows it to the enum when the category is\n`company` or `person`."},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection"},"SortFieldInfo":{"properties":{"field":{"type":"string","title":"Field","description":"The value to send as `sort[].field`."},"label":{"type":"string","title":"Label","description":"Display name. Matches the column's own label."},"kind":{"type":"string","title":"Kind","description":"`number`, `date` or `text`. Enough to choose a control; not a parser — the values themselves never come back through this route."},"default_direction":{"type":"string","title":"Default Direction","description":"What the engine would use if you named this field and no direction. Biggest-first for money and size, A-Z for names, longest-first for tenure."},"directions":{"items":{"type":"string"},"type":"array","title":"Directions","description":"Always both, today."},"applies_to":{"items":{"type":"string"},"type":"array","title":"Applies To","description":"`company`, `person`, or both — populated for those two categories only, since a document has no such axis. **Not advisory:** sending a person-axis sort on a company search is refused. A picker that offers every field regardless of the resolved category will produce 422s."},"definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Definition","description":"What the field means, in words. Null where none is recorded."},"direction_labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Direction Labels","description":"What each direction means for **this** field, keyed by direction: `{\"asc\": \"Shortest first\", \"desc\": \"Longest first\"}`. Render these rather than deriving words from `kind` — `kind` describes how the value is stored, not what ordering it means. `tenure` is the one that bites: it sorts on a start date, so a date-shaped label offers \"Newest first\" for the request that returns the longest-serving people."},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"Which section to list this field under: `identity`, `location`, `professional`, `firmographic` or `funding`. The same grouping the column catalogue uses, so a sort picker and a column picker file a field under the same heading. Null on a document category, which has no grouping."}},"type":"object","required":["field","label","kind","default_direction","directions","applies_to"],"title":"SortFieldInfo","description":"One sortable field."},"SourceCorpus":{"type":"string","enum":["gtm_index","affiliations","job_openings","starfish","patents","news","trends","market_reports","fundings","academic_reports"],"title":"SourceCorpus","description":"Where content came from. Closed set — it appears in `attribution[]`.\n\nThe first four are the GTM entity graph. The rest are the document corpora\nbehind the non-entity categories, each a distinct index with its own\nrefresh cadence — which is the reason they are named separately rather\nthan lumped under one label: `attribution[].as_of` means nothing if two\ncorpora updated a month apart share a name."},"SubjectRef":{"properties":{"kind":{"type":"string","enum":["request","agent_run"],"title":"Kind","description":"'request' for anything in your usage history — a search, a look-alike run, an entity lookup, a relationship query — identified by its meta.request_id. 'agent_run' for an agentic run, identified by its run_id."},"id":{"type":"string","maxLength":128,"minLength":1,"title":"Id","description":"meta.request_id for 'request'; run_id for 'agent_run'."}},"additionalProperties":false,"type":"object","required":["kind","id"],"title":"SubjectRef"},"TagDescriptor":{"properties":{"tag":{"type":"string","title":"Tag"},"applies_to":{"type":"string","title":"Applies To"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"requires_comment":{"type":"boolean","title":"Requires Comment","default":false}},"type":"object","required":["tag","applies_to","label","description"],"title":"TagDescriptor","description":"One tag as a form should render it, so no client invents the wording.\n\nThree fields beyond the identifier, and each answers a question a client\nwould otherwise answer for itself — badly. `label` is the line a checkbox\nshows; `description` is the clarifier under it; `requires_comment` says the\ntag is meaningless without prose, so the form can insist before the API has\nto refuse."},"TagVocabularyResponse":{"properties":{"version":{"type":"integer","title":"Version"},"tags":{"items":{"$ref":"#/components/schemas/TagDescriptor"},"type":"array","title":"Tags"}},"type":"object","required":["version","tags"],"title":"TagVocabularyResponse"},"TermsFilter":{"properties":{"include":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Include"},"exclude":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Exclude"},"match_all":{"type":"boolean","title":"Match All","description":"True requires every `include` value (AND). False (default) is OR.","default":false},"include_groups":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array","maxItems":1000},{"type":"null"}],"title":"Include Groups","description":"The `include` values, one list per thing named: any value in a list satisfies it, and `match_all` requires every LIST rather than every value. `technology` resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps \"both X and Y\". `include` stays the source of truth: a value removed from it leaves its group."}},"additionalProperties":false,"type":"object","title":"TermsFilter","description":"Include / exclude over a term-like field."},"TextFilter":{"properties":{"include":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Include"},"exclude":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Exclude"},"exact":{"type":"boolean","title":"Exact","default":false}},"additionalProperties":false,"type":"object","title":"TextFilter","description":"Free-text field match with an exact-match escape hatch.\n\n`exact=False` (default) runs an analyzed phrase match. `exact=True` targets\nthe `.keyword` subfield instead — use it when you have a canonical string\nand want no analysis."},"TopUpIntentResponse":{"properties":{"topup_id":{"type":"string","title":"Topup Id","description":"Opaque correlation id. Not a credential: it authorises nothing."},"url":{"type":"string","title":"Url","description":"Open this in a browser to pay. Requires a dashboard session."},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["topup_id","url","expires_at","meta"],"title":"TopUpIntentResponse"},"TopUpStatusResponse":{"properties":{"topup_id":{"type":"string","title":"Topup Id"},"status":{"type":"string","enum":["pending","completed"],"title":"Status"},"credits_added":{"anyOf":[{"type":"number","description":"Credits, to at most three decimals."},{"type":"null"}],"title":"Credits Added","description":"Present once `status` is `completed`, never before."},"order_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order Id"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["topup_id","status","meta"],"title":"TopUpStatusResponse"},"TrendAgeMetric":{"properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentile"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","title":"TrendAgeMetric"},"TrendBadges":{"properties":{"five_percent":{"items":{"type":"string"},"type":"array","title":"Five Percent"},"ten_percent":{"items":{"type":"string"},"type":"array","title":"Ten Percent"},"fifteen_percent":{"items":{"type":"string"},"type":"array","title":"Fifteen Percent"}},"type":"object","title":"TrendBadges","description":"Which \"top N %\" bands this trend reaches, by metric name."},"TrendBand":{"properties":{"percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentile"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"}},"type":"object","title":"TrendBand","description":"A percentile plus the label it falls in."},"TrendBoxplot":{"properties":{"lower_whisker":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lower Whisker"},"lower_quartile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lower Quartile"},"median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median"},"upper_quartile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upper Quartile"},"upper_whisker":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upper Whisker"}},"type":"object","title":"TrendBoxplot","description":"Corpus-wide whiskers SIES draws on the companies tab. Q1/Q3 are the\nhardcoded SIES quartiles, not the per-trend ones."},"TrendCategoryCount":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"relation_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relation Score"}},"type":"object","title":"TrendCategoryCount","description":"An industry, country or publication, with how much of the trend it accounts\nfor. `relation_score` is normalised so the leader is 100."},"TrendCompanyMaturity":{"properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","title":"TrendCompanyMaturity","description":"Known defect: `value` is `1 − company_stage_numeric` while `category`\nbuckets the un-inverted number (DEC-060 held-fields §2a). Shipped anyway so\nthe SIES page can be reproduced; do not treat the pair as consistent."},"TrendCompanyRef":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},"type":"object","title":"TrendCompanyRef","description":"A company named in an extracted fact. `domain` is present only when the\nextraction was resolved to a known company."},"TrendConnection":{"properties":{"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"overlap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overlap"},"shared_companies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shared Companies"}},"type":"object","title":"TrendConnection"},"TrendDeal":{"properties":{"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"project":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"},"buyers":{"items":{"$ref":"#/components/schemas/TrendCompanyRef"},"type":"array","title":"Buyers"},"targets":{"items":{"$ref":"#/components/schemas/TrendCompanyRef"},"type":"array","title":"Targets"},"companies":{"items":{"$ref":"#/components/schemas/TrendCompanyRef"},"type":"array","title":"Companies"},"investors":{"items":{"$ref":"#/components/schemas/TrendCompanyRef"},"type":"array","title":"Investors"},"recipients":{"items":{"$ref":"#/components/schemas/TrendCompanyRef"},"type":"array","title":"Recipients"},"share":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share"},"share_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Percentage"},"source":{"items":{"type":"string"},"type":"array","title":"Source"}},"type":"object","title":"TrendDeal","description":"An extracted event — an acquisition, investment or partnership. Which\ncompany fields are populated depends on the event type."},"TrendDescription":{"properties":{"short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short"},"long":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long"}},"type":"object","title":"TrendDescription"},"TrendDistribution":{"properties":{"minimum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum"},"maximum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maximum"},"median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median"},"std":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Std"},"variance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Variance"},"quartiles":{"items":{"$ref":"#/components/schemas/TrendQuartile"},"type":"array","title":"Quartiles"},"top_companies":{"items":{"$ref":"#/components/schemas/TrendNamedTotal"},"type":"array","title":"Top Companies"},"boxplot":{"anyOf":[{"$ref":"#/components/schemas/TrendBoxplot"},{"type":"null"}]}},"type":"object","title":"TrendDistribution"},"TrendDistributions":{"properties":{"funding":{"anyOf":[{"$ref":"#/components/schemas/TrendDistribution"},{"type":"null"}]},"revenue":{"anyOf":[{"$ref":"#/components/schemas/TrendDistribution"},{"type":"null"}]},"manpower":{"anyOf":[{"$ref":"#/components/schemas/TrendDistribution"},{"type":"null"}]},"employee_growth":{"anyOf":[{"$ref":"#/components/schemas/TrendDistribution"},{"type":"null"}]}},"type":"object","title":"TrendDistributions","description":"Complete-only sibling of `scale` — spread, quartiles, top companies, boxplot."},"TrendFeature":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"source":{"items":{"type":"string"},"type":"array","title":"Source"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size"},"size_cleaned":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Cleaned"}},"type":"object","title":"TrendFeature","description":"One LLM-extracted fact, with the sources it was extracted from."},"TrendFeatures":{"properties":{"application_areas":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Application Areas"},"core_technologies":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Core Technologies"},"trends_and_insights":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Trends And Insights"},"market_segments":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Market Segments"},"market_drivers":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Market Drivers"},"market_challenges":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Market Challenges"},"technology_limitations":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Technology Limitations"},"unique_value_proposition":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Unique Value Proposition"},"government_initiatives":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Government Initiatives"},"industry_events":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Industry Events"},"academic_activities":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Academic Activities"},"education_and_training":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Education And Training"},"regulatory_challenges":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Regulatory Challenges"},"business_models":{"items":{"type":"string"},"type":"array","title":"Business Models"},"business_classification":{"items":{"type":"string"},"type":"array","title":"Business Classification"},"branding_and_messaging":{"items":{"type":"string"},"type":"array","title":"Branding And Messaging"},"acquisitions":{"items":{"$ref":"#/components/schemas/TrendDeal"},"type":"array","title":"Acquisitions"},"investments_and_rnd":{"items":{"$ref":"#/components/schemas/TrendDeal"},"type":"array","title":"Investments And Rnd"},"partnerships_and_alliances":{"items":{"$ref":"#/components/schemas/TrendDeal"},"type":"array","title":"Partnerships And Alliances"},"market_concentration":{"items":{"$ref":"#/components/schemas/TrendDeal"},"type":"array","title":"Market Concentration"},"community_engagement":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Community Engagement"},"customer_segments":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Customer Segments"},"customer_relationship_focus":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Customer Relationship Focus"},"standards_and_certifications":{"items":{"$ref":"#/components/schemas/TrendFeature"},"type":"array","title":"Standards And Certifications"}},"type":"object","title":"TrendFeatures","description":"Qualitative facts extracted from company sites and analyst reports. Every\nentry carries the sources it came from, which is what separates these from\nan unattributable model summary. Coverage varies widely by field."},"TrendFunding":{"properties":{"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"},"average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average"},"rounds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rounds"},"rounds_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rounds Percentile"},"average_per_round":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Per Round"},"unique_investors":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unique Investors"},"rank_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rank Percentile"}},"type":"object","title":"TrendFunding"},"TrendGraphPoint":{"properties":{"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"relative_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Frequency"}},"type":"object","title":"TrendGraphPoint"},"TrendGraphs":{"properties":{"news_coverage":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"News Coverage"},"new_companies":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"New Companies"},"funding_raised":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"Funding Raised"},"global_search":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"Global Search"},"article_startup_global_search":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"Article Startup Global Search"},"patents_application":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"Patents Application"},"patents_publication":{"items":{"$ref":"#/components/schemas/TrendGraphPoint"},"type":"array","title":"Patents Publication"}},"type":"object","title":"TrendGraphs","description":"SIES default window (last 5 years). Empty series are omitted upstream."},"TrendGrowth":{"properties":{"annualized":{"anyOf":[{"$ref":"#/components/schemas/TrendGrowthAnnualized"},{"type":"null"}]},"over_window":{"anyOf":[{"$ref":"#/components/schemas/TrendGrowthOverWindow"},{"type":"null"}]}},"type":"object","title":"TrendGrowth"},"TrendGrowthAnnualized":{"properties":{"companies_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Companies Pct"},"news_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"News Pct"},"funding_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Funding Pct"},"default":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"default_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Category"},"cagr_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cagr Category"}},"type":"object","title":"TrendGrowthAnnualized","description":"Window-independent growth — comparable across trends without qualification."},"TrendGrowthOverWindow":{"properties":{"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window"},"companies_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Companies Pct"},"news_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"News Pct"},"trend_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trend Pct"},"startups_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Startups Pct"},"funding_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Funding Pct"}},"type":"object","title":"TrendGrowthOverWindow","description":"Growth measured over a fixed window, which `window` names.\n\nThe window is part of the data, not an implicit default: the same trend's\ncompany growth differs by 28 points between a one-year and a five-year\nwindow, so a figure without its window cannot be interpreted."},"TrendInvestedCompanies":{"properties":{"percentage_available":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentage Available"},"total_availability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Availability"}},"type":"object","title":"TrendInvestedCompanies"},"TrendInvestor":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"rounds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rounds"},"invested":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Invested"},"companies_invested_in":{"items":{"$ref":"#/components/schemas/TrendInvestorCompany"},"type":"array","title":"Companies Invested In"}},"type":"object","title":"TrendInvestor"},"TrendInvestorCompany":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"invested_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Invested Sum"}},"type":"object","title":"TrendInvestorCompany"},"TrendMarket":{"properties":{"size":{"anyOf":[{"$ref":"#/components/schemas/TrendMarketSize"},{"type":"null"}]},"cagr":{"anyOf":[{"$ref":"#/components/schemas/TrendMarketCagr"},{"type":"null"}]},"forecast":{"anyOf":[{"$ref":"#/components/schemas/TrendMarketSize"},{"type":"null"}]}},"type":"object","title":"TrendMarket","description":"Market sizing extracted from analyst reports, each with its citation.\nPopulated for roughly 37-40 % of trends."},"TrendMarketCagr":{"properties":{"percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"source":{"items":{"type":"string"},"type":"array","title":"Source"}},"type":"object","title":"TrendMarketCagr"},"TrendMarketSize":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Year"},"source":{"items":{"type":"string"},"type":"array","title":"Source"}},"type":"object","title":"TrendMarketSize"},"TrendMetric":{"properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentile"}},"type":"object","title":"TrendMetric","description":"A value with its position against the whole corpus. Percentiles are 0–100\non every field — prism normalises `trend_age`, which upstream reports on a\n0–1 scale *and* inverted."},"TrendNamedTotal":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"}},"type":"object","title":"TrendNamedTotal"},"TrendPatentStats":{"properties":{"all_patents":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"median_patent_age":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"yearly_growth":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"magnitude":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"all_applicants":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"all_classifications":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"top_inventor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Inventor"},"top_applicant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Applicant"},"top_issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Issuer"},"growth_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Growth Category"},"applications_growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Applications Growth"},"applications_growth_in_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Applications Growth In Period"},"publication_growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Publication Growth"},"publication_growth_in_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Publication Growth In Period"}},"type":"object","title":"TrendPatentStats"},"TrendQuartile":{"properties":{"quartile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quartile"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"}},"type":"object","title":"TrendQuartile"},"TrendRecord":{"properties":{"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"description":{"anyOf":[{"$ref":"#/components/schemas/TrendDescription"},{"type":"null"}]},"topic_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Type"},"summary":{"anyOf":[{"$ref":"#/components/schemas/TrendSummary"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"connections":{"items":{"$ref":"#/components/schemas/TrendConnection"},"type":"array","title":"Connections"},"startups":{"items":{"$ref":"#/components/schemas/TrendStartup"},"type":"array","title":"Startups"},"highlights":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Highlights"},"signals":{"anyOf":[{"$ref":"#/components/schemas/TrendSignals"},{"type":"null"}]},"scale":{"anyOf":[{"$ref":"#/components/schemas/TrendScale"},{"type":"null"}]},"market":{"anyOf":[{"$ref":"#/components/schemas/TrendMarket"},{"type":"null"}]},"badges":{"anyOf":[{"$ref":"#/components/schemas/TrendBadges"},{"type":"null"}]},"industries":{"items":{"type":"string"},"type":"array","title":"Industries"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"features":{"anyOf":[{"$ref":"#/components/schemas/TrendFeatures"},{"type":"null"}]},"biggest_investors":{"items":{"$ref":"#/components/schemas/TrendInvestor"},"type":"array","title":"Biggest Investors"},"similar_tags":{"items":{"$ref":"#/components/schemas/TrendSimilarTag"},"type":"array","title":"Similar Tags"},"publications":{"items":{"$ref":"#/components/schemas/TrendCategoryCount"},"type":"array","title":"Publications"},"graphs":{"anyOf":[{"$ref":"#/components/schemas/TrendGraphs"},{"type":"null"}]},"patent_stats":{"anyOf":[{"$ref":"#/components/schemas/TrendPatentStats"},{"type":"null"}]},"search_interest":{"anyOf":[{"$ref":"#/components/schemas/TrendSearchInterest"},{"type":"null"}]},"snapshot":{"anyOf":[{"$ref":"#/components/schemas/TrendSnapshot"},{"type":"null"}]},"distributions":{"anyOf":[{"$ref":"#/components/schemas/TrendDistributions"},{"type":"null"}]}},"type":"object","title":"TrendRecord","description":"`definition` — the trend's own keyword search definition — is\ndeliberately not declared: backend/analyst tooling metadata about how\nthe trend was built, not information about the trend itself."},"TrendScale":{"properties":{"companies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Companies"},"funding":{"anyOf":[{"$ref":"#/components/schemas/TrendFunding"},{"type":"null"}]},"revenue":{"anyOf":[{"$ref":"#/components/schemas/TrendTotalAverage"},{"type":"null"}]},"manpower":{"anyOf":[{"$ref":"#/components/schemas/TrendTotalAverage"},{"type":"null"}]},"patents":{"anyOf":[{"$ref":"#/components/schemas/TrendTotalAverage"},{"type":"null"}]},"employee_growth":{"anyOf":[{"$ref":"#/components/schemas/TrendTotalAverage"},{"type":"null"}]},"article_coverage":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]}},"type":"object","title":"TrendScale","description":"Absolute size of the trend, with corpus ranks."},"TrendSearchInterest":{"properties":{"average_volume":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"magnitude":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"yearly_growth":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth"},"growth_in_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth In Period"},"growth_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Growth Category"},"article_startup_growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Article Startup Growth"},"article_startup_growth_in_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Article Startup Growth In Period"},"article_startup_growth_in_period_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article Startup Growth In Period Category"},"trending":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trending"},"trending_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trending Category"},"technology_adoption_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Technology Adoption Value"},"hype_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hype Strength"}},"type":"object","title":"TrendSearchInterest"},"TrendSignals":{"properties":{"signal_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Strength"},"technology_adoption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technology Adoption"},"hype":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hype"},"maturity":{"anyOf":[{"$ref":"#/components/schemas/TrendBand"},{"type":"null"}]},"magnitude":{"anyOf":[{"$ref":"#/components/schemas/TrendBand"},{"type":"null"}]},"trend_age":{"anyOf":[{"$ref":"#/components/schemas/TrendAgeMetric"},{"type":"null"}]},"company_age":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"article_age":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"company_magnitude":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"news_magnitude":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"growth":{"anyOf":[{"$ref":"#/components/schemas/TrendGrowth"},{"type":"null"}]}},"type":"object","title":"TrendSignals","description":"How mature, how big, how fast, how hyped — each against the whole corpus."},"TrendSimilarTag":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"relation_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relation Score"},"relative_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Percentage"}},"type":"object","title":"TrendSimilarTag"},"TrendSnapshot":{"properties":{"companies_growth_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Companies Growth Category"},"news_growth_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"News Growth Category"},"company_maturity":{"anyOf":[{"$ref":"#/components/schemas/TrendCompanyMaturity"},{"type":"null"}]},"spread":{"anyOf":[{"$ref":"#/components/schemas/TrendMetric"},{"type":"null"}]},"news_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"News Frequency"},"growth_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Period"},"grants":{"anyOf":[{"$ref":"#/components/schemas/TrendTotalAverage"},{"type":"null"}]},"youngest_companies":{"items":{"$ref":"#/components/schemas/TrendYoungestCompany"},"type":"array","title":"Youngest Companies"},"youngest_articles":{"items":{"$ref":"#/components/schemas/TrendYoungestArticle"},"type":"array","title":"Youngest Articles"},"most_common_company_stage":{"anyOf":[{"$ref":"#/components/schemas/TrendCategoryCount"},{"type":"null"}]},"invested_companies":{"anyOf":[{"$ref":"#/components/schemas/TrendInvestedCompanies"},{"type":"null"}]},"funding_rounds":{"items":{"$ref":"#/components/schemas/TrendCategoryCount"},"type":"array","title":"Funding Rounds"},"investment_rounds_per_investor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Investment Rounds Per Investor"},"average_invested_sum_per_investor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Invested Sum Per Investor"},"most_frequently_mentioned_companies":{"items":{"type":"string"},"type":"array","title":"Most Frequently Mentioned Companies"},"funding_growth_in_period":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Funding Growth In Period"}},"type":"object","title":"TrendSnapshot","description":"SIES Info/Companies leftovers that are not already in signals or scale."},"TrendStartup":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"}},"type":"object","title":"TrendStartup"},"TrendSummary":{"properties":{"concise_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concise Description"},"introduction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Introduction"},"market_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Overview"},"growth_evaluation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Growth Evaluation"},"investment_and_funding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment And Funding"},"key_topics_and_trends":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Topics And Trends"},"technology_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technology Used"},"topic_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Analysis"},"news_and_media_coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"News And Media Coverage"},"companies_involved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Companies Involved"},"conclusion_and_key_takeaways":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusion And Key Takeaways"}},"type":"object","title":"TrendSummary"},"TrendTotalAverage":{"properties":{"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"},"average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average"},"rank_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rank Percentile"}},"type":"object","title":"TrendTotalAverage"},"TrendYoungestArticle":{"properties":{"article_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article Name"},"article_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article Date"},"article_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article Link"}},"type":"object","title":"TrendYoungestArticle"},"TrendYoungestCompany":{"properties":{"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"},"company_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Date"}},"type":"object","title":"TrendYoungestCompany"},"UsageBucketOut":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"requests":{"type":"integer","title":"Requests"},"credits":{"type":"number","title":"Credits","description":"Credits, to at most three decimals."}},"type":"object","required":["period_start","requests","credits"],"title":"UsageBucketOut"},"UsageResponse":{"properties":{"key_id":{"type":"string","title":"Key Id"},"period_from":{"type":"string","format":"date-time","title":"Period From"},"period_to":{"type":"string","format":"date-time","title":"Period To"},"granularity":{"type":"string","title":"Granularity"},"total_requests":{"type":"integer","title":"Total Requests"},"total_credits":{"type":"number","title":"Total Credits","description":"What the ledger charged, in credits to at most three decimals. A call is charged once its response is built, so one that failed first cost nothing."},"buckets":{"items":{"$ref":"#/components/schemas/UsageBucketOut"},"type":"array","title":"Buckets"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"type":"object","required":["key_id","period_from","period_to","granularity","total_requests","total_credits","meta"],"title":"UsageResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ViaInstitution":{"properties":{"id":{"type":"string","title":"Id","description":"The institution's key in the affiliation corpus. Stable, and the value to send back when narrowing to this institution."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"`employment` — a shared employer — or `education`."},"match_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Confidence","description":"How this institution was identified: `url` from a canonical LinkedIn URL, `edu` from a school record, or `name` from a normalised name.\n\nAlways returned, because `name` matches are a genuinely weaker signal — names are not unique — and a connection shown without this reads as verified when it is an inference."},"started":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started","description":"When this person's association began, `YYYY-MM-DD`."},"ended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended","description":"When it ended. Absent means still there."},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"What they did there — a job title, or a degree for a school.\n\nReturned because a shared employer with no overlap in time is a much weaker claim than one with it, and a caller shown only the institution's name cannot tell the two apart."},"match_type":{"type":"string","title":"Match Type","description":"Why this specific institution counts as a reason — in words, not a code. `\"Currently works at Acme\"`, `\"Previously worked at Acme\"`, `\"Also worked at McKinsey\"` (a third company both sides happen to share), or `\"Attended Stanford University\"`.\n\nSpelled out rather than an enum because this API is callable by an LLM directly — a code needing a lookup table defeats that. The row's own top-level `match_type` is this same string, one per `via` entry, reordered so the strongest reason leads."}},"type":"object","required":["id","match_type"],"title":"ViaInstitution","description":"One institution through which a person is connected."},"VoteCastResponse":{"properties":{"vote":{"$ref":"#/components/schemas/VoteView"},"changed":{"type":"boolean","title":"Changed","description":"False when the same vote was already active — nothing was stored."}},"type":"object","required":["vote","changed"],"title":"VoteCastResponse"},"VoteListResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"votes":{"items":{"$ref":"#/components/schemas/VoteView"},"type":"array","title":"Votes"}},"type":"object","required":["request_id","votes"],"title":"VoteListResponse"},"VoteRequest":{"properties":{"request_id":{"type":"string","maxLength":128,"minLength":1,"title":"Request Id","description":"`meta.request_id` of the response the vote is about (an agent run's `run_id` for Agent results)."},"level":{"type":"string","enum":["result_set","result"],"title":"Level","description":"`result_set` — thumbs on the whole set; `result` — flag one record."},"entity_category":{"$ref":"#/components/schemas/EntityCategory","description":"The category of the results (result_set) or of the record (result)."},"entity_id":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Entity Id","description":"The flagged record's id. Required for `result`, refused for `result_set`."},"vote":{"type":"string","enum":["like","dislike","flag"],"title":"Vote","description":"`like`/`dislike` on a result set; `flag` on a single result."},"reason_code":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reason Code","description":"Optional reason chip. result_set: not_relevant | missing_expected | too_few | wrong_or_outdated | other. result: wrong_entity | outdated | duplicate | missing_info | other. Never sent with `like`."},"text":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Text","description":"Optional free text, only after a reason. Stored here only — never sent to analytics."}},"additionalProperties":false,"type":"object","required":["request_id","level","entity_category","vote"],"title":"VoteRequest"},"VoteView":{"properties":{"vote_id":{"type":"string","title":"Vote Id"},"request_id":{"type":"string","title":"Request Id"},"level":{"type":"string","enum":["result_set","result"],"title":"Level"},"entity_category":{"type":"string","title":"Entity Category"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"vote":{"type":"string","enum":["like","dislike","flag"],"title":"Vote"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["vote_id","request_id","level","entity_category","entity_id","vote","reason_code","text","created_at"],"title":"VoteView","description":"The caller's own vote. `text` is theirs, so it is echoed back to them."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","description":"Sprouts data-platform key: `sk_dsp_live_…` or `sk_dsp_test_…`. **Server-side only** — these keys must never be used from a browser.","in":"header","name":"X-API-Key"}}},"tags":[{"name":"search","description":"Search and look-alikes — the v1 retrieval surface. Everything cheap to decide happens before the charge."},{"name":"relationships","description":"Who is connected to whom, over shared employers and schools. A different corpus from search, and rows whose value is the reason they matched."},{"name":"org-chart","description":"Who works where, counted. Headcount by department and seniority for one company, its sub-departments, and where those people sit. A matrix, not a reporting tree."},{"name":"entities","description":"Entity records by id — one route per category (DEC-045). Misses are returned, never omitted."},{"name":"coverage","description":"Exactly what is in the index. Counted, not marketed. Free, but scope-gated."},{"name":"credits","description":"Credit balance and per-key usage. Both free, both scope-gated on `dsp.usage.read`."},{"name":"history","description":"Your own recent runs — what was asked, what it cost, what came back. Free, scope-gated on `dsp.usage.read`, and visible only to the credential that ran them."},{"name":"meta","description":"Liveness and readiness. Unauthenticated by design."},{"name":"dashboard-auth","description":"The dashboard's auth surface — signup, sign-in, sign-out, session. Cookie-authenticated, browser-only and CSRF-protected: the inverse of the rest of `/v1`."},{"name":"api-keys","description":"API key management for the dashboard. Session-authenticated and proxied to auth-service — a key cannot mint another key."},{"name":"transcribe","description":"Speech to text for the dashboard's voice search. Session-only and unmetered — an API key cannot reach it."},{"name":"billing","description":"Buying credits. Session-authenticated and proxied to mint, which owns the Stripe session and the webhook that settles it — the edge stores nothing about payments."}]}