API v3 is live and in beta: expect possible malfunctions and breaking changes in the coming days. If you find a bug, please report it to your Sillage contact.
APIv3

Authentication

Authenticate API requests with a Sillage workspace API key.

The API uses workspace API keys, generated in your Sillage settings. They start with sk_live_. A key gives access to the workspace it was generated for, and only to that workspace.

Send the API key in the Authorization header:

Authorization: Bearer <YOUR_API_KEY>

Example request

curl "https://api.getsillage.com/api/v3/lists?page_size=5" \
  -H "Authorization: Bearer $SILLAGE_API_KEY"

Status codes

StatusMeaning
200The request succeeded.
401The API key is missing or invalid, or the workspace it belongs to was deleted (workspace_inactive).
403Your workspace can have only one persona (persona create), or the workspace is blocked, so no run can be launched.
404The resource does not exist.
405The path exists but not with this method. The Allow header lists the methods it takes.
409The request conflicts with the current state of a resource.
422The request is refused: the body is not valid JSON, or a field, a parameter, a value or a cursor is not valid, or not known.
429Rate limit exceeded.
500An unexpected server error occurred.

Error model

Every error is an RFC 9457 problem document, sent with Content-Type: application/problem+json. It has these fields:

FieldDescription
typeAlways about:blank.
titleA short name for the problem, the same every time it happens.
statusThe HTTP status code.
codeA stable identifier for the problem, such as invalid_body. Use it, not title or detail, to tell one problem from another. See Error codes.
detailWhat went wrong this time.
instanceThe path of the request.
errorsOnly on 422, and absent on a 422 that names no field: the fields at fault, each with the list of what is wrong with it.
signal_setup_idsOnly on the list_persona_setup_conflict 409: the IDs of the signal setups that block the change.
{
  "type": "about:blank",
  "title": "Unprocessable Entity",
  "status": 422,
  "code": "invalid_body",
  "detail": "Invalid request body",
  "instance": "/api/v3/contents/query",
  "errors": {
    "limit": ["must be at most 100"]
  }
}

An error about the request as a whole, or about several fields together, such as a missing body, is named _root. An unknown field is named in errors, under its own name:

{
  "type": "about:blank",
  "title": "Unprocessable Entity",
  "status": 422,
  "code": "invalid_body",
  "detail": "Invalid request body",
  "instance": "/api/v3/contents/query",
  "errors": {
    "keyword": ["Unknown field: keyword"]
  }
}

Input is never silently replaced by a default: an unknown field, parameter or value, an invalid date, or a cursor that does not belong to the request is refused with 422. Only a body sent with GET or DELETE is ignored.

Error codes

The code of a problem is one of these values. Branch on it, never on title or detail.

StatusCodeWhen
401invalid_api_keyThe API key is missing, malformed, revoked or expired.
401workspace_inactiveThe workspace of the API key was deleted.
402insufficient_creditsYour credit balance cannot pay for the signal run. Nothing was started.
403workspace_blockedThe workspace is blocked, so no run can be launched.
403single_personaYour workspace can have only one persona.
404not_foundThe resource named in the path does not exist.
404route_not_foundNo route matches the path.
405method_not_allowedThe path exists but not with this method. The Allow header lists the methods it takes.
409run_in_progressA run of this signal setup is still in progress.
409setup_disabledThe signal setup is disabled.
409last_list_of_tierThe list is the only one of its kind for its persona (for a prospect list, of its tier), so it cannot be deleted or archived.
409list_in_useA signal setup still uses the list.
409smart_listSmart lists are managed in the app: their members cannot be added or removed through the API.
409tag_takenAnother persona of the workspace already uses this tag.
409template_unavailableThe signal template is archived, so no signal can be set up from it.
409list_persona_conflictThe list is attached only to personas other than the signal setup's persona.
409list_persona_setup_conflictChanging the personas of a list would leave signal setups on a list that is not attached to their persona. signal_setup_ids names them.
409no_covered_accountEvery account the signal setup would check has monitoring turned on but unpaid. Nothing was started.
409no_monitored_accountNo account the signal setup would check is monitored. Nothing was started.
409conflictThe request conflicts with the current state of a resource.
422invalid_bodyThe body is not valid: a field is missing, has the wrong type or value, or is not known.
422invalid_queryA query parameter is not valid or not known.
422invalid_url_paramsA value in the path is not valid.
422invalid_jsonThe body is not valid JSON.
422body_requiredThe route needs a JSON body and none was sent.
422invalid_referenceAn ID in the body or in a filter does not match a resource of your workspace.
422invalid_date_rangeA _from date is after its _to date.
422persona_incompleteThe workspace has no persona, or its persona is missing something the request needs.
422persona_requiredThe workspace has several personas, so the request must say which one with persona_id.
422discovery_needs_job_titlesThe signal run needs job titles, on the signal setup or on the persona. Nothing was started.
422launch_not_possibleThe signal setup cannot be launched as configured, for example it has no list or no keywords. Nothing was started.
429rate_limitedToo many requests. The Retry-After header tells you how many seconds to wait.
500internal_errorAn unexpected error on our side.

New codes may be added; for a code you don't know, act on the HTTP status.

Common response headers

Every response includes:

HeaderDescription
X-Request-IdRequest UUID, to quote when you contact support.
X-Response-TimeHow long the server took to answer.
X-RateLimit-LimitMaximum number of requests allowed in the time window.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetWhen the window resets, as a Unix timestamp in milliseconds.

A 429 response also carries Retry-After, the number of seconds to wait before you retry.

Security

Treat API keys like passwords

Store them on your servers, never in a browser or a mobile app, and rotate a key when someone who had access to it leaves your organization or when it may have been copied.

On this page