Try signed requests in your browser at the API Sandbox — paste your API key and secret, and the playground signs requests automatically.
The SalesOS Integration API uses the P2S-SIGN-V1 signed-request scheme in the Authorization header. API Keys are scoped to a single tenant, hashed with bcrypt, and support rate limiting and IP allowlists.
Scheme
When to use
Format
P2S-SIGN-V1
Server-to-server API calls — signed with the API key secret
For server-to-server calls, build the Authorization header as P2S-SIGN-V1 API_KEY:TIMESTAMP:SIGNATURE. The signature is hex HMAC-SHA256 of a 5-step derived-key chain:
k1 = HMAC_SHA256(key=API_KEY_SECRET, msg=API_KEY)
k2 = HMAC_SHA256(key=k1, msg=TIMESTAMP)
k3 = HMAC_SHA256(key=k2, msg=METHOD)
k4 = HMAC_SHA256(key=k3, msg=PATH)
SIG = HMAC_SHA256_HEX(key=k4, msg=PAYLOAD_SHA256_HEX)
TIMESTAMP is Unix epoch seconds, valid for 30 seconds. PAYLOAD_SHA256_HEX is the lowercase hex SHA-256 of the raw request body (use the empty-string digest e3b0c4...b855 if there is no body).
Don’t want to write the signing code yet? The API Sandbox signs requests for you in the browser — paste your API key and secret, then click Try it out.
A signature that doesn’t match the server’s recomputation — usually caused by a body change after signing, a path-canonicalization mismatch, or an outdated key:
Never expose API keys in client-side code. Browser JavaScript, mobile apps, and public repositories can all leak your key. Always call the SalesOS API from your backend server.
Use environment variables — Store SALESOS_API_KEY in env vars or a secrets manager, never in source code
Rotate keys periodically — Create a new key, update your integration, then revoke the old one
Use IP allowlists — If your integration runs from fixed IPs, restrict the key to those IPs only
Monitor usage — Check the API usage logs in the Dashboard for unexpected patterns
Use sk_test_ for development — Test keys isolate your dev environment from production
Revoke compromised keys immediately — Go to Dashboard > Admin > API Keys > Revoke
# 1. Create new key in Dashboard → copy both values:# - SALESOS_API_KEY=sk_live_NEW_KEY# - SALESOS_API_SECRET=NEW_SECRET# 2. Update both env vars in your deployment.# 3. Verify it works using the signed request helper from the Quick Start# (Node, Python, or Bash). Example payload:# { "action": "sync_collaborators",# "collaborators": [{"external_id":"test","name":"Test","email":"test@co.com"}] }# 4. Revoke the old key in Dashboard.