API Endpoints
All API requests go to api.switchboard.fpdigital.ai and require authentication. v4.10.14
Authentication
Section titled “Authentication”Include your token in the Authorization header:
Authorization: Bearer fps_unified_your_token_here| Token Type | Format | Scope |
|---|---|---|
| Per-Service | fps_google_xxx | Single service only |
| Per-Account | fps_google_work_xxx | Single account of a service |
| Unified | fps_unified_xxx | All connected services |
| Bundle | fps_bundle_xxx | Custom bundle of services |
MCP 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}_* |
Available services (32):
| Service | Endpoint | Tools |
|---|---|---|
| Google Workspace | /mcp/google | 69 |
| Slack | /mcp/slack | 48 |
| Notion | /mcp/notion | 21 |
| QuickBooks | /mcp/quickbooks | 49 |
| HubSpot | /mcp/hubspot | 33 |
| Asana | /mcp/asana | 45 |
| Teamwork | /mcp/teamwork | 52 |
| Figma | /mcp/figma | 33 |
| Canva | /mcp/canva | 23 |
| PandaDoc | /mcp/pandadoc | 22 |
| Cloudflare | /mcp/cloudflare | 28 |
/mcp/instagram | 23 | |
| Salesforce | /mcp/salesforce | 55 |
| Sage Intacct | /mcp/sage | 48 |
/mcp/linkedin | 30 | |
| WordPress | /mcp/wordpress | 45 |
/mcp/facebook | 30 | |
| Facebook Ads | /mcp/facebookads | 35 |
| Google Analytics | /mcp/googleanalytics | 25 |
| Google Ads | /mcp/googleads | 30 |
/mcp/pinterest | 30 | |
| ManyChat | /mcp/manychat | 30 |
| n8n | /mcp/n8n | 25 |
| Fathom Analytics | /mcp/fathom | 20 |
| Fathom AI | /mcp/fathom_ai | 20 |
| GitHub | /mcp/github | 36 |
| Microsoft 365 | /mcp/microsoft365 | 45 |
| Teams | /mcp/teams | 25 |
| SharePoint | /mcp/sharepoint | 30 |
| WhatsApp Business | /mcp/whatsapp | 20 |
| Cloudflare Tenant | /mcp/cloudflare_tenant | 15 |
| Jira Cloud | /mcp/jira | 53 |
Bundle Endpoints
Section titled “Bundle Endpoints”Access a custom bundle of services.
| URL | POST /mcp/bundle/{bundle_id} |
| Token | fps_bundle_* |
Dynamic Loading
Section titled “Dynamic Loading”Add ?dynamic=true to any MCP endpoint for 96% token reduction. Returns 3 meta-tools instead of the full tool list.
| URL | POST /mcp/unified?dynamic=true |
| Meta-tools | switchboard_search_tools, switchboard_get_tool_details, switchboard_execute_tool |
See Dynamic Tool Loading for details.
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);}Dynamic Loading Example
Section titled “Dynamic Loading Example”# Step 1: Search for toolscurl -X POST "https://api.switchboard.fpdigital.ai/mcp/unified?dynamic=true" \ -H "Authorization: Bearer fps_unified_xxx" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "switchboard_search_tools", "arguments": { "query": "email search" } } }'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 |
/dashboard/prompt-generator | GET | AI prompt generator |
/admin | GET | Admin panel (org admins) |
/admin/users | GET | User management |
/admin/policies | GET | Policy rules |
/admin/dlp | GET | DLP settings |
/admin/analytics | GET | Usage analytics |
/guides/:service | GET | Setup guides |
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 and Status
Section titled “Health and Status”Health Check
Section titled “Health Check”curl https://api.switchboard.fpdigital.ai/healthResponse:
{ "status": "healthy", "version": "4.10.14", "timestamp": "2026-02-08T10:30: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.