{{-- Top bar --}}
{{-- Sidebar --}} {{-- Mobile sidebar toggle --}}
{{-- Mobile nav drawer --}} {{-- Main content --}}
{{-- ═══════════════════════════════════════════════════════════════ QUICK START ═══════════════════════════════════════════════════════════════ --}}

{{ config('app.name') }} API

Build powerful integrations with the {{ config('app.name') }} platform. Manage contacts, conversations, campaigns, and more programmatically.

Quick Start

1. Generate an API Token

Navigate to Settings → Account to create a personal API token. Select the scopes (permissions) your integration needs.

2. Base URL

{{ url('/api/v1') }}

3. Make Your First Request

curl -X GET {{ url('/api/v1/contacts') }} \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
{{-- ═══════════════════════════════════════════════════════════════ AUTHENTICATION ═══════════════════════════════════════════════════════════════ --}}

Authentication

All API requests require a valid Bearer token sent in the Authorization header.

Authorization: Bearer your-api-token

Tokens are scoped. When you create a token, you select which API sections it can access:

@foreach(['contacts', 'conversations', 'campaigns', 'workflows', 'knowledge-base', 'ai', 'analytics', 'tags', 'canned-responses'] as $scope) {{ $scope }} @endforeach

Requests to endpoints outside the token's scopes will receive a 403 Forbidden response.

{{-- ═══════════════════════════════════════════════════════════════ RATE LIMITING ═══════════════════════════════════════════════════════════════ --}}

Rate Limiting

API requests are rate-limited to protect service stability. Default limits:

ScopeLimit
General API60 requests/minute
Import/Export5 requests/minute
Campaign Send5 requests/minute
AI Generate Reply10 requests/minute
AI Analyze Sentiment20 requests/minute
KB Scrape3 requests/minute

Rate limit headers are included in every response:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
Retry-After: 42  // only when rate limited (429)
{{-- ═══════════════════════════════════════════════════════════════ ERRORS ═══════════════════════════════════════════════════════════════ --}}

Errors

The API uses standard HTTP status codes. Errors return a JSON body with details:

CodeMeaning
400Bad Request - Invalid parameters
401Unauthorized - Invalid or missing token
403Forbidden - Token lacks required scope
404Not Found - Resource does not exist
422Validation Error - Check the errors object
429Too Many Requests - Rate limit exceeded
500Server Error - Unexpected failure
{
  "message": "Contact not found."
}

// Validation errors (422)
{
  "errors": {
    "email": ["The email field is required."]
  }
}
{{-- ═══════════════════════════════════════════════════════════════ ENDPOINT SECTIONS ═══════════════════════════════════════════════════════════════ --}} {{-- ── CONTACTS ─────────────────────────────────────────────── --}}

Contacts

Manage your contact database. Requires contacts scope.

