Skip to main content

Authentication

ISAO API uses API key-based authentication with Bearer tokens. All API requests must include a valid API key in the Authorization header.

📋 Table of Contents

🔑 Getting Your API Key

  1. Log in to your ISAO dashboard

  2. Navigate to Settings → API Keys (/dashboard/settings/api-keys)

  3. Click "Create New API Key"

  4. Configure your key:

    • Name: Descriptive name (e.g., "Zapier Integration")
    • Description: Optional description
    • Service Type: Choose the appropriate type
    • Permissions: Select required permissions
    • Rate Limits: Set appropriate limits
    • Expiration: Optional expiration date
  5. Copy the generated API key immediately (it won't be shown again)

🔐 Authentication Method

All API requests must include the API key in the Authorization header using the Bearer token format:

Authorization: Bearer YOUR_API_KEY_HERE

Example Request

curl -H "Authorization: Bearer ck_f98211064cbfc547bf3f1edc8c75da099d644be7c4ac52f49041953838bb3fc7" \
https://staging.isao.io/api/external/contacts

Example with cURL

# Set your API key as an environment variable
export ISAO_API_KEY="ck_f98211064cbfc547bf3f1edc8c75da099d644be7c4ac52f49041953838bb3fc7"

# Use in requests
curl -H "Authorization: Bearer $ISAO_API_KEY" \
https://staging.isao.io/api/external/test

🏷️ API Key Types

Choose the appropriate type when creating your API key:

Generic (generic)

  • Use case: General purpose integrations
  • Prefix: ck_
  • Best for: Custom applications, testing

Zapier (zapier)

  • Use case: Zapier workflows and automations
  • Prefix: zap_
  • Best for: Zapier integrations, REST hooks

Make (make)

  • Use case: Make.com (ex-Integromat) scenarios
  • Prefix: make_
  • Best for: Make.com integrations

Webhook (webhook)

  • Use case: Custom webhook integrations
  • Prefix: whk_
  • Best for: Real-time notifications

Custom (custom)

  • Use case: Specialized integrations
  • Prefix: cst_
  • Best for: Enterprise applications

🛡️ Permissions System

API keys use a granular permission system. Grant only the permissions your integration needs:

Available Permissions

PermissionDescriptionRequired For
contacts:readRead contact informationListing, searching, viewing contacts
contacts:writeCreate and update contactsCreating, updating contacts
deals:readRead deal informationListing, viewing deals
deals:writeCreate and update dealsCreating, updating deals
agents:readRead AI agent informationListing agents
webhooks:readView webhook subscriptionsListing webhooks
webhooks:writeManage webhook subscriptionsCreating, deleting webhooks

Permission Examples

// Read-only integration
{
"permissions": ["contacts:read", "deals:read"]
}

// Full CRM integration
{
"permissions": [
"contacts:read", "contacts:write",
"deals:read", "deals:write",
"webhooks:read", "webhooks:write"
]
}

// Webhook-only integration
{
"permissions": ["webhooks:write"]
}

✅ Testing Authentication

Test Endpoint

Use the test endpoint to verify your API key is working:

curl -H "Authorization: Bearer YOUR_API_KEY" \
https://staging.isao.io/api/external/test

Success Response

{
"success": true,
"message": "API key is valid and working",
"data": {
"companyId": "cmb72clgt0003145mvfrg8iyh",
"permissions": ["contacts:read", "contacts:write"],
"timestamp": "2024-11-08T09:30:00.000Z"
}
}

Error Responses

Missing API Key

curl https://staging.isao.io/api/external/test
{
"success": false,
"error": "API key required in Authorization header",
"message": "Please provide a valid API key in the format: Authorization: Bearer YOUR_API_KEY"
}

Invalid API Key

curl -H "Authorization: Bearer invalid_key" \
https://staging.isao.io/api/external/test
{
"success": false,
"error": "Invalid API key",
"message": "The provided API key is invalid, expired, or inactive"
}

Insufficient Permissions

curl -H "Authorization: Bearer YOUR_API_KEY" \
https://staging.isao.io/api/external/contacts
{
"success": false,
"error": "Permission denied: contacts:read required",
"message": "This API key does not have the required permission: contacts:read",
"requiredPermission": "contacts:read",
"availablePermissions": ["webhooks:write"]
}

🔒 Security Best Practices

1. Environment Variables

Never hardcode API keys in your source code:

// ❌ Bad
const apiKey = "ck_f98211064cbfc547bf3f1edc8c75da099d644be7c4ac52f49041953838bb3fc7";

// ✅ Good
const apiKey = process.env.ISAO_API_KEY;

2. Server-Side Only

API keys should only be used in server-side applications, never in client-side code (browser JavaScript, mobile apps).

3. HTTPS Only

All API requests must be made over HTTPS. HTTP requests will be rejected.

4. Key Rotation

Regularly rotate your API keys:

  • Generate a new key
  • Update your applications
  • Delete the old key

5. Minimal Permissions

Grant only the permissions your integration actually needs. You can always add more permissions later.

6. Monitor Usage

Regularly check the API key usage logs in your dashboard to detect any suspicious activity.

7. Rate Limiting

Set appropriate rate limits on your API keys to prevent abuse:

  • Per Hour: Recommended 1000-5000 requests
  • Per Day: Recommended 10000-50000 requests

🔧 Integration Examples

Node.js/JavaScript

const axios = require('axios');

const client = axios.create({
baseURL: 'https://staging.isao.io/api/external',
headers: {
'Authorization': `Bearer ${process.env.ISAO_API_KEY}`,
'Content-Type': 'application/json'
}
});

// Test authentication
async function testAuth() {
try {
const response = await client.get('/test');
console.log('✅ Authentication successful:', response.data);
} catch (error) {
console.error('❌ Authentication failed:', error.response.data);
}
}

Python

import os
import requests

class IsaoClient:
def __init__(self):
self.base_url = "https://staging.isao.io/api/external"
self.api_key = os.getenv("ISAO_API_KEY")
self.headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}

def test_auth(self):
response = requests.get(f"{self.base_url}/test", headers=self.headers)
response.raise_for_status()
return response.json()

# Usage
client = IsaoClient()
result = client.test_auth()
print("✅ Authentication successful:", result)

PHP

<?php

class IsaoClient {
private $baseUrl = 'https://staging.isao.io/api/external';
private $apiKey;

public function __construct() {
$this->apiKey = getenv('ISAO_API_KEY');
}

private function makeRequest($method, $endpoint, $data = null) {
$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => $this->baseUrl . $endpoint,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json'
],
]);

if ($data) {
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
}

$response = curl_exec($curl);
curl_close($curl);

return json_decode($response, true);
}

public function testAuth() {
return $this->makeRequest('GET', '/test');
}
}

// Usage
$client = new IsaoClient();
$result = $client->testAuth();
echo "✅ Authentication successful: " . json_encode($result);
?>

❓ Troubleshooting

Common Issues

  1. 401 Unauthorized: Check your API key format and validity
  2. 403 Forbidden: Verify you have the required permissions
  3. 429 Too Many Requests: You've hit rate limits, slow down your requests
  4. 500 Internal Server Error: Contact support if persistent

Getting Help

If you encounter authentication issues: