API Endpoints
All API requests go to api.switchboard.fpdigital.ai and require authentication.
Authentication
Section titled “Authentication”Include your token in the Authorization header:
Authorization: Bearer fps_unified_your_token_hereMCP Endpoints
Section titled “MCP Endpoints”Unified Endpoint
Section titled “Unified Endpoint”Access all connected services through a single endpoint.
| URL | POST /mcp/unified |
| Token | fps_unified_* |
Per-Service Endpoints
Section titled “Per-Service Endpoints”Access a single service.
| URL | POST /mcp/{service} |
| Token | fps_{service}_* |
| Services | google, slack, hubspot, notion, quickbooks, github, cloudflare, apollo, teamwork, pandadoc, n8n, figma |
Bundle Endpoints
Section titled “Bundle Endpoints”Access a custom bundle.
| URL | POST /mcp/bundle/{bundle_id} |
| Token | fps_bundle_* |
Example Requests
Section titled “Example Requests”List Available Tools
Section titled “List Available Tools”curl -X POST https://api.switchboard.fpdigital.ai/mcp/unified \ -H "Authorization: Bearer fps_unified_xxx" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'const response = await fetch('https://api.switchboard.fpdigital.ai/mcp/unified', { method: 'POST', headers: { 'Authorization': 'Bearer fps_unified_xxx', 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' })});const { result } = await response.json();console.log(result.tools);import requests
response = requests.post( 'https://api.switchboard.fpdigital.ai/mcp/unified', headers={ 'Authorization': 'Bearer fps_unified_xxx', 'Content-Type': 'application/json' }, json={ 'jsonrpc': '2.0', 'id': 1, 'method': 'tools/list' })tools = response.json()['result']['tools']Execute a Tool
Section titled “Execute a Tool”curl -X POST https://api.switchboard.fpdigital.ai/mcp/unified \ -H "Authorization: Bearer fps_unified_xxx" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "gmail_search", "arguments": { "query": "is:unread", "max_results": 10 } } }'const response = await fetch('https://api.switchboard.fpdigital.ai/mcp/unified', { method: 'POST', headers: { 'Authorization': 'Bearer fps_unified_xxx', 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call', params: { name: 'gmail_search', arguments: { query: 'is:unread', max_results: 10 } } })});const { result, error } = await response.json();if (error) { console.error(error.message);} else { console.log(result.content[0].text);}Dashboard Endpoints
Section titled “Dashboard Endpoints”These endpoints are used by the dashboard UI and protected by Cloudflare Access.
| Endpoint | Method | Description |
|---|---|---|
/dashboard | GET | Main dashboard |
/dashboard/services/:service | GET | Service detail page |
/dashboard/bundles | GET | Bundle management |
/admin | GET | Admin panel (org admins) |
/admin/users | GET | User management |
/admin/policies | GET | Policy rules |
/admin/dlp | GET | DLP settings |
OAuth Endpoints
Section titled “OAuth Endpoints”Used during service connection flow.
| Endpoint | Description |
|---|---|
/oauth/{service}/authorize | Initiate OAuth flow |
/oauth/{service}/callback | OAuth callback handler |
/oauth/{service}/connect | API key connection (non-OAuth services) |
Health & Status
Section titled “Health & Status”Health Check
Section titled “Health Check”curl https://api.switchboard.fpdigital.ai/healthResponse:
{ "status": "healthy", "version": "4.6.2", "timestamp": "2024-01-15T10:30:00Z"}Service Status
Section titled “Service Status”Check individual service health:
curl https://api.switchboard.fpdigital.ai/status/googleResponse:
{ "service": "google", "status": "operational", "latency_ms": 45, "last_check": "2024-01-15T10:29:00Z"}Rate Limits
Section titled “Rate Limits”All endpoints are rate limited:
| Endpoint Type | Limit |
|---|---|
| MCP endpoints | 100 req/min |
| Dashboard | 60 req/min |
| OAuth flows | 10 req/min |
Rate limit information is returned in headers:
X-RateLimit-Limit: 100X-RateLimit-Remaining: 95X-RateLimit-Reset: 1705312800The API supports CORS for browser-based requests:
Access-Control-Allow-Origin: *(for MCP endpoints)Access-Control-Allow-Methods: POST, OPTIONSAccess-Control-Allow-Headers: Authorization, Content-Type
Errors
Section titled “Errors”All errors follow this format:
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32000, "message": "Human-readable error message", "data": { "errorCode": "MACHINE_READABLE_CODE", "details": "Additional context" } }}See MCP Protocol for the complete error code reference.