Authentication
The SalesOS Integration API uses API Keys for authentication. Each key is scoped to a single tenant, hashed with bcrypt, and supports rate limiting and IP allowlists.Environments
- Production
- Staging
Base URL:
https://api.play2sell.comDashboard: https://dashboard.play2sell.comApp: https://app.play2sell.comQuick Start
1. Create an API Key
Go to Integrations > API Keys in the SalesOS Dashboard:- Click Create API Key
- Name your key (e.g., “CRM Nightly Sync”, “Website Form Integration”)
- Select the scope:
default:sync - Click Create
- Copy the key immediately — it will only be shown once
2. Use the Key in Requests
Include the key in theAuthorization header of every API request:
3. Check the Response
Success (200):API Key Properties
| Property | Details |
|---|---|
| Prefix | sk_live_ (production) or sk_test_ (testing) |
| Scope | default:sync — enables sync_collaborators and sync_activities |
| Rate limit | Configurable per key (default: 1000 requests/hour) |
| Expiration | Optional — set an expiry date or leave as never-expires |
| IP allowlist | Optional — restrict to specific IP addresses |
| Storage | Hashed with bcrypt — the plaintext key is never stored |
Key Formats
SalesOS uses two key prefixes to distinguish environments:| Prefix | Environment | Use case |
|---|---|---|
sk_live_ | Production | Real data, real missions, real points |
sk_test_ | Testing | Safe to use during development — no impact on production |
Authentication Errors
| HTTP Status | Error Code | Meaning | What to do |
|---|---|---|---|
| 401 | UNAUTHORIZED | Key is missing, invalid, or expired | Check the Authorization header. Verify the key in the Dashboard. |
| 403 | FORBIDDEN | Key is valid but lacks required scope | Edit the key and add the default:sync scope |
| 429 | RATE_LIMITED | Too many requests this hour | Wait retry_after seconds, then retry |
Example: Missing Authorization header
Example: Wrong key prefix
Example: Key without required scope
If your key only hasleads:read but the endpoint requires default:sync:
Example: Rate limit exceeded
retry_after field tells you how many seconds to wait. The rate limit window resets every hour.
Rate Limits
Each API key has an independent rate limit counter that resets hourly:| Setting | Default | Range |
|---|---|---|
| Requests per hour | 1000 | 1 — 100,000 |
- Each successful request increments the counter
- When the counter reaches the limit, further requests return
429 - The counter resets to 0 one hour after the first request in the window
Security Best Practices
- Use environment variables — Store
SALESOS_API_KEYin 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
Key rotation example
Self-Service API Key Management
In addition to creating keys in the Dashboard, tenant admins can manage API keys programmatically via the API. This enables:- Automated key rotation in CI/CD pipelines
- Partner onboarding workflows that provision keys on demand
- Custom admin panels that integrate key management
API Key Management
Create, list, and revoke keys via API using your Dashboard JWT token
Next Steps
Default Integration
Start sending activities to SalesOS
API Keys
Manage keys programmatically