{{-- List Contacts --}} @include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/contacts', 'description' => 'List contacts with search, filters, and pagination.', 'params' => [ ['name' => 'search', 'type' => 'string', 'required' => false, 'desc' => 'Search by name, email, or company'], ['name' => 'status', 'type' => 'string', 'required' => false, 'desc' => 'Filter: active, inactive, unsubscribed'], ['name' => 'tag_id', 'type' => 'integer', 'required' => false, 'desc' => 'Filter by tag ID'], ['name' => 'country', 'type' => 'string', 'required' => false, 'desc' => 'Filter by country'], ['name' => 'min_score', 'type' => 'integer', 'required' => false, 'desc' => 'Minimum lead score (0-100)'], ['name' => 'max_score', 'type' => 'integer', 'required' => false, 'desc' => 'Maximum lead score (0-100)'], ['name' => 'sort_by', 'type' => 'string', 'required' => false, 'desc' => 'Sort field: first_name, last_name, email, company, lead_score, created_at, last_contacted_at'], ['name' => 'sort_dir', 'type' => 'string', 'required' => false, 'desc' => 'asc or desc (default: desc)'], ['name' => 'per_page', 'type' => 'integer', 'required' => false, 'desc' => 'Results per page (max 100, default 25)'], ], 'curl' => "curl -X GET '" . url('/api/v1/contacts') . "?search=john&per_page=10' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ { "id": 1, "first_name": "John", "last_name": "Doe", "email": "john@example.com", "phone": "+1234567890", "company": "Acme Inc", "lead_score": 75, "status": "active", "tags": [{"id": 1, "name": "VIP"}], "created_at": "2026-03-01T10:00:00Z" } ], "links": { "first": "...", "last": "...", "prev": null, "next": "..." }, "meta": { "current_page": 1, "last_page": 5, "per_page": 10, "total": 48 } }', ]) {{-- Create Contact --}} @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/contacts', 'description' => 'Create a new contact.', 'params' => [ ['name' => 'first_name', 'type' => 'string', 'required' => true, 'desc' => 'Contact first name (max 255)'], ['name' => 'last_name', 'type' => 'string', 'required' => false, 'desc' => 'Contact last name'], ['name' => 'email', 'type' => 'string', 'required' => true, 'desc' => 'Valid email address'], ['name' => 'phone', 'type' => 'string', 'required' => false, 'desc' => 'Phone number'], ['name' => 'company', 'type' => 'string', 'required' => false, 'desc' => 'Company name'], ['name' => 'job_title', 'type' => 'string', 'required' => false, 'desc' => 'Job title'], ['name' => 'city', 'type' => 'string', 'required' => false, 'desc' => 'City'], ['name' => 'country', 'type' => 'string', 'required' => false, 'desc' => 'Country'], ['name' => 'lead_score', 'type' => 'integer', 'required' => false, 'desc' => 'Lead score (0-100)'], ['name' => 'custom_fields', 'type' => 'object', 'required' => false, 'desc' => 'Custom field key-value pairs'], ['name' => 'tag_ids', 'type' => 'array', 'required' => false, 'desc' => 'Array of tag IDs to assign'], ], 'curl' => "curl -X POST '" . url('/api/v1/contacts') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"first_name\":\"Jane\",\"email\":\"jane@example.com\",\"company\":\"Acme\"}'", 'response' => '{ "data": { "id": 42, "first_name": "Jane", "last_name": null, "email": "jane@example.com", "company": "Acme", "lead_score": 0, "status": "active", "tags": [], "created_at": "2026-03-22T14:30:00Z" } }', ]) {{-- Show Contact --}} @include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/contacts/{id}', 'description' => 'Retrieve a single contact by ID.', 'params' => [], 'curl' => "curl -X GET '" . url('/api/v1/contacts/42') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": { "id": 42, "first_name": "Jane", "last_name": "Smith", "email": "jane@example.com", "conversations_count": 12, "deals_count": 3 } }', ]) {{-- Update Contact --}} @include('api-docs._endpoint', [ 'method' => 'PUT', 'path' => '/api/v1/contacts/{id}', 'description' => 'Update a contact. Only send fields you want to change.', 'params' => [ ['name' => 'first_name', 'type' => 'string', 'required' => false, 'desc' => 'Contact first name'], ['name' => 'email', 'type' => 'string', 'required' => false, 'desc' => 'Valid email address'], ['name' => 'status', 'type' => 'string', 'required' => false, 'desc' => 'active, inactive, or unsubscribed'], ['name' => 'tag_ids', 'type' => 'array', 'required' => false, 'desc' => 'Replace all tags with these IDs'], ], 'curl' => "curl -X PUT '" . url('/api/v1/contacts/42') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"lead_score\":90,\"status\":\"active\"}'", 'response' => '{ "data": { "id": 42, "first_name": "Jane", "lead_score": 90, "status": "active" } }', ]) {{-- Delete Contact --}} @include('api-docs._endpoint', [ 'method' => 'DELETE', 'path' => '/api/v1/contacts/{id}', 'description' => 'Soft-delete a contact.', 'params' => [], 'curl' => "curl -X DELETE '" . url('/api/v1/contacts/42') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN'", 'response' => '204 No Content', ]) {{-- Import Contacts --}} @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/contacts/import', 'description' => 'Import contacts from a CSV file. Rate limited to 5 req/min.', 'params' => [ ['name' => 'file', 'type' => 'file', 'required' => true, 'desc' => 'CSV/XLSX file (max 10MB). Headers: first_name, last_name, email, phone, company, etc.'], ], 'curl' => "curl -X POST '" . url('/api/v1/contacts/import') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -F 'file=@contacts.csv'", 'response' => '{ "data": { "imported": 142, "skipped": 3, "errors": ["Row 15: invalid email \'not-an-email\'"] } }', ]) {{-- Export Contacts --}} @include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/contacts/export', 'description' => 'Export all contacts as a streamed CSV download. Rate limited to 5 req/min.', 'params' => [], 'curl' => "curl -X GET '" . url('/api/v1/contacts/export') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -o contacts.csv", 'response' => 'Binary CSV file stream', ])
{{-- ── CONVERSATIONS ─────────────────────────────────────────── --}}

Conversations

