Skip to main content
Every request to the Sotto API is authenticated with an HMAC-SHA256 signature. Sotto issues each vendor a username and a secret; the secret is used to sign requests and is never transmitted.

Required headers

string
required
The vendor username tied to your API secret.
string
required
The Base64-encoded HMAC-SHA256 signature of the request. See Generating the signature.
string
required
The time the request is sent, in ISO 8601 UTC format (e.g. 2024-03-05T17:52:11.345Z). This must match the value used when generating the signature.
string
Must be application/json for JSON requests, or multipart/form-data for file uploads.
string
The Base64-encoded request body. Required for POST and PUT requests.

Generating the signature

The signature is computed as:
The StringToSign differs by method.
string
The request timestamp in ISO 8601 format. Must match the x-date header.
string
The HTTP method in uppercase (GET, POST, PUT, DELETE).
string
The request path and query string after the domain — for example, /api/v1/users?phone_number=+15551234567.
string
The Base64 encoding of the request body. The JSON keys must be sorted alphabetically and all whitespace and newlines removed before encoding.
The body used to compute x-digest must be serialized with keys sorted alphabetically and no extra whitespace (equivalent to json.dumps(body, sort_keys=True, separators=(",", ":"))). A signature computed over differently-formatted JSON will fail verification.

Step by step

1

Retrieve your secret

Load the API_SECRET issued to you by Sotto.
2

Capture the timestamp

Generate the current time in ISO 8601 UTC format and use it for both the signature and the x-date header.
3

Encode the body

For POST/PUT, sort the JSON keys alphabetically, strip whitespace, and Base64-encode the result to produce x-digest.
4

Build the string to sign

Assemble the StringToSign using the timestamp, method, path with query, and (for POST/PUT) the Base64 body.
5

Sign and send

Compute the HMAC-SHA256 signature with your secret, then send the request with the x-bigco-hmac-username, x-bigco-hmac-sha256, x-date, and (for POST/PUT) x-digest headers.

Example

A failed signature returns 401 Unauthorized: