Skip to content
SeekOutDevelopers

Get started

Errors and retries

Every failure is a JSON problem document (RFC 9457) with a stable code you can branch on. Read the code, not the prose.

The problem document

Failures use the application/problem+json media type and always carry type, title, status, detail, and code. When a request identifier is available, request_id and the X-Request-Id response header carry it — quote that value in a support request.

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json

{
  "type": "urn:seekout:developer-api:problem:insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "detail": "The credential lacks the required scope for this operation.",
  "code": "insufficient_scope",
  "request_id": "43fa2cc3-87b8-4ad9-a17a-5790fd0f3760"
}

code is the stable contract. detail is written for a human and may change; never parse it. Response bodies may gain fields, so ignore any member you do not recognize.

Status codes

What each status means
StatusMeaningWhat to do
400Malformed authentication, idempotency, or cursor inputFix the request; do not retry unchanged
401The key is missing, invalid, revoked, or for another audienceUse a valid active key
402The work cannot be funded at its minimum useful sizeAdd credits or ask for less work; nothing was charged
403The key is valid but lacks the permission for this operationRequest the permission, or use a key that has it
404The resource does not exist, or is not enabled for your organizationCheck the path; ask an admin whether the operation is enabled
409An idempotency key, quote, or continuation conflicts with existing stateRefresh the state; do not assume a new hold exists
410A cursor, job, or result is no longer retainedStart the operation again
413The request body exceeds 65,536 bytesSend a smaller request
415The media type is not supportedSend Content-Type: application/json
422The body did not satisfy the operation contractCorrect the fields named in detail
429Admission was denied before useful work happenedWait for Retry-After, then retry
503A dependency is unavailable or a terminal state is uncertainRetry after Retry-After; contact support if it persists

402, 403, 429, and 503 are deliberately different

These four are never substituted for one another, so each one tells you exactly what to change.

Retries and idempotency

POST /v1/candidates/search, POST /v1/profiles/unlock, and POST /v1/person-matches require an Idempotency-Key header of 8 to 128 characters, starting with an ASCII letter or digit and then using only ASCII letters, digits, ., _, :, or -. A UUID is valid. Reusing the same key with the same body replays the first successful result instead of doing the work again. GET /v1/whoami and GET /v1/search/sources do not use an idempotency key.

Correlate with supportSend your own X-Request-Id (up to 128 letters, digits or ._:-) to correlate logs, or read the one the API returns. SeekOut never logs your query text, profile payloads, or credentials, so the request id is how a support conversation starts.