Manage inbox conversations. Requires conversations scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/conversations', 'description' => 'List conversations with filters and pagination.', 'params' => [ ['name' => 'status', 'type' => 'string', 'required' => false, 'desc' => 'Filter: open, closed, snoozed'], ['name' => 'channel', 'type' => 'string', 'required' => false, 'desc' => 'Filter by channel: email, chat, whatsapp, sms'], ['name' => 'assigned_to', 'type' => 'integer', 'required' => false, 'desc' => 'Filter by assigned user ID'], ['name' => 'contact_id', 'type' => 'integer', 'required' => false, 'desc' => 'Filter by contact ID'], ['name' => 'per_page', 'type' => 'integer', 'required' => false, 'desc' => 'Results per page (max 100)'], ], 'curl' => "curl -X GET '" . url('/api/v1/conversations') . "?status=open' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ { "id": 1, "subject": "Billing question", "status": "open", "channel": "email", "contact": {"id": 5, "email": "user@example.com"}, "assigned_to": {"id": 2, "name": "Agent Smith"}, "last_message_at": "2026-03-22T09:30:00Z" } ], "meta": {"current_page": 1, "total": 24} }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/conversations/{id}/reply', 'description' => 'Send a reply to a conversation.', 'params' => [ ['name' => 'body', 'type' => 'string', 'required' => true, 'desc' => 'Reply message body (HTML supported)'], ['name' => 'internal', 'type' => 'boolean', 'required' => false, 'desc' => 'If true, add as internal note (not sent to contact)'], ], 'curl' => "curl -X POST '" . url('/api/v1/conversations/1/reply') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"body\":\"Thanks for reaching out! We will look into this.\"}'", 'response' => '{ "data": { "id": 145, "conversation_id": 1, "body": "Thanks for reaching out! We will look into this.", "type": "reply", "created_at": "2026-03-22T14:30:00Z" } }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/conversations/{id}/assign', 'description' => 'Assign a conversation to a team member.', 'params' => [ ['name' => 'user_id', 'type' => 'integer', 'required' => true, 'desc' => 'User ID to assign the conversation to'], ], 'curl' => "curl -X POST '" . url('/api/v1/conversations/1/assign') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"user_id\":3}'", 'response' => '{ "data": {"id": 1, "assigned_to": {"id": 3, "name": "Agent Jones"}} }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/conversations/{id}/close', 'description' => 'Close a conversation.', 'params' => [], 'curl' => "curl -X POST '" . url('/api/v1/conversations/1/close') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN'", 'response' => '{ "data": {"id": 1, "status": "closed"} }', ])
{{-- ── CAMPAIGNS ─────────────────────────────────────────────── --}}

Campaigns

Create and manage email campaigns. Requires campaigns scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/campaigns', 'description' => 'List campaigns with filters.', 'params' => [ ['name' => 'status', 'type' => 'string', 'required' => false, 'desc' => 'Filter: draft, scheduled, sending, sent, paused'], ['name' => 'type', 'type' => 'string', 'required' => false, 'desc' => 'Filter by campaign type'], ['name' => 'search', 'type' => 'string', 'required' => false, 'desc' => 'Search by name or subject'], ], 'curl' => "curl -X GET '" . url('/api/v1/campaigns') . "?status=sent' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ { "id": 1, "name": "March Newsletter", "subject": "What is new in March", "status": "sent", "sent_count": 1250, "open_rate": 34.5, "click_rate": 8.2, "created_at": "2026-03-01T08:00:00Z" } ] }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/campaigns', 'description' => 'Create a new campaign (draft).', 'params' => [ ['name' => 'name', 'type' => 'string', 'required' => true, 'desc' => 'Campaign name'], ['name' => 'subject', 'type' => 'string', 'required' => true, 'desc' => 'Email subject line'], ['name' => 'html_body', 'type' => 'string', 'required' => true, 'desc' => 'HTML email body'], ['name' => 'segment_id', 'type' => 'integer', 'required' => false, 'desc' => 'Segment ID to target'], ], 'curl' => "curl -X POST '" . url('/api/v1/campaigns') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"name\":\"April Promo\",\"subject\":\"Special offer inside\",\"html_body\":\"

Hello!

\"}'", 'response' => '{ "data": {"id": 15, "name": "April Promo", "status": "draft"} }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/campaigns/{id}/send', 'description' => 'Send or schedule a campaign. Rate limited to 5 req/min.', 'params' => [ ['name' => 'scheduled_at', 'type' => 'datetime', 'required' => false, 'desc' => 'ISO 8601 datetime to schedule (omit to send immediately)'], ], 'curl' => "curl -X POST '" . url('/api/v1/campaigns/15/send') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json'", 'response' => '{ "data": {"id": 15, "status": "sending"} }', ])
{{-- ── WORKFLOWS ─────────────────────────────────────────────── --}}

Workflows

Manage automation workflows. Requires workflows scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/workflows', 'description' => 'List all workflows.', 'params' => [], 'curl' => "curl -X GET '" . url('/api/v1/workflows') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ {"id": 1, "name": "Welcome Series", "status": "active", "trigger": "contact.created", "executions_count": 342} ] }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/workflows/{id}/activate', 'description' => 'Activate a paused workflow.', 'params' => [], 'curl' => "curl -X POST '" . url('/api/v1/workflows/1/activate') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN'", 'response' => '{"data": {"id": 1, "status": "active"}}', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/workflows/{id}/pause', 'description' => 'Pause an active workflow.', 'params' => [], 'curl' => "curl -X POST '" . url('/api/v1/workflows/1/pause') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN'", 'response' => '{"data": {"id": 1, "status": "paused"}}', ])
{{-- ── KNOWLEDGE BASE ────────────────────────────────────────── --}}

Knowledge Base

Manage KB documents for AI context. Requires knowledge-base scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/knowledge-base', 'description' => 'List knowledge base documents.', 'params' => [ ['name' => 'search', 'type' => 'string', 'required' => false, 'desc' => 'Search document titles'], ['name' => 'per_page', 'type' => 'integer', 'required' => false, 'desc' => 'Results per page'], ], 'curl' => "curl -X GET '" . url('/api/v1/knowledge-base') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ {"id": 1, "title": "Product FAQ", "type": "file", "file_size": 245760, "chunks_count": 24, "created_at": "2026-03-10T12:00:00Z"} ] }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/knowledge-base', 'description' => 'Upload a document to the knowledge base.', 'params' => [ ['name' => 'title', 'type' => 'string', 'required' => true, 'desc' => 'Document title'], ['name' => 'file', 'type' => 'file', 'required' => true, 'desc' => 'PDF, DOCX, or TXT file'], ], 'curl' => "curl -X POST '" . url('/api/v1/knowledge-base') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -F 'title=Return Policy' \\\n -F 'file=@return-policy.pdf'", 'response' => '{ "data": {"id": 5, "title": "Return Policy", "status": "processing"} }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/knowledge-base/scrape', 'description' => 'Scrape a website URL and add it to the knowledge base. Rate limited to 3 req/min.', 'params' => [ ['name' => 'url', 'type' => 'string', 'required' => true, 'desc' => 'URL to scrape'], ['name' => 'title', 'type' => 'string', 'required' => false, 'desc' => 'Custom title (auto-detected if omitted)'], ], 'curl' => "curl -X POST '" . url('/api/v1/knowledge-base/scrape') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"url\":\"https://example.com/help\"}'", 'response' => '{ "data": {"id": 6, "title": "Help Center", "type": "url", "status": "processing"} }', ])
{{-- ── AI ────────────────────────────────────────────────────── --}}

AI

AI-powered features. Requires ai scope. Stricter rate limits apply.

@include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/ai/generate-reply', 'description' => 'Generate an AI-powered reply for a conversation. Rate limited to 10 req/min.', 'params' => [ ['name' => 'conversation_id', 'type' => 'integer', 'required' => true, 'desc' => 'Conversation to generate a reply for'], ['name' => 'tone', 'type' => 'string', 'required' => false, 'desc' => 'Reply tone: professional, friendly, concise'], ['name' => 'instructions', 'type' => 'string', 'required' => false, 'desc' => 'Additional context for the AI'], ], 'curl' => "curl -X POST '" . url('/api/v1/ai/generate-reply') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"conversation_id\":1,\"tone\":\"professional\"}'", 'response' => '{ "data": { "reply": "Thank you for contacting us regarding your billing inquiry...", "tokens_used": 245, "model": "gpt-4" } }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/ai/analyze-sentiment', 'description' => 'Analyze the sentiment of a text or conversation. Rate limited to 20 req/min.', 'params' => [ ['name' => 'text', 'type' => 'string', 'required' => false, 'desc' => 'Text to analyze (provide this or conversation_id)'], ['name' => 'conversation_id', 'type' => 'integer', 'required' => false, 'desc' => 'Conversation ID to analyze'], ], 'curl' => "curl -X POST '" . url('/api/v1/ai/analyze-sentiment') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"text\":\"I am very frustrated with the late delivery\"}'", 'response' => '{ "data": { "sentiment": "negative", "score": -0.78, "emotions": ["frustration", "disappointment"], "urgency": "high" } }', ])
{{-- ── ANALYTICS ─────────────────────────────────────────────── --}}

