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.

Authentication

Authenticate partner requests with a partner master key.

The partner API uses your partner master key. It starts with mk_live_ and lets you act on every workspace you manage: each route names the client it works on with partner_workspace_id in its path, except creating and listing workspaces, which name no client in their path. The key alone identifies you, no other identifier is needed.

Send the master key in the Authorization header:

Authorization: Bearer <YOUR_MASTER_KEY>

Example request

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

Status codes

StatusMeaning
200The request succeeded.
401The master key is missing or invalid.
403The workspace is blocked, so no run can be launched.
404No workspace found for this partner_workspace_id, or the 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/partner/workspaces/ws_123/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/partner/workspaces/ws_123/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_master_keyThe master key is missing, malformed, revoked or invalid.
403workspace_blockedThe workspace is blocked, so no run can be launched.
404not_foundThe resource named in the path does not exist.
404partner_workspace_not_foundNo workspace of yours has this partner_workspace_id, or it was deleted.
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.
409partner_busyA workspace is being created or restored for you right now. Retry in a moment.
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 master 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