SigSentrySigSentry

Error codes

Every error.code value the API returns, with HTTP status, meaning, and recovery guidance

Every error response uses the standard envelope:

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "human-readable description",
    "details": { /* optional structured detail */ }
  }
}

The code is the stable identifier you should branch on. The message is for human display.

Authentication errors

HTTPerror.codeMeaningRecovery
401UNAUTHORIZEDMissing or malformed Authorization headerSend Authorization: Bearer <key>
401API_KEY_REVOKEDThe key was revokedCreate a new key
401API_KEY_EXPIREDThe key has expiredCreate a new key
401KEY_FORMAT_DEPRECATEDA legacy tb_* / ss_live_* key after the sunset windowMint a new ss_secret_* or ss_org_* key in the dashboard
403FORBIDDENKey lacks the permission for this endpointUse a key with the required permission
403PUBLIC_KEY_REQUIREDAn ss_secret_* or ss_org_* key was used with the SDKUse the ss_pub_* from Project → SDK Keys
403SECRET_KEY_REQUIREDAn ss_pub_* key was used on a server-only endpointMint an ss_secret_* (or ss_org_*) and use it server-side
403ORG_KEY_REQUIREDA project-scoped key was used on a tenant-only endpoint (e.g. POST /v1/projects)Use an ss_org_* key
403WRONG_PROJECTX-Project-Id (or path id) doesn't match the key's project bindingSend the correct project id, or use an ss_org_* key
403DASHBOARD_ONLYThis action lives in the dashboardSign in to the web app to perform it
400MISSING_PROJECT_IDss_org_* key without X-Project-Id on a project-scoped endpointSend X-Project-Id
400INVALID_PUBLIC_KEY_PERMISSIONSTried to mint an ss_pub_* with permissions outside analysis:create / analysis:readMint with the locked set, or pick ss_secret_* if you need broader access
400CONFIRMATION_MISMATCHDELETE /v1/projects/{id} body missing confirm field or it doesn't match the project slugSet confirm to the project slug exactly

Validation errors

HTTPerror.codeMeaningdetails shape
400VALIDATION_ERROROne or more fields failed schema validation{ issues: [{ path, message }] }
400INVALID_TIME_RANGEtimeEnd is not after timeStart (or toDate not after fromDate)
400INVALID_PROJECT_SLUGSlug doesn't match ^[a-z0-9-]+$

Resource errors

HTTPerror.codeMeaning
404NOT_FOUNDThe resource doesn't exist within your tenant scope
409CONFLICTA resource with the same unique field already exists (e.g. duplicate slug)
409IDEMPOTENCY_KEY_CONFLICTAn Idempotency-Key was reused with a different request body — see Idempotency
410GONEThe resource was deleted

Quota and plan errors

HTTPerror.codeMeaningRecovery
402PAYMENT_REQUIREDSubscription is past due or trial expiredResolve in Organization → Billing
403QUOTA_EXCEEDEDMonthly analyses quota exhausted, overage not enabledEnable overage or upgrade — see Overage
403PLAN_FEATURE_GATEEndpoint requires a higher plan tierUpgrade — see Plans
403RESOURCE_LIMITPer-resource limit reached (e.g. log sources per project)Delete unused resources or upgrade

Rate-limit errors

HTTPerror.codeMeaning
429RATE_LIMITEDToo many requests — see Rate limits for windows and headers

Server-side errors

HTTPerror.codeMeaningRecovery
500INTERNAL_ERRORUnexpected server errorRetry with backoff; if persistent, email support@sigsentry.com with the requestId from the response
500ANALYSIS_ERRORAn analysis failed during processingCheck the analysis detail for specifics; retry typically succeeds
502UPSTREAM_ERROROne of your connected integrations (a log source, repo provider, or notification channel) returned an errorThe details.upstream field identifies the integration kind (e.g. log_source, repo, channel) so you can check the right place
503SERVICE_UNAVAILABLEMaintenance or partial outageRetry with backoff
504UPSTREAM_TIMEOUTAn upstream dependency timed outSame as UPSTREAM_ERROR

Idempotent retries

5xx, 429, and UPSTREAM_ERROR (502) are safe to retry. Use exponential backoff with jitter, and cap your retry budget so a persistent failure doesn't loop forever.

4xx (other than 429) are client errors and won't succeed on retry without a request change.

Request id

Every error response includes a requestId field for support:

{
  "success": false,
  "error": { "code": "INTERNAL_ERROR", "message": "...", "requestId": "req_..." }
}

Include the requestId when contacting support.