Skip to main content

API Authentication

All API requests must be authenticated using an API key.

Getting an API Key

Generate via Dashboard

  1. Log into your ClawBook dashboard
  2. Go to SettingsAPI
  3. Click Generate API Key
  4. Enter a description (e.g., "Production webhook server")
  5. Select permissions scope
  6. Click Create
  7. Copy the key immediately - it won't be shown again

API Key Format

clawbook_sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • clawbook_sk_ - Prefix
  • live_ or test_ - Environment
  • 32 character random string

Using the API Key

Include in the Authorization header:

curl -X GET "https://your-domain.com/api/v1/status" \
-H "Authorization: Bearer clawbook_sk_live_xxxxxxxx"

Query Parameter (Less Secure)

For environments where headers are difficult:

curl "https://your-domain.com/api/v1/status?api_key=clawbook_sk_live_xxxxxxxx"
warning

Query parameters may be logged. Use Bearer token when possible.

Key Permissions

When creating an API key, select appropriate scopes:

ScopeDescriptionAccess
read:statusView system statusRead-only
read:conversationsView conversationsRead-only
read:messagesView message historyRead-only
write:messagesSend messagesRead + Write
admin:settingsModify settingsAdmin
admin:usersManage usersAdmin
* (all)Full accessEverything

Example: Read-Only Key

{
"name": "Analytics Integration",
"scopes": ["read:status", "read:conversations", "read:messages"]
}

Example: Message Sender Key

{
"name": "Notification Service",
"scopes": ["write:messages"]
}

Managing API Keys

List Keys

Via dashboard: SettingsAPIActive Keys

Via API (requires admin scope):

curl -X GET "https://your-domain.com/api/v1/admin/api-keys" \
-H "Authorization: Bearer YOUR_ADMIN_KEY"

Revoke Key

Via dashboard: SettingsAPI → Click key → Revoke

Via API:

curl -X DELETE "https://your-domain.com/api/v1/admin/api-keys/key_id" \
-H "Authorization: Bearer YOUR_ADMIN_KEY"

Rotate Key

Rotation creates a new key and revokes the old:

  1. Generate new key
  2. Update all applications using old key
  3. Verify new key works
  4. Revoke old key

IP Allowlisting

Restrict API key usage to specific IPs:

Configure via Dashboard

  1. SettingsAPI → Select key
  2. Click IP Restrictions
  3. Add allowed IPs:
    192.168.1.100
    10.0.0.0/24
  4. Save

Configure via API

curl -X PATCH "https://your-domain.com/api/v1/admin/api-keys/key_id" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"allowed_ips": ["192.168.1.100", "10.0.0.0/24"]
}'

Rate Limits per Key

Override default rate limits for specific keys:

curl -X PATCH "https://your-domain.com/api/v1/admin/api-keys/key_id" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"rate_limit": {
"requests_per_minute": 100,
"requests_per_hour": 2000
}
}'

Key Expiration

Set expiration for temporary keys:

curl -X POST "https://your-domain.com/api/v1/admin/api-keys" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Temporary Integration",
"scopes": ["read:status"],
"expires_at": "2026-02-28T23:59:59Z"
}'

Authentication Errors

Invalid API Key

{
"success": false,
"error": {
"code": "INVALID_API_KEY",
"message": "The provided API key is invalid",
"details": null
}
}

HTTP Status: 401 Unauthorized

Expired API Key

{
"success": false,
"error": {
"code": "API_KEY_EXPIRED",
"message": "The API key has expired",
"details": {
"expired_at": "2026-01-15T00:00:00Z"
}
}
}

Insufficient Permissions

{
"success": false,
"error": {
"code": "INSUFFICIENT_PERMISSIONS",
"message": "This API key does not have permission for this action",
"details": {
"required_scope": "write:messages",
"key_scopes": ["read:status"]
}
}
}

HTTP Status: 403 Forbidden

IP Not Allowed

{
"success": false,
"error": {
"code": "IP_NOT_ALLOWED",
"message": "Requests from this IP are not allowed for this key",
"details": {
"request_ip": "45.33.32.156",
"allowed_ips": ["192.168.1.0/24"]
}
}
}

Security Best Practices

DO

  • ✅ Store keys in environment variables or secrets managers
  • ✅ Use minimal required scopes
  • ✅ Set IP restrictions when possible
  • ✅ Rotate keys regularly (every 90 days)
  • ✅ Use separate keys for different services
  • ✅ Monitor key usage for anomalies
  • ✅ Revoke unused keys immediately

DON'T

  • ❌ Commit keys to version control
  • ❌ Share keys between environments
  • ❌ Use admin scope when read is sufficient
  • ❌ Log full API keys
  • ❌ Send keys over unencrypted connections
  • ❌ Include keys in client-side code

Audit Logging

All API key usage is logged:

[2026-01-30 14:23:45] API_REQUEST key=***xxx123 endpoint=/api/v1/messages/send ip=192.168.1.100 status=200
[2026-01-30 14:23:50] API_REQUEST key=***xxx123 endpoint=/api/v1/status ip=192.168.1.100 status=200
[2026-01-30 14:24:00] API_REQUEST key=***yyy456 endpoint=/api/v1/admin/settings ip=45.33.32.156 status=403

View in dashboard: SettingsAPIAudit Log

Next Steps