Analytics

Read-only analytics data. Requires analytics scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/analytics/overview', 'description' => 'Get workspace analytics overview.', 'params' => [ ['name' => 'period', 'type' => 'string', 'required' => false, 'desc' => '7d, 30d, 90d (default: 30d)'], ], 'curl' => "curl -X GET '" . url('/api/v1/analytics/overview') . "?period=30d' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": { "conversations": {"total": 524, "open": 38, "avg_resolution_hours": 4.2}, "contacts": {"total": 12500, "new_this_period": 320}, "campaigns": {"sent": 8, "avg_open_rate": 32.1, "avg_click_rate": 6.8}, "ai": {"replies_generated": 186, "tokens_used": 45200} } }', ]) @include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/analytics/team', 'description' => 'Get team performance metrics.', 'params' => [ ['name' => 'period', 'type' => 'string', 'required' => false, 'desc' => '7d, 30d, 90d'], ], 'curl' => "curl -X GET '" . url('/api/v1/analytics/team') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ {"user_id": 2, "name": "Agent Smith", "conversations_handled": 142, "avg_response_minutes": 12, "satisfaction_score": 4.6} ] }', ])
{{-- ── TAGS ──────────────────────────────────────────────────── --}}

Tags

Manage workspace tags. Requires tags scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/tags', 'description' => 'List all tags in the workspace.', 'params' => [], 'curl' => "curl -X GET '" . url('/api/v1/tags') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ {"id": 1, "name": "VIP", "color": "#8B5CF6", "contacts_count": 42}, {"id": 2, "name": "Lead", "color": "#3B82F6", "contacts_count": 198} ] }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/tags', 'description' => 'Create a new tag.', 'params' => [ ['name' => 'name', 'type' => 'string', 'required' => true, 'desc' => 'Tag name (unique per workspace)'], ['name' => 'color', 'type' => 'string', 'required' => false, 'desc' => 'Hex color code (e.g. #8B5CF6)'], ], 'curl' => "curl -X POST '" . url('/api/v1/tags') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"name\":\"Enterprise\",\"color\":\"#EF4444\"}'", 'response' => '{ "data": {"id": 3, "name": "Enterprise", "color": "#EF4444"} }', ]) @include('api-docs._endpoint', [ 'method' => 'DELETE', 'path' => '/api/v1/tags/{id}', 'description' => 'Delete a tag. Contacts are NOT deleted.', 'params' => [], 'curl' => "curl -X DELETE '" . url('/api/v1/tags/3') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN'", 'response' => '204 No Content', ])
{{-- ── CANNED RESPONSES ──────────────────────────────────────── --}}

Canned Responses

Manage saved reply templates. Requires canned-responses scope.

@include('api-docs._endpoint', [ 'method' => 'GET', 'path' => '/api/v1/canned-responses', 'description' => 'List all canned responses.', 'params' => [], 'curl' => "curl -X GET '" . url('/api/v1/canned-responses') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Accept: application/json'", 'response' => '{ "data": [ {"id": 1, "title": "Greeting", "shortcut": "/greet", "body": "Hello! How can I help you today?"} ] }', ]) @include('api-docs._endpoint', [ 'method' => 'POST', 'path' => '/api/v1/canned-responses', 'description' => 'Create a new canned response.', 'params' => [ ['name' => 'title', 'type' => 'string', 'required' => true, 'desc' => 'Template title'], ['name' => 'shortcut', 'type' => 'string', 'required' => false, 'desc' => 'Slash command shortcut (e.g. /thanks)'], ['name' => 'body', 'type' => 'string', 'required' => true, 'desc' => 'Response body (HTML supported)'], ], 'curl' => "curl -X POST '" . url('/api/v1/canned-responses') . "' \\\n -H 'Authorization: Bearer YOUR_TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '{\"title\":\"Thanks\",\"shortcut\":\"/thanks\",\"body\":\"Thank you for your patience!\"}'", 'response' => '{ "data": {"id": 5, "title": "Thanks", "shortcut": "/thanks", "body": "Thank you for your patience!"} }', ])
{{-- ═══════════════════════════════════════════════════════════════ TRY IT (Interactive) ═══════════════════════════════════════════════════════════════ --}}

Try It

Test API endpoints directly from this page.