Skip to main content
Slate authenticates API requests using the OAuth 2.0 client_credentials grant. Exchange your client ID and secret at the token endpoint for a short-lived Bearer token, then include that token in the Authorization header on every API call. Tokens are scoped to an owner organization and carry permissions configured at client provisioning time.

Token Endpoints

Use the endpoint that matches your target environment:

Requesting a Token

Send a POST request to the token endpoint with your client credentials and the client_credentials grant type. Credentials are passed via HTTP Basic auth (client ID as the username, client secret as the password).
A successful response returns a JSON object containing the access token and its lifetime:
Cache the token for its expires_in window (minus a small buffer) and request a new one before it expires. Do not request a new token on every API call.

Scopes

Request one or more of the following scopes in the scope parameter, separated by spaces:
Scopes are not yet enforced at the API layer, but they will be. Request only the scopes your integration needs today so it keeps working once enforcement is enabled. Actual access is currently governed by the permissions attached to your client at provisioning time.

Sending Your Token

Include the access token in the Authorization header with the Bearer scheme:
Here is a complete example using curl:
Each API is served under its own service prefix on api.slate.inc — for example /accounts, /files, /qc, /signatures, and /users. The same Bearer token works across every service. All requests, including GET, POST, PATCH, and DELETE, require this header.
Treat your client secret and access tokens like passwords. Never commit them to source control, log them, or expose them in client-side code. Store them in a secrets manager or environment variable.

Owner Scoping

Your client is bound to a single owner, the organization Slate uses to isolate your data. Slate delivers your owner identifier alongside your client credentials. Every account, file, signature, and QC record you create or retrieve is scoped to that owner automatically, and you do not need to pass the owner identifier on standard requests.

List endpoints

List endpoints require you to specify the owner explicitly to keep them context-free. Pass your owner identifier as a query parameter, and it must be an owner your token is authorized to read:
Requests to list endpoints without an owner parameter will be rejected.

Getting Client Credentials

Slate does not provide self-serve client registration. To obtain a client ID and secret:
  1. Contact your Slate account manager and provide the name or identifier of the service you are building, along with the scopes and permissions it needs.
  2. Slate provisions a client scoped to your owner with the requested permissions and delivers the client ID, client secret, and owner identifier through a secure channel.
  3. Store the client ID and secret in your secrets manager and reference them at runtime via environment variables (for example, SLATE_CLIENT_ID and SLATE_CLIENT_SECRET).
If your client secret is compromised or needs to be rotated, contact your account manager immediately.

Error Responses

Token endpoint errors

The token endpoint returns standard OAuth 2.0 error responses when a token request fails:
Common causes:

API errors

When authentication fails on an API request, Slate returns 401 Unauthorized with a JSON body:
Common causes:

Account identifier (crid) uniqueness

When you upsert accounts, you supply a crid (your identifier for the account in your own system), and that value must be unique within your owner. Two different owners may use the same crid without conflict, but within a single owner, each crid maps to exactly one Slate account. Because crid is the natural key the upsert matches on, re-sending the same crid updates the existing record rather than creating a new one.