
Api Gateway
- 9 installs
- 82 repo stars
- Updated August 2, 2026
- aaaaqwq/claude-code-skills
api-gateway is a Claude Code skill that provides a Maton-managed passthrough proxy for calling 100+ third-party APIs with managed OAuth using a single API key.
About
api-gateway is a Claude Code skill that lets an agent call 100+ third-party APIs through Maton's managed-OAuth passthrough proxy. A developer uses it to hit native endpoints (for example Slack chat.postMessage or Gmail messages) via a single base URL and API key, with Maton injecting the right OAuth token. It bundles routing references documenting each service's path patterns and manages connections through a separate control API.
- Passthrough proxy to call 100+ third-party APIs (Google Workspace, Microsoft 365, GitHub, Notion, Slack, etc.) with mana
- One MATON_API_KEY authenticates with Maton; each service needs explicit user OAuth authorization
- Ships per-service routing references (base URL and endpoint patterns) for dozens of apps
Api Gateway by the numbers
- 9 all-time installs (skills.sh)
- Ranked #3,593 of 4,348 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
api-gateway capabilities & compatibility
requires a Maton account and MATON_API_KEY; sign up at maton.ai
- Capabilities
- api proxy · oauth management · saas integration · connection management
- Works with
- slack · gmail · github · notion · google drive · jira · confluence · linkedin
- Use cases
- api development
- Runs
- Remote server
- Pricing
- Bring your own API key
What api-gateway says it does
Passthrough proxy for direct access to third-party APIs using managed OAuth connections, provided by [Maton](https://maton.ai). The API gateway lets you call native API endpoints directly.
The MATON_API_KEY authenticates with Maton.ai but grants NO access to third-party services by itself.
npx skills add https://github.com/aaaaqwq/claude-code-skills --skill api-gatewayAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 9 |
|---|---|
| repo stars | ★ 82 |
| Last updated | August 2, 2026 |
| Repository | aaaaqwq/claude-code-skills ↗ |
What it does
A developer uses it to give an agent OAuth-authenticated access to 100+ external SaaS APIs through one proxy and key.
Who is it for?
Calling many external SaaS APIs from an agent with managed OAuth and one key
Skip if: Tasks that do not need third-party service access
When should I use this skill?
Users want to interact with external services such as Slack, Gmail, Notion, HubSpot, or Google Workspace
What you get
- authenticated third-party API calls
- managed OAuth connections
By the numbers
- Connects to 100+ third-party APIs
- Bundles dozens of per-service routing references (Slack, Gmail, HubSpot, Jira, Notion, etc.)
Files
API Gateway
Passthrough proxy for direct access to third-party APIs using managed OAuth connections, provided by Maton. The API gateway lets you call native API endpoints directly.
Quick Start
# Native Slack API call
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello from gateway!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFBase URL
https://gateway.maton.ai/{app}/{native-api-path}Replace {app} with the service name and {native-api-path} with the actual API endpoint path.
IMPORTANT: The URL path MUST start with the connection's app name (eg. /google-mail/...). This prefix tells the gateway which app connection to use. For example, the native Gmail API path starts with gmail/v1/, so full paths look like /google-mail/gmail/v1/users/me/messages.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEYThe API gateway automatically injects the appropriate OAuth token for the target service.
Environment Variable: You can set your API key as the MATON_API_KEY environment variable:
export MATON_API_KEY="YOUR_API_KEY"Getting Your API Key
1. Sign in or create an account at maton.ai 2. Go to maton.ai/settings 3. Click the copy button on the right side of API Key section to copy it
Connection Management
Connection management uses a separate base URL: https://ctrl.maton.ai
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=slack&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFQuery Parameters (optional):
app- Filter by service name (e.g.,slack,hubspot,salesforce)status- Filter by connection status (ACTIVE,PENDING,FAILED)
Response:
{
"connections": [
{
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=5e9...",
"app": "slack",
"method": "OAUTH2",
"metadata": {}
}
]
}Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'slack'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFRequest Body:
app(required) - Service name (e.g.,slack,notion)method(optional) - Connection method (API_KEY,BASIC,OAUTH1,OAUTH2,MCP)
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=5e9...",
"app": "slack",
"metadata": {}
}
}Open the returned URL in a browser to complete OAuth.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFSpecifying Connection
If you have multiple connections for the same app, you can specify which connection to use by adding the Maton-Connection header with the connection ID:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFIf omitted, the gateway uses the default (oldest) active connection for that app.
Supported Services
| Service | App Name | Base URL Proxied |
|---|---|---|
| ActiveCampaign | active-campaign | {account}.api-us1.com |
| Acuity Scheduling | acuity-scheduling | acuityscheduling.com |
| Airtable | airtable | api.airtable.com |
| Apollo | apollo | api.apollo.io |
| Asana | asana | app.asana.com |
| Attio | attio | api.attio.com |
| Basecamp | basecamp | 3.basecampapi.com |
| Baserow | baserow | api.baserow.io |
| beehiiv | beehiiv | api.beehiiv.com |
| Box | box | api.box.com |
| Brevo | brevo | api.brevo.com |
| Calendly | calendly | api.calendly.com |
| Cal.com | cal-com | api.cal.com |
| CallRail | callrail | api.callrail.com |
| Chargebee | chargebee | {subdomain}.chargebee.com |
| ClickFunnels | clickfunnels | {subdomain}.myclickfunnels.com |
| ClickSend | clicksend | rest.clicksend.com |
| ClickUp | clickup | api.clickup.com |
| Clockify | clockify | api.clockify.me |
| Coda | coda | coda.io |
| Confluence | confluence | api.atlassian.com |
| CompanyCam | companycam | api.companycam.com |
| Cognito Forms | cognito-forms | www.cognitoforms.com |
| Constant Contact | constant-contact | api.cc.email |
| Dropbox | dropbox | api.dropboxapi.com |
| Dropbox Business | dropbox-business | api.dropboxapi.com |
| ElevenLabs | elevenlabs | api.elevenlabs.io |
| Eventbrite | eventbrite | www.eventbriteapi.com |
| Exa | exa | api.exa.ai |
| Fathom | fathom | api.fathom.ai |
| Firebase | firebase | firebase.googleapis.com |
| Fireflies | fireflies | api.fireflies.ai |
| GetResponse | getresponse | api.getresponse.com |
| Grafana | grafana | User's Grafana instance |
| GitHub | github | api.github.com |
| Gumroad | gumroad | api.gumroad.com |
| Granola MCP | granola | mcp.granola.ai |
| Google Ads | google-ads | googleads.googleapis.com |
| Google BigQuery | google-bigquery | bigquery.googleapis.com |
| Google Analytics Admin | google-analytics-admin | analyticsadmin.googleapis.com |
| Google Analytics Data | google-analytics-data | analyticsdata.googleapis.com |
| Google Calendar | google-calendar | www.googleapis.com |
| Google Classroom | google-classroom | classroom.googleapis.com |
| Google Contacts | google-contacts | people.googleapis.com |
| Google Docs | google-docs | docs.googleapis.com |
| Google Drive | google-drive | www.googleapis.com |
| Google Forms | google-forms | forms.googleapis.com |
| Gmail | google-mail | gmail.googleapis.com |
| Google Merchant | google-merchant | merchantapi.googleapis.com |
| Google Meet | google-meet | meet.googleapis.com |
| Google Play | google-play | androidpublisher.googleapis.com |
| Google Search Console | google-search-console | www.googleapis.com |
| Google Sheets | google-sheets | sheets.googleapis.com |
| Google Slides | google-slides | slides.googleapis.com |
| Google Tasks | google-tasks | tasks.googleapis.com |
| Google Workspace Admin | google-workspace-admin | admin.googleapis.com |
| HubSpot | hubspot | api.hubapi.com |
| Instantly | instantly | api.instantly.ai |
| Jira | jira | api.atlassian.com |
| Jobber | jobber | api.getjobber.com |
| JotForm | jotform | api.jotform.com |
| Kaggle | kaggle | api.kaggle.com |
| Keap | keap | api.infusionsoft.com |
| Kibana | kibana | User's Kibana instance |
| Kit | kit | api.kit.com |
| Klaviyo | klaviyo | a.klaviyo.com |
| Lemlist | lemlist | api.lemlist.com |
| Linear | linear | api.linear.app |
linkedin | api.linkedin.com | |
| Mailchimp | mailchimp | {dc}.api.mailchimp.com |
| MailerLite | mailerlite | connect.mailerlite.com |
| Mailgun | mailgun | api.mailgun.net |
| ManyChat | manychat | api.manychat.com |
| Manus | manus | api.manus.ai |
| Microsoft Excel | microsoft-excel | graph.microsoft.com |
| Microsoft Teams | microsoft-teams | graph.microsoft.com |
| Microsoft To Do | microsoft-to-do | graph.microsoft.com |
| Monday.com | monday | api.monday.com |
| Motion | motion | api.usemotion.com |
| Netlify | netlify | api.netlify.com |
| Notion | notion | api.notion.com |
| Notion MCP | notion | mcp.notion.com |
| OneDrive | one-drive | graph.microsoft.com |
| Outlook | outlook | graph.microsoft.com |
| PDF.co | pdf-co | api.pdf.co |
| Pipedrive | pipedrive | api.pipedrive.com |
| Podio | podio | api.podio.com |
| PostHog | posthog | {subdomain}.posthog.com |
| QuickBooks | quickbooks | quickbooks.api.intuit.com |
| Quo | quo | api.openphone.com |
| Reducto | reducto | platform.reducto.ai |
| Salesforce | salesforce | {instance}.salesforce.com |
| Sentry | sentry | {subdomain}.sentry.io |
| SharePoint | sharepoint | graph.microsoft.com |
| SignNow | signnow | api.signnow.com |
| Slack | slack | slack.com |
| Snapchat | snapchat | adsapi.snapchat.com |
| Square | squareup | connect.squareup.com |
| Squarespace | squarespace | api.squarespace.com |
| Sunsama MCP | sunsama | MCP server |
| Stripe | stripe | api.stripe.com |
| Systeme.io | systeme | api.systeme.io |
| Tally | tally | api.tally.so |
| Tavily | tavily | api.tavily.com |
| Telegram | telegram | api.telegram.org |
| TickTick | ticktick | api.ticktick.com |
| Todoist | todoist | api.todoist.com |
| Toggl Track | toggl-track | api.track.toggl.com |
| Trello | trello | api.trello.com |
| Twilio | twilio | api.twilio.com |
| Typeform | typeform | api.typeform.com |
| Unbounce | unbounce | api.unbounce.com |
| Vimeo | vimeo | api.vimeo.com |
| WhatsApp Business | whatsapp-business | graph.facebook.com |
| WooCommerce | woocommerce | {store-url}/wp-json/wc/v3 |
| WordPress.com | wordpress | public-api.wordpress.com |
| Xero | xero | api.xero.com |
| YouTube | youtube | www.googleapis.com |
| Zoho Bigin | zoho-bigin | www.zohoapis.com |
| Zoho Bookings | zoho-bookings | www.zohoapis.com |
| Zoho Books | zoho-books | www.zohoapis.com |
| Zoho Calendar | zoho-calendar | calendar.zoho.com |
| Zoho CRM | zoho-crm | www.zohoapis.com |
| Zoho Inventory | zoho-inventory | www.zohoapis.com |
| Zoho Mail | zoho-mail | mail.zoho.com |
| Zoho People | zoho-people | people.zoho.com |
| Zoho Projects | zoho-projects | projectsapi.zoho.com |
| Zoho Recruit | zoho-recruit | recruit.zoho.com |
See references/ for detailed routing guides per provider:
- ActiveCampaign - Contacts, deals, tags, lists, automations, campaigns
- Acuity Scheduling - Appointments, calendars, clients, availability
- Airtable - Records, bases, tables
- Apollo - People search, enrichment, contacts
- Asana - Tasks, projects, workspaces, webhooks
- Attio - People, companies, records, tasks
- Basecamp - Projects, to-dos, messages, schedules, documents
- Baserow - Database rows, fields, tables, batch operations
- beehiiv - Publications, subscriptions, posts, custom fields
- Box - Files, folders, collaborations, shared links
- Brevo - Contacts, email campaigns, transactional emails, templates
- Calendly - Event types, scheduled events, availability, webhooks
- Cal.com - Event types, bookings, schedules, availability slots, webhooks
- CallRail - Calls, trackers, companies, tags, analytics
- Chargebee - Subscriptions, customers, invoices
- ClickFunnels - Contacts, products, orders, courses, webhooks
- ClickSend - SMS, MMS, voice messages, contacts, lists
- ClickUp - Tasks, lists, folders, spaces, webhooks
- Clockify - Time tracking, projects, clients, tasks, workspaces
- Coda - Docs, pages, tables, rows, formulas, controls
- Confluence - Pages, spaces, blogposts, comments, attachments
- CompanyCam - Projects, photos, users, tags, groups, documents
- Cognito Forms - Forms, entries, documents, files
- Constant Contact - Contacts, email campaigns, lists, segments
- Dropbox - Files, folders, search, metadata, revisions, tags
- Dropbox Business - Team members, groups, team folders, devices, audit logs
- ElevenLabs - Text-to-speech, voice cloning, sound effects, audio processing
- Eventbrite - Events, venues, tickets, orders, attendees
- Exa - Neural web search, content extraction, similar pages, AI answers, research tasks
- Fathom - Meeting recordings, transcripts, summaries, webhooks
- Firebase - Projects, web apps, Android apps, iOS apps, configurations
- Fireflies - Meeting transcripts, summaries, AskFred AI, channels
- GetResponse - Campaigns, contacts, newsletters, autoresponders, tags, segments
- Grafana - Dashboards, data sources, folders, annotations, alerts, teams
- GitHub - Repositories, issues, pull requests, commits
- Gumroad - Products, sales, subscribers, licenses, webhooks
- Granola MCP - MCP-based interface for meeting notes, transcripts, queries
- Google Ads - Campaigns, ad groups, GAQL queries
- Google Analytics Admin - Reports, dimensions, metrics
- Google Analytics Data - Reports, dimensions, metrics
- Google BigQuery - Datasets, tables, jobs, SQL queries
- Google Calendar - Events, calendars, free/busy
- Google Classroom - Courses, coursework, students, teachers, announcements
- Google Contacts - Contacts, contact groups, people search
- Google Docs - Document creation, batch updates
- Google Drive - Files, folders, permissions
- Google Forms - Forms, questions, responses
- Gmail - Messages, threads, labels
- Google Meet - Spaces, conference records, participants
- Google Merchant - Products, inventories, promotions, reports
- Google Play - In-app products, subscriptions, reviews
- Google Search Console - Search analytics, sitemaps
- Google Sheets - Values, ranges, formatting
- Google Slides - Presentations, slides, formatting
- Google Tasks - Task lists, tasks, subtasks
- Google Workspace Admin - Users, groups, org units, domains, roles
- HubSpot - Contacts, companies, deals
- Instantly - Campaigns, leads, accounts, email outreach
- Jira - Issues, projects, JQL queries
- Jobber - Clients, jobs, invoices, quotes (GraphQL)
- JotForm - Forms, submissions, webhooks
- Kaggle - Datasets, models, competitions, kernels
- Keap - Contacts, companies, tags, tasks, opportunities, campaigns
- Kibana - Saved objects, dashboards, data views, spaces, alerts, fleet
- Kit - Subscribers, tags, forms, sequences, broadcasts
- Klaviyo - Profiles, lists, campaigns, flows, events
- Lemlist - Campaigns, leads, activities, schedules, unsubscribes
- Linear - Issues, projects, teams, cycles (GraphQL)
- LinkedIn - Profile, posts, shares, media uploads
- Mailchimp - Audiences, campaigns, templates, automations
- MailerLite - Subscribers, groups, campaigns, automations, forms
- Mailgun - Email sending, domains, routes, templates, mailing lists, suppressions
- ManyChat - Subscribers, tags, flows, messaging
- Manus - AI agent tasks, projects, files, webhooks
- Microsoft Excel - Workbooks, worksheets, ranges, tables, charts
- Microsoft Teams - Teams, channels, messages, members, chats
- Microsoft To Do - Task lists, tasks, checklist items, linked resources
- Monday.com - Boards, items, columns, groups (GraphQL)
- Motion - Tasks, projects, workspaces, schedules
- Netlify - Sites, deploys, builds, DNS, environment variables
- Notion - Pages, databases, blocks
- Notion MCP - MCP-based interface for pages, databases, comments, teams, users
- OneDrive - Files, folders, drives, sharing
- Outlook - Mail, calendar, contacts
- PDF.co - PDF conversion, merge, split, edit, text extraction, barcodes
- Pipedrive - Deals, persons, organizations, activities
- Podio - Organizations, workspaces, apps, items, tasks, comments
- PostHog - Product analytics, feature flags, session recordings, experiments, HogQL queries
- QuickBooks - Customers, invoices, reports
- Quo - Calls, messages, contacts, conversations, webhooks
- Reducto - Document parsing, extraction, splitting, editing
- Salesforce - SOQL, sObjects, CRUD
- SignNow - Documents, templates, invites, e-signatures
- SendGrid - Email sending, contacts, templates, suppressions, statistics
- Sentry - Issues, events, projects, teams, releases
- SharePoint - Sites, lists, document libraries, files, folders, versions
- Slack - Messages, channels, users
- Snapchat - Ad accounts, campaigns, ad squads, ads, creatives, audiences
- Square - Payments, customers, orders, catalog, inventory, invoices
- Squarespace - Products, inventory, orders, profiles, transactions
- Sunsama MCP - MCP-based interface for tasks, calendar, backlog, objectives, time tracking
- Stripe - Customers, subscriptions, payments
- Systeme.io - Contacts, tags, courses, communities, webhooks
- Tally - Forms, submissions, workspaces, webhooks
- Tavily - AI web search, content extraction, crawling, research tasks
- Telegram - Messages, chats, bots, updates, polls
- TickTick - Tasks, projects, task lists
- Todoist - Tasks, projects, sections, labels, comments
- Toggl Track - Time entries, projects, clients, tags, workspaces
- Trello - Boards, lists, cards, checklists
- Twilio - SMS, voice calls, phone numbers, messaging
- Typeform - Forms, responses, insights
- Unbounce - Landing pages, leads, accounts, sub-accounts, domains
- Vimeo - Videos, folders, albums, comments, likes
- WhatsApp Business - Messages, templates, media
- WooCommerce - Products, orders, customers, coupons
- WordPress.com - Posts, pages, sites, users, settings
- Xero - Contacts, invoices, reports
- YouTube - Videos, playlists, channels, subscriptions
- Zoho Bigin - Contacts, companies, pipelines, products
- Zoho Bookings - Appointments, services, staff, workspaces
- Zoho Books - Invoices, contacts, bills, expenses
- Zoho Calendar - Calendars, events, attendees, reminders
- Zoho CRM - Leads, contacts, accounts, deals, search
- Zoho Inventory - Items, sales orders, invoices, purchase orders, bills
- Zoho Mail - Messages, folders, labels, attachments
- Zoho People - Employees, departments, designations, attendance, leave
- Zoho Projects - Projects, tasks, milestones, tasklists, comments
- Zoho Recruit - Candidates, job openings, interviews, applications
Examples
Slack - Post Message (Native API)
# Native Slack API: POST https://slack.com/api/chat.postMessage
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json; charset=utf-8')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFHubSpot - Create Contact (Native API)
# Native HubSpot API: POST https://api.hubapi.com/crm/v3/objects/contacts
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'properties': {'email': 'john@example.com', 'firstname': 'John', 'lastname': 'Doe'}}).encode()
req = urllib.request.Request('https://gateway.maton.ai/hubspot/crm/v3/objects/contacts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGoogle Sheets - Get Spreadsheet Values (Native API)
# Native Sheets API: GET https://sheets.googleapis.com/v4/spreadsheets/{id}/values/{range}
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/google-sheets/v4/spreadsheets/122BS1sFN2RKL8AOUQjkLdubzOwgqzPT64KfZ2rvYI4M/values/Sheet1!A1:B2')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFSalesforce - SOQL Query (Native API)
# Native Salesforce API: GET https://{instance}.salesforce.com/services/data/v64.0/query?q=...
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v64.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFAirtable - List Tables (Native API)
# Native Airtable API: GET https://api.airtable.com/v0/meta/bases/{id}/tables
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/airtable/v0/meta/bases/appgqan2NzWGP5sBK/tables')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFNotion - Query Database (Native API)
# Native Notion API: POST https://api.notion.com/v1/data_sources/{id}/query
python <<'EOF'
import urllib.request, os, json
data = json.dumps({}).encode()
req = urllib.request.Request('https://gateway.maton.ai/notion/v1/data_sources/23702dc5-9a3b-8001-9e1c-000b5af0a980/query', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Notion-Version', '2025-09-03')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFStripe - List Customers (Native API)
# Native Stripe API: GET https://api.stripe.com/v1/customers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/stripe/v1/customers?limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCode Examples
JavaScript (Node.js)
const response = await fetch('https://gateway.maton.ai/slack/api/chat.postMessage', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({ channel: 'C0123456', text: 'Hello!' })
});Python
import os
import requests
response = requests.post(
'https://gateway.maton.ai/slack/api/chat.postMessage',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
json={'channel': 'C0123456', 'text': 'Hello!'}
)Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing connection for the requested app |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 requests/second per account) |
| 500 | Internal Server Error |
| 4xx/5xx | Passthrough error from the target API |
Errors from the target API are passed through with their original status codes and response bodies.
Troubleshooting: API Key Issues
1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY2. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFTroubleshooting: Invalid App Name
1. Verify your URL path starts with the correct app name. The path must begin with /google-mail/. For example:
- Correct:
https://gateway.maton.ai/google-mail/gmail/v1/users/me/messages - Incorrect:
https://gateway.maton.ai/gmail/v1/users/me/messages
2. Ensure you have an active connection for the app. List your connections to verify:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=google-mail&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFTroubleshooting: Server Error
A 500 error may indicate an expired OAuth token. Try creating a new connection via the Connection Management section above and completing OAuth authorization. If the new connection is "ACTIVE", delete the old connection to ensure the gateway uses the new one.
Rate Limits
- 10 requests per second per account
- Target API rate limits also apply
Notes
- When using curl with URLs containing brackets (
fields[],sort[],records[]), use the-gflag to disable glob parsing - When piping curl output to
jq, environment variables may not expand correctly in some shells, which can cause "Invalid API key" errors
Tips
1. Use native API docs: Refer to each service's official API documentation for endpoint paths and parameters.
2. Headers are forwarded: Custom headers (except Host and Authorization) are forwarded to the target API.
3. Query params work: URL query parameters are passed through to the target API.
4. All HTTP methods supported: GET, POST, PUT, PATCH, DELETE are all supported.
5. QuickBooks special case: Use :realmId in the path and it will be replaced with the connected realm ID.
Optional
{
"ownerId": "kn75240wq8bnv2qm2xgry748jd80b9r0",
"slug": "api-gateway",
"version": "1.0.62",
"publishedAt": 1773006198444
}The MIT License (MIT)
Copyright (c) 2026 Maton
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
ActiveCampaign Routing Reference
App name: active-campaign Base URL proxied: {account}.api-us1.com
API Path Pattern
/active-campaign/api/3/{resource}Common Endpoints
Contacts
List Contacts
GET /active-campaign/api/3/contactsGet Contact
GET /active-campaign/api/3/contacts/{contactId}Create Contact
POST /active-campaign/api/3/contacts
Content-Type: application/json
{
"contact": {
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe"
}
}Update Contact
PUT /active-campaign/api/3/contacts/{contactId}Delete Contact
DELETE /active-campaign/api/3/contacts/{contactId}Tags
List Tags
GET /active-campaign/api/3/tagsCreate Tag
POST /active-campaign/api/3/tags
Content-Type: application/json
{
"tag": {
"tag": "Tag Name",
"tagType": "contact"
}
}Contact Tags
Add Tag to Contact
POST /active-campaign/api/3/contactTags
Content-Type: application/json
{
"contactTag": {
"contact": "1",
"tag": "1"
}
}Remove Tag from Contact
DELETE /active-campaign/api/3/contactTags/{contactTagId}Lists
List All Lists
GET /active-campaign/api/3/listsCreate List
POST /active-campaign/api/3/listsDeals
List Deals
GET /active-campaign/api/3/dealsCreate Deal
POST /active-campaign/api/3/deals
Content-Type: application/json
{
"deal": {
"title": "New Deal",
"value": "10000",
"currency": "usd",
"contact": "1",
"stage": "1"
}
}Deal Stages & Pipelines
List Deal Stages
GET /active-campaign/api/3/dealStagesList Pipelines (Deal Groups)
GET /active-campaign/api/3/dealGroupsAutomations
List Automations
GET /active-campaign/api/3/automationsCampaigns
List Campaigns
GET /active-campaign/api/3/campaignsUsers
List Users
GET /active-campaign/api/3/usersAccounts
List Accounts
GET /active-campaign/api/3/accountsCustom Fields
List Fields
GET /active-campaign/api/3/fieldsNotes
List Notes
GET /active-campaign/api/3/notesWebhooks
List Webhooks
GET /active-campaign/api/3/webhooksPagination
Uses offset-based pagination:
GET /active-campaign/api/3/contacts?limit=20&offset=0Parameters:
limit- Results per page (default: 20)offset- Starting index
Response includes meta with total:
{
"contacts": [...],
"meta": {
"total": "150"
}
}Notes
- All endpoints require
/api/3/prefix - Request bodies use singular resource names (e.g.,
{"contact": {...}}) - IDs returned as strings
- Rate limit: 5 requests per second per account
- DELETE returns 200 OK (not 204)
Resources
Acuity Scheduling Routing Reference
App name: acuity-scheduling Base URL proxied: acuityscheduling.com
API Path Pattern
/acuity-scheduling/api/v1/{resource}The gateway automatically prepends /api/v1 when proxying to Acuity.
Common Endpoints
Get Account Info
GET /acuity-scheduling/api/v1/meList Appointments
GET /acuity-scheduling/api/v1/appointments?max=100&minDate=2026-02-01Get Appointment
GET /acuity-scheduling/api/v1/appointments/{id}Create Appointment
POST /acuity-scheduling/api/v1/appointments
Content-Type: application/json
{
"datetime": "2026-02-15T09:00",
"appointmentTypeID": 123,
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com"
}Update Appointment
PUT /acuity-scheduling/api/v1/appointments/{id}
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Smith"
}Cancel Appointment
PUT /acuity-scheduling/api/v1/appointments/{id}/cancelReschedule Appointment
PUT /acuity-scheduling/api/v1/appointments/{id}/reschedule
Content-Type: application/json
{
"datetime": "2026-02-20T10:00"
}List Calendars
GET /acuity-scheduling/api/v1/calendarsList Appointment Types
GET /acuity-scheduling/api/v1/appointment-typesGet Available Dates
GET /acuity-scheduling/api/v1/availability/dates?month=2026-02&appointmentTypeID=123Get Available Times
GET /acuity-scheduling/api/v1/availability/times?date=2026-02-04&appointmentTypeID=123List Clients
GET /acuity-scheduling/api/v1/clients?search=JohnCreate Client
POST /acuity-scheduling/api/v1/clients
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com"
}List Blocks
GET /acuity-scheduling/api/v1/blocks?calendarID=1234Create Block
POST /acuity-scheduling/api/v1/blocks
Content-Type: application/json
{
"start": "2026-02-15T12:00",
"end": "2026-02-15T13:00",
"calendarID": 1234
}Delete Block
DELETE /acuity-scheduling/api/v1/blocks/{id}List Forms
GET /acuity-scheduling/api/v1/formsList Labels
GET /acuity-scheduling/api/v1/labelsNotes
- Datetime values must be parseable by PHP's
strtotime()function - Timezones use IANA format (e.g., "America/New_York")
- Use
maxparameter to limit results (default: 100) - Use
minDateandmaxDatefor date-range filtering - Client update/delete only works for clients with existing appointments
- Rescheduling requires the new datetime to be an available time slot
Resources
Airtable Routing Reference
App name: airtable Base URL proxied: api.airtable.com
API Path Pattern
/airtable/v0/{baseId}/{tableIdOrName}Common Endpoints
List Records
GET /airtable/v0/{baseId}/{tableIdOrName}?maxRecords=100With view:
GET /airtable/v0/{baseId}/{tableIdOrName}?view=Grid%20view&maxRecords=100With filter formula:
GET /airtable/v0/{baseId}/{tableIdOrName}?filterByFormula={Status}='Active'With field selection:
GET /airtable/v0/{baseId}/{tableIdOrName}?fields[]=Name&fields[]=Status&fields[]=EmailWith sorting:
GET /airtable/v0/{baseId}/{tableIdOrName}?sort[0][field]=Created&sort[0][direction]=descGet Record
GET /airtable/v0/{baseId}/{tableIdOrName}/{recordId}Create Records
POST /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"fields": {
"Name": "New Record",
"Status": "Active",
"Email": "test@example.com"
}
}
]
}Update Records (PATCH - partial update)
PATCH /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Status": "Completed"
}
}
]
}Update Records (PUT - full replace)
PUT /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Name": "Updated Name",
"Status": "Active"
}
}
]
}Delete Records
DELETE /airtable/v0/{baseId}/{tableIdOrName}?records[]=recXXXXX&records[]=recYYYYYList Bases
GET /airtable/v0/meta/basesGet Base Schema
GET /airtable/v0/meta/bases/{baseId}/tablesPagination
Parameters:
pageSize- Number of records per request (max 100, default 100)maxRecords- Maximum total records across all pagesoffset- Cursor for next page (returned in response)
Response includes offset when more records exist:
{
"records": [...],
"offset": "itrXXXXXXXXXXX"
}Use offset for next page:
GET /airtable/v0/{baseId}/{tableIdOrName}?pageSize=50&offset=itrXXXXXXXXXXXNotes
- Authentication is automatic via OAuth
- Base IDs start with
app - Table IDs start with
tbl(can also use table name) - Record IDs start with
rec - Maximum 100 records per request for create/update
- Maximum 10 records per delete request
- Filter formulas use Airtable formula syntax
Resources
Apollo Routing Reference
App name: apollo Base URL proxied: api.apollo.io
API Path Pattern
/apollo/v1/{endpoint}Common Endpoints
People
Search People
POST /apollo/v1/mixed_people/api_search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}Get Person
GET /apollo/v1/people/{personId}Enrich Person
POST /apollo/v1/people/match
Content-Type: application/json
{
"email": "john@example.com"
}Or by LinkedIn:
POST /apollo/v1/people/match
Content-Type: application/json
{
"linkedin_url": "https://linkedin.com/in/johndoe"
}Organizations
Search Organizations
POST /apollo/v1/organizations/search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}Enrich Organization
POST /apollo/v1/organizations/enrich
Content-Type: application/json
{
"domain": "google.com"
}Contacts
Search Contacts
POST /apollo/v1/contacts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}Create Contact
POST /apollo/v1/contacts
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"organization_name": "Acme Corp"
}Update Contact
PUT /apollo/v1/contacts/{contactId}
Content-Type: application/json
{
"first_name": "Jane"
}Accounts
Search Accounts
POST /apollo/v1/accounts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}Create Account
POST /apollo/v1/accounts
Content-Type: application/json
{
"name": "Acme Corp",
"domain": "acme.com"
}Sequences
Search Sequences
POST /apollo/v1/emailer_campaigns/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}Add Contact to Sequence
POST /apollo/v1/emailer_campaigns/{campaignId}/add_contact_ids
Content-Type: application/json
{
"contact_ids": ["contact_id_1", "contact_id_2"]
}Search Email Messages
POST /apollo/v1/emailer_messages/search
Content-Type: application/json
{
"contact_id": "{contactId}"
}Labels
List Labels
GET /apollo/v1/labelsSearch Filters
Common search parameters:
q_organization_name- Company nameq_person_title- Job titleperson_locations- Array of locationsorganization_num_employees_ranges- Employee count rangesq_keywords- General keyword search
Notes
- Authentication is automatic - the router injects the API key
- Pagination uses
pageandper_pageparameters in POST body - Most list endpoints use POST with
/searchsuffix (not GET) - Email enrichment consumes credits
- Rate limits apply per endpoint
people/searchandmixed_people/searchare deprecated - usemixed_people/api_searchinstead
Resources
Asana Routing Reference
App name: asana Base URL proxied: app.asana.com
API Path Pattern
/asana/api/1.0/{resource}Common Endpoints
Get Current User
GET /asana/api/1.0/users/meList Workspaces
GET /asana/api/1.0/workspacesList Tasks
GET /asana/api/1.0/tasks?project=PROJECT_GID&opt_fields=name,completed,due_onGet a Task
GET /asana/api/1.0/tasks/{task_gid}Create a Task
POST /asana/api/1.0/tasks
Content-Type: application/json
{
"data": {
"name": "New task",
"projects": ["PROJECT_GID"],
"assignee": "USER_GID",
"due_on": "2025-03-20",
"notes": "Task description"
}
}Update a Task
PUT /asana/api/1.0/tasks/{task_gid}
Content-Type: application/json
{
"data": {
"completed": true
}
}Delete a Task
DELETE /asana/api/1.0/tasks/{task_gid}Get Subtasks
GET /asana/api/1.0/tasks/{task_gid}/subtasksCreate Subtask
POST /asana/api/1.0/tasks/{task_gid}/subtasks
Content-Type: application/json
{
"data": {
"name": "Subtask name"
}
}List Projects
GET /asana/api/1.0/projects?workspace=WORKSPACE_GID&opt_fields=name,owner,due_dateGet a Project
GET /asana/api/1.0/projects/{project_gid}Create a Project
POST /asana/api/1.0/projects
Content-Type: application/json
{
"data": {
"name": "New Project",
"workspace": "WORKSPACE_GID"
}
}List Users in Workspace
GET /asana/api/1.0/workspaces/{workspace_gid}/users?opt_fields=name,emailCreate Webhook
POST /asana/api/1.0/webhooks
Content-Type: application/json
{
"data": {
"resource": "PROJECT_OR_TASK_GID",
"target": "https://example.com/webhook",
"filters": [
{
"resource_type": "task",
"action": "changed",
"fields": ["completed", "due_on"]
}
]
}
}Delete Webhook
DELETE /asana/api/1.0/webhooks/{webhook_gid}Notes
- Resource IDs (GIDs) are strings
- Timestamps are in ISO 8601 format
- Use
opt_fieldsto specify which fields to return in responses - Workspaces are the highest-level organizational unit
- Use cursor-based pagination with
offsetparameter - Webhook creation requires the target URL to respond with 200 status
Resources
Attio Routing Reference
App name: attio Base URL proxied: api.attio.com
API Path Pattern
/attio/v2/{resource}Common Endpoints
List Objects
GET /attio/v2/objectsGet Object
GET /attio/v2/objects/{object}List Attributes
GET /attio/v2/objects/{object}/attributesQuery Records
POST /attio/v2/objects/{object}/records/query
Content-Type: application/json
{
"limit": 50,
"offset": 0
}Get Record
GET /attio/v2/objects/{object}/records/{record_id}Create Record
POST /attio/v2/objects/{object}/records
Content-Type: application/json
{
"data": {
"values": {
"name": [{"first_name": "John", "last_name": "Doe", "full_name": "John Doe"}],
"email_addresses": ["john@example.com"]
}
}
}Update Record
PATCH /attio/v2/objects/{object}/records/{record_id}
Content-Type: application/json
{
"data": {
"values": {
"job_title": "Engineer"
}
}
}Delete Record
DELETE /attio/v2/objects/{object}/records/{record_id}List Tasks
GET /attio/v2/tasks?limit=50Create Task
POST /attio/v2/tasks
Content-Type: application/json
{
"data": {
"content": "Task description",
"format": "plaintext",
"deadline_at": null,
"assignees": [],
"linked_records": []
}
}List Workspace Members
GET /attio/v2/workspace_membersIdentify Self
GET /attio/v2/selfNotes
List Notes
GET /attio/v2/notes?limit=50&parent_object={object}&parent_record_id={record_id}Get Note
GET /attio/v2/notes/{note_id}Create Note
POST /attio/v2/notes
Content-Type: application/json
{
"data": {
"format": "plaintext",
"title": "Meeting Summary",
"content": "Note content here",
"parent_object": "companies",
"parent_record_id": "{record_id}",
"created_by_actor": {
"type": "workspace-member",
"id": "{workspace_member_id}"
}
}
}Delete Note
DELETE /attio/v2/notes/{note_id}Comments
Create Comment on Record
POST /attio/v2/comments
Content-Type: application/json
{
"data": {
"format": "plaintext",
"content": "Comment text",
"author": {
"type": "workspace-member",
"id": "{workspace_member_id}"
},
"record": {
"object": "companies",
"record_id": "{record_id}"
}
}
}Reply to Comment Thread
POST /attio/v2/comments
Content-Type: application/json
{
"data": {
"format": "plaintext",
"content": "This is a reply",
"author": {
"type": "workspace-member",
"id": "{workspace_member_id}"
},
"thread_id": "{thread_id}"
}
}Lists
List All Lists
GET /attio/v2/listsGet List
GET /attio/v2/lists/{list_id}List Entries
Query List Entries
POST /attio/v2/lists/{list}/entries/query
Content-Type: application/json
{
"limit": 50,
"offset": 0
}Create List Entry
POST /attio/v2/lists/{list}/entries
Content-Type: application/json
{
"data": {
"parent_record_id": "{record_id}",
"parent_object": "companies",
"entry_values": {}
}
}Get List Entry
GET /attio/v2/lists/{list}/entries/{entry_id}Update List Entry
PATCH /attio/v2/lists/{list}/entries/{entry_id}
Content-Type: application/json
{
"data": {
"entry_values": {
"status": "Active"
}
}
}Delete List Entry
DELETE /attio/v2/lists/{list}/entries/{entry_id}Meetings
List Meetings
GET /attio/v2/meetings?limit=50Get Meeting
GET /attio/v2/meetings/{meeting_id}Call Recordings
List Call Recordings for Meeting
GET /attio/v2/meetings/{meeting_id}/call_recordings?limit=50Get Call Recording
GET /attio/v2/meetings/{meeting_id}/call_recordings/{call_recording_id}Usage Notes
- Object slugs are lowercase snake_case (e.g.,
people,companies) - Record IDs are UUIDs
- For personal-name attributes, include
full_namewhen creating records - Task creation requires
format,deadline_at,assignees, andlinked_recordsfields - Note creation requires
format,content,parent_object, andparent_record_id - Comment creation requires
format,content,author, plus one ofrecord,entry, orthread_id - Meetings use cursor-based pagination
- Rate limits: 100 read/sec, 25 write/sec
- Pagination uses
limitandoffsetparameters (orcursorfor meetings)
Resources
Basecamp Routing Reference
App name: basecamp Base URL proxied: 3.basecampapi.com/{account_id}
Note: The gateway automatically injects the account ID from the OAuth connection.
API Path Pattern
/basecamp/{resource}.jsonAll paths must end with .json.
Common Endpoints
Get Current User
GET /basecamp/my/profile.jsonList People
GET /basecamp/people.jsonList Projects
GET /basecamp/projects.jsonGet Project
GET /basecamp/projects/{project_id}.jsonReturns project with dock array containing tool IDs.
Create Project
POST /basecamp/projects.json
Content-Type: application/json
{
"name": "Project Name",
"description": "Description"
}Get Todoset
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}.jsonList Todolists
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.jsonList Todos
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.jsonCreate Todo
POST /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
Content-Type: application/json
{
"content": "Todo content",
"due_on": "2026-02-15",
"assignee_ids": [123]
}Complete Todo
POST /basecamp/buckets/{project_id}/todos/{todo_id}/completion.jsonGet Message Board
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}.jsonList Messages
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.jsonGet Schedule
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}.jsonList Schedule Entries
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.jsonGet Vault (Documents)
GET /basecamp/buckets/{project_id}/vaults/{vault_id}.jsonList Documents
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.jsonList Campfires
GET /basecamp/chats.jsonTrash Recording
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/trashed.jsonKey Concepts
- Bucket: Project content container (bucket_id = project_id)
- Dock: Per-project tool list with
id,name,enabled - Recording: Any content item (todos, messages, documents)
Pagination
Uses Link header with rel="next":
Link: <url>; rel="next"
X-Total-Count: 150Notes
- All paths must end with
.json - Gateway injects account ID automatically
- Uses Basecamp 4 API (bc3-api)
- Rate limit: ~50 requests per 10 seconds per IP
- Check
enabled: truein dock before using tools
Resources
Baserow Routing Reference
App name: baserow Base URL proxied: api.baserow.io
API Path Pattern
/baserow/api/database/rows/table/{table_id}/
/baserow/api/database/fields/table/{table_id}/
/baserow/api/database/tables/all-tables/
/baserow/api/user-files/upload-file/
/baserow/api/user-files/upload-via-url/Important Notes
- Connection uses API_KEY authentication (database token), not OAuth
- By default, fields return as
field_{id}; useuser_field_names=truefor readable names - Database tokens grant access only to database row endpoints
- Cloud has a limit of 10 concurrent API requests
Common Endpoints
List Rows
GET /baserow/api/database/rows/table/{table_id}/?user_field_names=trueGet Row
GET /baserow/api/database/rows/table/{table_id}/{row_id}/Create Row
POST /baserow/api/database/rows/table/{table_id}/
Content-Type: application/json
{
"field_123": "value"
}Update Row
PATCH /baserow/api/database/rows/table/{table_id}/{row_id}/
Content-Type: application/json
{
"field_123": "updated value"
}Delete Row
DELETE /baserow/api/database/rows/table/{table_id}/{row_id}/Batch Create Rows
POST /baserow/api/database/rows/table/{table_id}/batch/
Content-Type: application/json
{
"items": [
{"field_123": "value1"},
{"field_123": "value2"}
]
}Batch Update Rows
PATCH /baserow/api/database/rows/table/{table_id}/batch/
Content-Type: application/json
{
"items": [
{"id": 1, "field_123": "updated1"},
{"id": 2, "field_123": "updated2"}
]
}Batch Delete Rows
POST /baserow/api/database/rows/table/{table_id}/batch-delete/
Content-Type: application/json
{
"items": [1, 2, 3]
}List Fields
GET /baserow/api/database/fields/table/{table_id}/List All Tables
GET /baserow/api/database/tables/all-tables/Move Row
PATCH /baserow/api/database/rows/table/{table_id}/{row_id}/move/?before_id={row_id}Upload File via URL
POST /baserow/api/user-files/upload-via-url/
Content-Type: application/json
{
"url": "https://example.com/image.png"
}Upload File (Multipart)
POST /baserow/api/user-files/upload-file/
Content-Type: multipart/form-dataQuery Parameters
user_field_names=true- Use human-readable field namessize- Rows per page (default: 100)page- Page number (1-indexed)order_by- Field to sort by (prefix-for descending)filter__{field}__{operator}- Filter rowssearch- Search across all fieldsinclude- Fields to includeexclude- Fields to exclude
Filter Operators
Text: equal, not_equal, contains, contains_not, contains_word, doesnt_contain_word, length_is_lower_than
Numeric: higher_than, higher_than_or_equal, lower_than, lower_than_or_equal, is_even_and_whole
Date: date_is, date_is_not, date_is_before, date_is_on_or_before, date_is_after, date_is_on_or_after, date_is_within, date_equals_today, date_within_days, date_within_weeks, date_within_months
Boolean: boolean
Link Row: link_row_has, link_row_has_not, link_row_contains, link_row_not_contains
Select: single_select_equal, single_select_not_equal, single_select_is_any_of, single_select_is_none_of, multiple_select_has, multiple_select_has_not
File: filename_contains, has_file_type, files_lower_than
General: empty, not_empty
Resources
beehiiv Routing Reference
App name: beehiiv Base URL proxied: api.beehiiv.com
API Path Pattern
/beehiiv/v2/{resource}Common Endpoints
Publications
List Publications
GET /beehiiv/v2/publicationsGet Publication
GET /beehiiv/v2/publications/{publication_id}Subscriptions
List Subscriptions
GET /beehiiv/v2/publications/{publication_id}/subscriptionsGet Subscription by ID
GET /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}Get Subscription by Email
GET /beehiiv/v2/publications/{publication_id}/subscriptions/by_email/{email}Create Subscription
POST /beehiiv/v2/publications/{publication_id}/subscriptions
Content-Type: application/json
{
"email": "subscriber@example.com",
"utm_source": "api"
}Update Subscription
PATCH /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}Delete Subscription
DELETE /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}Posts
List Posts
GET /beehiiv/v2/publications/{publication_id}/postsGet Post
GET /beehiiv/v2/publications/{publication_id}/posts/{post_id}Custom Fields
List Custom Fields
GET /beehiiv/v2/publications/{publication_id}/custom_fieldsCreate Custom Field
POST /beehiiv/v2/publications/{publication_id}/custom_fieldsSegments
GET /beehiiv/v2/publications/{publication_id}/segments
GET /beehiiv/v2/publications/{publication_id}/segments/{segment_id}Tiers
GET /beehiiv/v2/publications/{publication_id}/tiers
POST /beehiiv/v2/publications/{publication_id}/tiers
PATCH /beehiiv/v2/publications/{publication_id}/tiers/{tier_id}Automations
GET /beehiiv/v2/publications/{publication_id}/automations
GET /beehiiv/v2/publications/{publication_id}/automations/{automation_id}Pagination
Cursor-based (recommended) or page-based (deprecated):
# Cursor-based
GET /beehiiv/v2/publications/{pub_id}/subscriptions?limit=10&cursor={next_cursor}
# Page-based (max 100 pages)
GET /beehiiv/v2/publications?page=2&limit=10Notes
- Publication IDs start with
pub_ - Subscription IDs start with
sub_ - Timestamps are Unix timestamps
- Cursor-based pagination is recommended
- Page-based pagination limited to 100 pages
Resources
Box Routing Reference
App name: box Base URL proxied: api.box.com
API Path Pattern
/box/2.0/{resource}Common Endpoints
Get Current User
GET /box/2.0/users/meGet User
GET /box/2.0/users/{user_id}Get Folder
GET /box/2.0/folders/{folder_id}Root folder ID is 0.
List Folder Items
GET /box/2.0/folders/{folder_id}/items
GET /box/2.0/folders/{folder_id}/items?limit=100&offset=0Create Folder
POST /box/2.0/folders
Content-Type: application/json
{
"name": "New Folder",
"parent": {"id": "0"}
}Update Folder
PUT /box/2.0/folders/{folder_id}
Content-Type: application/json
{
"name": "Updated Name",
"description": "Description"
}Copy Folder
POST /box/2.0/folders/{folder_id}/copy
Content-Type: application/json
{
"name": "Copied Folder",
"parent": {"id": "0"}
}Delete Folder
DELETE /box/2.0/folders/{folder_id}
DELETE /box/2.0/folders/{folder_id}?recursive=trueGet File
GET /box/2.0/files/{file_id}Download File
GET /box/2.0/files/{file_id}/contentUpdate File
PUT /box/2.0/files/{file_id}Copy File
POST /box/2.0/files/{file_id}/copyDelete File
DELETE /box/2.0/files/{file_id}Create Shared Link
PUT /box/2.0/folders/{folder_id}
Content-Type: application/json
{
"shared_link": {"access": "open"}
}List Collaborations
GET /box/2.0/folders/{folder_id}/collaborationsCreate Collaboration
POST /box/2.0/collaborations
Content-Type: application/json
{
"item": {"type": "folder", "id": "123"},
"accessible_by": {"type": "user", "login": "user@example.com"},
"role": "editor"
}Search
GET /box/2.0/search?query=keywordEvents
GET /box/2.0/eventsTrash
GET /box/2.0/folders/trash/items
DELETE /box/2.0/files/{file_id}/trash
DELETE /box/2.0/folders/{folder_id}/trashCollections
GET /box/2.0/collections
GET /box/2.0/collections/{collection_id}/itemsRecent Items
GET /box/2.0/recent_itemsWebhooks
GET /box/2.0/webhooks
POST /box/2.0/webhooks
DELETE /box/2.0/webhooks/{webhook_id}Pagination
Offset-based pagination:
GET /box/2.0/folders/0/items?limit=100&offset=0Response:
{
"total_count": 250,
"entries": [...],
"offset": 0,
"limit": 100
}Notes
- Root folder ID is
0 - File uploads use
upload.box.com(different base URL) - Delete operations return 204 No Content
- Some operations require enterprise admin permissions
- Use
fieldsparameter to select specific fields
Resources
Brevo Routing Reference
App name: brevo Base URL proxied: api.brevo.com
API Path Pattern
/brevo/v3/{resource}Common Endpoints
Account
GET /brevo/v3/accountContacts
List Contacts
GET /brevo/v3/contacts?limit=50&offset=0Get Contact
GET /brevo/v3/contacts/{identifier}Create Contact
POST /brevo/v3/contacts
Content-Type: application/json
{
"email": "contact@example.com",
"attributes": {"FIRSTNAME": "John", "LASTNAME": "Doe"},
"listIds": [2]
}Update Contact
PUT /brevo/v3/contacts/{identifier}
Content-Type: application/json
{
"attributes": {"FIRSTNAME": "Updated"}
}Delete Contact
DELETE /brevo/v3/contacts/{identifier}Lists
List All Lists
GET /brevo/v3/contacts/listsCreate List
POST /brevo/v3/contacts/lists
Content-Type: application/json
{
"name": "New List",
"folderId": 1
}Add Contacts to List
POST /brevo/v3/contacts/lists/{listId}/contacts/add
Content-Type: application/json
{
"emails": ["contact@example.com"]
}Folders
List Folders
GET /brevo/v3/contacts/foldersCreate Folder
POST /brevo/v3/contacts/folders
Content-Type: application/json
{
"name": "New Folder"
}Transactional Emails
Send Email
POST /brevo/v3/smtp/email
Content-Type: application/json
{
"sender": {"name": "John", "email": "john@example.com"},
"to": [{"email": "recipient@example.com", "name": "Jane"}],
"subject": "Hello!",
"htmlContent": "<html><body><h1>Hi!</h1></body></html>"
}Get Email Statistics
GET /brevo/v3/smtp/statistics/events?limit=50Email Templates
List Templates
GET /brevo/v3/smtp/templatesCreate Template
POST /brevo/v3/smtp/templates
Content-Type: application/json
{
"sender": {"name": "Company", "email": "noreply@company.com"},
"templateName": "Welcome Email",
"subject": "Welcome {{params.name}}!",
"htmlContent": "<html><body><h1>Hello {{params.name}}!</h1></body></html>"
}Email Campaigns
List Campaigns
GET /brevo/v3/emailCampaignsCreate Campaign
POST /brevo/v3/emailCampaigns
Content-Type: application/json
{
"name": "Newsletter",
"subject": "Monthly Update",
"sender": {"name": "Company", "email": "news@company.com"},
"htmlContent": "<html><body><h1>News</h1></body></html>",
"recipients": {"listIds": [2]}
}Send Campaign
POST /brevo/v3/emailCampaigns/{campaignId}/sendNowSenders
List Senders
GET /brevo/v3/sendersCreate Sender
POST /brevo/v3/senders
Content-Type: application/json
{
"name": "Marketing",
"email": "marketing@company.com"
}Attributes
List Attributes
GET /brevo/v3/contacts/attributesPagination
Brevo uses offset-based pagination:
GET /brevo/v3/contacts?limit=50&offset=0Parameters:
limit- Results per page (max varies by endpoint, typically 500)offset- Starting index (0-based)
Response includes count:
{
"contacts": [...],
"count": 150
}Notes
- All endpoints require
/v3/prefix - Attribute names must be UPPERCASE
- Contact identifiers: email, phone, or ID
- Template parameters:
{{params.name}}syntax - PUT/DELETE return 204 No Content on success
- Rate limit: 300 calls/min (free), higher on paid plans
Resources
Cal.com Routing Reference
App name: cal-com Base URL proxied: api.cal.com
API Path Pattern
/cal-com/v2/{resource}Common Endpoints
User Profile
Get Profile
GET /cal-com/v2/meUpdate Profile
PATCH /cal-com/v2/meEvent Types
List Event Types
GET /cal-com/v2/event-typesGet Event Type
GET /cal-com/v2/event-types/{eventTypeId}Create Event Type
POST /cal-com/v2/event-typesUpdate Event Type
PATCH /cal-com/v2/event-types/{eventTypeId}Delete Event Type
DELETE /cal-com/v2/event-types/{eventTypeId}Event Type Webhooks
List Webhooks
GET /cal-com/v2/event-types/{eventTypeId}/webhooksCreate Webhook
POST /cal-com/v2/event-types/{eventTypeId}/webhooksGet Webhook
GET /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}Update Webhook
PATCH /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}Delete Webhook
DELETE /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}Bookings
List Bookings
GET /cal-com/v2/bookings
GET /cal-com/v2/bookings?status=upcoming
GET /cal-com/v2/bookings?status=past
GET /cal-com/v2/bookings?status=cancelled
GET /cal-com/v2/bookings?take=10Get Booking
GET /cal-com/v2/bookings/{bookingUid}Create Booking
POST /cal-com/v2/bookingsCancel Booking
POST /cal-com/v2/bookings/{bookingUid}/cancelSchedules
Get Default Schedule
GET /cal-com/v2/schedules/defaultGet Schedule
GET /cal-com/v2/schedules/{scheduleId}Create Schedule
POST /cal-com/v2/schedulesUpdate Schedule
PATCH /cal-com/v2/schedules/{scheduleId}Delete Schedule
DELETE /cal-com/v2/schedules/{scheduleId}Availability Slots
Get Available Slots
GET /cal-com/v2/slots/available?eventTypeId={id}&startTime={iso8601}&endTime={iso8601}Reserve Slot
POST /cal-com/v2/slots/reserveCalendars
List Connected Calendars
GET /cal-com/v2/calendarsConferencing
List Conferencing Apps
GET /cal-com/v2/conferencingGet Default Conferencing App
GET /cal-com/v2/conferencing/defaultWebhooks (User-level)
List Webhooks
GET /cal-com/v2/webhooksCreate Webhook
POST /cal-com/v2/webhooksGet Webhook
GET /cal-com/v2/webhooks/{webhookId}Update Webhook
PATCH /cal-com/v2/webhooks/{webhookId}Delete Webhook
DELETE /cal-com/v2/webhooks/{webhookId}Teams
List Teams
GET /cal-com/v2/teamsVerified Resources
List Verified Emails
GET /cal-com/v2/verified-resources/emailsNotes
- All API endpoints are v2
- All times are in UTC (ISO 8601 format)
- Booking creation requires an available slot - check
/v2/slots/availablefirst - Required fields for booking:
eventTypeId,start,timeZone,language,responses.name,responses.email GET /v2/schedulesmay return 500 errors; useGET /v2/schedules/{id}instead- Event type creation requires:
title,slug,length(in minutes)
Resources
Calendly Routing Reference
App name: calendly Base URL proxied: api.calendly.com
API Path Pattern
/calendly/{resource}Common Endpoints
Get Current User
GET /calendly/users/meList Event Types
GET /calendly/event_types?user=USER_URI&active=trueGet an Event Type
GET /calendly/event_types/{uuid}List Scheduled Events
GET /calendly/scheduled_events?user=USER_URI&status=active&min_start_time=2025-03-01T00:00:00ZGet a Scheduled Event
GET /calendly/scheduled_events/{uuid}Cancel a Scheduled Event
POST /calendly/scheduled_events/{uuid}/cancellation
Content-Type: application/json
{
"reason": "Meeting rescheduled"
}List Event Invitees
GET /calendly/scheduled_events/{event_uuid}/inviteesGet Available Times
GET /calendly/event_type_available_times?event_type=EVENT_TYPE_URI&start_time=2025-03-15T00:00:00Z&end_time=2025-03-22T00:00:00ZGet User Busy Times
GET /calendly/user_busy_times?user=USER_URI&start_time=2025-03-15T00:00:00Z&end_time=2025-03-22T00:00:00ZList Organization Memberships
GET /calendly/organization_memberships?organization=ORGANIZATION_URIList Webhook Subscriptions
GET /calendly/webhook_subscriptions?organization=ORGANIZATION_URI&scope=organizationCreate Webhook Subscription
POST /calendly/webhook_subscriptions
Content-Type: application/json
{
"url": "https://example.com/webhook",
"events": ["invitee.created", "invitee.canceled"],
"organization": "ORGANIZATION_URI",
"scope": "organization"
}Delete Webhook Subscription
DELETE /calendly/webhook_subscriptions/{uuid}Notes
- Resource identifiers are full URIs (e.g.,
https://api.calendly.com/users/AAAA) - Timestamps are in ISO 8601 format
- Availability endpoints have a 7-day maximum range per request
- Webhooks require a paid Calendly plan (Standard, Teams, or Enterprise)
- Available webhook events:
invitee.created,invitee.canceled,routing_form_submission.created - Use
page_tokenfor pagination
Resources
CallRail Routing Reference
App name: callrail Base URL proxied: api.callrail.com
API Path Pattern
/callrail/v3/a/{account_id}/{resource}.jsonImportant: All CallRail API endpoints end with .json. Account IDs start with ACC.
Common Endpoints
Accounts
List Accounts
GET /callrail/v3/a.jsonGet Account
GET /callrail/v3/a/{account_id}.jsonCompanies
List Companies
GET /callrail/v3/a/{account_id}/companies.jsonGet Company
GET /callrail/v3/a/{account_id}/companies/{company_id}.jsonCalls
List Calls
GET /callrail/v3/a/{account_id}/calls.jsonQuery parameters: page, per_page, date_range, start_date, end_date, company_id, tracker_id, search, fields, sort, order
Get Call
GET /callrail/v3/a/{account_id}/calls/{call_id}.jsonUpdate Call
PUT /callrail/v3/a/{account_id}/calls/{call_id}.json
Content-Type: application/json
{
"customer_name": "John Smith",
"note": "Follow up scheduled",
"lead_status": "good_lead"
}Call Summary
GET /callrail/v3/a/{account_id}/calls/summary.jsonCall Timeseries
GET /callrail/v3/a/{account_id}/calls/timeseries.jsonTrackers
List Trackers
GET /callrail/v3/a/{account_id}/trackers.jsonGet Tracker
GET /callrail/v3/a/{account_id}/trackers/{tracker_id}.jsonTags
List Tags
GET /callrail/v3/a/{account_id}/tags.jsonCreate Tag
POST /callrail/v3/a/{account_id}/tags.json
Content-Type: application/json
{
"name": "New Tag",
"tag_level": "account",
"color": "blue1"
}Update Tag
PUT /callrail/v3/a/{account_id}/tags/{tag_id}.json
Content-Type: application/json
{
"name": "Updated Name",
"color": "green1"
}Delete Tag
DELETE /callrail/v3/a/{account_id}/tags/{tag_id}.jsonUsers
List Users
GET /callrail/v3/a/{account_id}/users.jsonGet User
GET /callrail/v3/a/{account_id}/users/{user_id}.jsonIntegrations
List Integrations
GET /callrail/v3/a/{account_id}/integrations.json?company_id={company_id}Notifications
List Notifications
GET /callrail/v3/a/{account_id}/notifications.jsonID Prefixes
- Account IDs:
ACC - Company IDs:
COM - Call IDs:
CAL - Tracker IDs:
TRK - User IDs:
USR
Pagination
Uses offset-based pagination with page and per_page parameters:
GET /callrail/v3/a/{account_id}/calls.json?page=2&per_page=50
# Response includes page, per_page, total_pages, total_recordsFor calls endpoint, relative pagination is available via relative_pagination=true.
Notes
- All endpoints end with
.json - Communication records retained for 25 months
- Rate limits: 1,000/hour, 10,000/day for general API
- ISO 8601 date format with timezone
Resources
Chargebee Routing Reference
App name: chargebee Base URL proxied: {subdomain}.chargebee.com
The router automatically handles the subdomain from your connection.
API Path Pattern
/chargebee/api/v2/{endpoint}Common Endpoints
Customers
List Customers
GET /chargebee/api/v2/customers?limit=10Get Customer
GET /chargebee/api/v2/customers/{customerId}Create Customer
POST /chargebee/api/v2/customers
Content-Type: application/x-www-form-urlencoded
first_name=John&last_name=Doe&email=john@example.comUpdate Customer
POST /chargebee/api/v2/customers/{customerId}
Content-Type: application/x-www-form-urlencoded
first_name=JaneSubscriptions
List Subscriptions
GET /chargebee/api/v2/subscriptions?limit=10Get Subscription
GET /chargebee/api/v2/subscriptions/{subscriptionId}Create Subscription
POST /chargebee/api/v2/subscriptions
Content-Type: application/x-www-form-urlencoded
plan_id=basic-plan&customer[email]=john@example.com&customer[first_name]=JohnCancel Subscription
POST /chargebee/api/v2/subscriptions/{subscriptionId}/cancel
Content-Type: application/x-www-form-urlencoded
end_of_term=trueItem Prices (Product Catalog 2.0)
List Item Prices
GET /chargebee/api/v2/item_prices?limit=10Get Item Price
GET /chargebee/api/v2/item_prices/{itemPriceId}Items (Product Catalog 2.0)
List Items
GET /chargebee/api/v2/items?limit=10Get Item
GET /chargebee/api/v2/items/{itemId}Plans (Product Catalog 1.0 - Legacy)
List Plans
GET /chargebee/api/v2/plans?limit=10Get Plan
GET /chargebee/api/v2/plans/{planId}Invoices
List Invoices
GET /chargebee/api/v2/invoices?limit=10Get Invoice
GET /chargebee/api/v2/invoices/{invoiceId}Download Invoice PDF
POST /chargebee/api/v2/invoices/{invoiceId}/pdfTransactions
List Transactions
GET /chargebee/api/v2/transactions?limit=10Hosted Pages
Checkout New Subscription
POST /chargebee/api/v2/hosted_pages/checkout_new_for_items
Content-Type: application/x-www-form-urlencoded
subscription[plan_id]=basic-plan&customer[email]=john@example.comManage Payment Sources
POST /chargebee/api/v2/hosted_pages/manage_payment_sources
Content-Type: application/x-www-form-urlencoded
customer[id]=cust_123Portal Sessions
Create Portal Session
POST /chargebee/api/v2/portal_sessions
Content-Type: application/x-www-form-urlencoded
customer[id]=cust_123Filtering
Use filter parameters:
GET /chargebee/api/v2/subscriptions?status[is]=active
GET /chargebee/api/v2/customers?email[is]=john@example.com
GET /chargebee/api/v2/invoices?date[after]=1704067200Notes
- Authentication is automatic - the router injects Basic auth from your API key
- Subdomain is automatically determined from your connection
- Uses form-urlencoded data for POST requests
- Nested objects use bracket notation:
customer[email] - Timestamps are Unix timestamps
- List responses include
next_offsetfor pagination - Status values:
active,cancelled,non_renewing, etc. - Product Catalog versions: Use
item_pricesanditemsfor PC 2.0, orplansandaddonsfor PC 1.0
Resources
- Getting Started
- List Customers
- Retrieve a Customer
- Create a Customer
- Update a Customer
- List Subscriptions
- Retrieve a Subscription
- Create a Subscription
- Cancel a Subscription
- List Items
- Retrieve an Item
- List Item Prices
- Retrieve an Item Price
- List Plans
- Retrieve a Plan
- List Invoices
- Retrieve an Invoice
- Download Invoice as PDF
- List Transactions
- Checkout New Subscription
- Manage Payment Sources
- Create a Portal Session
ClickFunnels Routing Reference
App name: clickfunnels Base URL proxied: {subdomain}.myclickfunnels.com
The router automatically handles the subdomain from your OAuth connection.
API Path Pattern
/clickfunnels/api/v2/{resource}Required Headers
THe User-Agent header is required to avoid Cloudflare blocks:
User-Agent: Maton/1.0Common Endpoints
Teams
List Teams
GET /clickfunnels/api/v2/teamsGet Team
GET /clickfunnels/api/v2/teams/{team_id}Workspaces
List Workspaces
GET /clickfunnels/api/v2/teams/{team_id}/workspacesGet Workspace
GET /clickfunnels/api/v2/workspaces/{workspace_id}Contacts
List Contacts
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contactsGet Contact
GET /clickfunnels/api/v2/contacts/{contact_id}Create Contact
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
Content-Type: application/json
{
"contact": {
"email_address": "user@example.com",
"first_name": "John",
"last_name": "Doe"
}
}Update Contact
PUT /clickfunnels/api/v2/contacts/{contact_id}
Content-Type: application/json
{
"contact": {
"first_name": "Updated"
}
}Delete Contact
DELETE /clickfunnels/api/v2/contacts/{contact_id}Upsert Contact
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/upsertProducts
List Products
GET /clickfunnels/api/v2/workspaces/{workspace_id}/productsGet Product
GET /clickfunnels/api/v2/products/{product_id}Create Product
POST /clickfunnels/api/v2/workspaces/{workspace_id}/products
Content-Type: application/json
{
"product": {
"name": "New Product",
"visible_in_store": true
}
}Archive/Unarchive Product
POST /clickfunnels/api/v2/products/{product_id}/archive
POST /clickfunnels/api/v2/products/{product_id}/unarchiveOrders
List Orders
GET /clickfunnels/api/v2/workspaces/{workspace_id}/ordersGet Order
GET /clickfunnels/api/v2/orders/{order_id}Fulfillments
List Fulfillments
GET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillmentsCreate Fulfillment
POST /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillmentsCancel Fulfillment
POST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancelCourses & Enrollments
List Courses
GET /clickfunnels/api/v2/workspaces/{workspace_id}/coursesList Enrollments
GET /clickfunnels/api/v2/courses/{course_id}/enrollmentsCreate Enrollment
POST /clickfunnels/api/v2/courses/{course_id}/enrollmentsForms & Submissions
List Forms
GET /clickfunnels/api/v2/workspaces/{workspace_id}/formsList Submissions
GET /clickfunnels/api/v2/forms/{form_id}/submissionsWebhooks
List Webhook Endpoints
GET /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpointsCreate Webhook Endpoint
POST /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
Content-Type: application/json
{
"webhooks_outgoing_endpoint": {
"url": "https://example.com/webhook",
"name": "My Webhook",
"event_type_ids": ["contact.created"]
}
}Delete Webhook Endpoint
DELETE /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}Images
List Images
GET /clickfunnels/api/v2/workspaces/{workspace_id}/imagesUpload Image via URL
POST /clickfunnels/api/v2/workspaces/{workspace_id}/images
Content-Type: application/json
{
"image": {
"upload_source_url": "https://example.com/image.png"
}
}Pagination
Cursor-based pagination with 20 items per page:
# First page
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
# Next page (use ID from Pagination-Next header)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?after=1087091674Response headers:
Pagination-Next: ID of last itemLink: Full URL for next page
Filtering
# Single filter
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com
# Multiple values (OR)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=a@example.com,b@example.com
# Multiple filters (AND)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com&filter[id]=123Notes
- Subdomain is automatically determined from your OAuth connection
- IDs are integers; each resource also has a
public_idstring - Request bodies use nested keys:
{"contact": {...}},{"product": {...}} - List endpoints: use
workspaces/{id}/{resource}pattern - Single resource: use
/{resource}/{id}pattern (no workspace prefix) - Delete operations return HTTP 204 with empty body
- Max 20 items per page, use
afterparameter for pagination
Resources
ClickSend Routing Reference
App name: clicksend Base URL proxied: rest.clicksend.com
API Path Pattern
/clicksend/v3/{resource}Common Endpoints
Account
Get Account
GET /clicksend/v3/accountSMS
Send SMS
POST /clicksend/v3/sms/send
Content-Type: application/json
{
"messages": [
{
"to": "+15551234567",
"body": "Hello!",
"source": "api"
}
]
}SMS History
GET /clicksend/v3/sms/historySMS Templates
GET /clicksend/v3/sms/templates
POST /clicksend/v3/sms/templates
PUT /clicksend/v3/sms/templates/{template_id}
DELETE /clicksend/v3/sms/templates/{template_id}MMS
Send MMS
POST /clicksend/v3/mms/sendMMS History
GET /clicksend/v3/mms/historyVoice
Send Voice
POST /clicksend/v3/voice/sendVoice Languages
GET /clicksend/v3/voice/langContact Lists
List All Lists
GET /clicksend/v3/listsCRUD Operations
GET /clicksend/v3/lists/{list_id}
POST /clicksend/v3/lists
PUT /clicksend/v3/lists/{list_id}
DELETE /clicksend/v3/lists/{list_id}Contacts
List Contacts
GET /clicksend/v3/lists/{list_id}/contactsCRUD Operations
GET /clicksend/v3/lists/{list_id}/contacts/{contact_id}
POST /clicksend/v3/lists/{list_id}/contacts
PUT /clicksend/v3/lists/{list_id}/contacts/{contact_id}
DELETE /clicksend/v3/lists/{list_id}/contacts/{contact_id}Email Addresses
GET /clicksend/v3/email/addresses
POST /clicksend/v3/email/addresses
DELETE /clicksend/v3/email/addresses/{email_address_id}Utility
GET /clicksend/v3/countriesResponse Format
All responses follow this structure:
{
"http_code": 200,
"response_code": "SUCCESS",
"response_msg": "Description",
"data": { ... }
}Pagination
Uses page-based pagination:
GET /clicksend/v3/lists?page=2&limit=50
# Response includes total, per_page, current_page, last_pageNotes
- Phone numbers must be E.164 format
- Timestamps are Unix timestamps
- Voice access requires account permissions
- SMS over 160 chars split into segments
Resources
ClickUp Routing Reference
App name: clickup Base URL proxied: api.clickup.com
API Path Pattern
/clickup/api/v2/{resource}ClickUp Hierarchy
Workspace (team) → Space → Folder → List → Task
Common Endpoints
Get Current User
GET /clickup/api/v2/userGet Workspaces (Teams)
GET /clickup/api/v2/teamGet Spaces
GET /clickup/api/v2/team/{team_id}/spaceGet Folders
GET /clickup/api/v2/space/{space_id}/folderGet Lists
GET /clickup/api/v2/folder/{folder_id}/listGet Folderless Lists
GET /clickup/api/v2/space/{space_id}/listGet Tasks
GET /clickup/api/v2/list/{list_id}/task?include_closed=trueGet a Task
GET /clickup/api/v2/task/{task_id}Create a Task
POST /clickup/api/v2/list/{list_id}/task
Content-Type: application/json
{
"name": "Task name",
"description": "Task description",
"assignees": [123],
"status": "to do",
"priority": 2,
"due_date": 1709251200000,
"tags": ["api", "backend"]
}Update a Task
PUT /clickup/api/v2/task/{task_id}
Content-Type: application/json
{
"status": "complete",
"priority": null
}Delete a Task
DELETE /clickup/api/v2/task/{task_id}Get Filtered Team Tasks
GET /clickup/api/v2/team/{team_id}/task?statuses[]=to%20do&assignees[]=123Create Space
POST /clickup/api/v2/team/{team_id}/space
Content-Type: application/json
{
"name": "New Space",
"multiple_assignees": true
}Create Folder
POST /clickup/api/v2/space/{space_id}/folder
Content-Type: application/json
{"name": "New Folder"}Create List
POST /clickup/api/v2/folder/{folder_id}/list
Content-Type: application/json
{"name": "New List"}Create Webhook
POST /clickup/api/v2/team/{team_id}/webhook
Content-Type: application/json
{
"endpoint": "https://example.com/webhook",
"events": ["taskCreated", "taskUpdated", "taskDeleted"]
}Delete Webhook
DELETE /clickup/api/v2/webhook/{webhook_id}Notes
- Task IDs are strings, timestamps are Unix milliseconds
- Priority values: 1=urgent, 2=high, 3=normal, 4=low, null=none
- Workspaces are called "teams" in the API
- Status values must match exact status names configured in the list
- Use page-based pagination with
pageparameter (0-indexed) - Responses are limited to 100 items per page
Resources
Clio Routing Reference
App name: clio Base URL proxied: app.clio.com
API Path Pattern
/clio/api/v4/{resource}Field Selection
By default, Clio returns minimal fields (id, etag). Always specify fields:
GET /clio/api/v4/matters?fields=id,display_number,description,statusNested resources use curly bracket syntax:
GET /clio/api/v4/activities?fields=id,type,matter{id,description}Common Endpoints
Matters
List Matters
GET /clio/api/v4/matters?fields=id,display_number,description,statusGet Matter
GET /clio/api/v4/matters/{id}?fields=id,display_number,description,status,open_dateCreate Matter
POST /clio/api/v4/matters
Content-Type: application/json
{
"data": {
"description": "New Legal Matter",
"status": "open",
"client": {"id": 12345}
}
}Update Matter
PATCH /clio/api/v4/matters/{id}
Content-Type: application/json
{
"data": {
"description": "Updated Description"
}
}Delete Matter
DELETE /clio/api/v4/matters/{id}Contacts
List Contacts
GET /clio/api/v4/contacts?fields=id,name,type,primary_email_addressGet Contact
GET /clio/api/v4/contacts/{id}?fields=id,name,type,first_name,last_nameCreate Contact (Person)
POST /clio/api/v4/contacts
Content-Type: application/json
{
"data": {
"type": "Person",
"first_name": "John",
"last_name": "Doe"
}
}Create Contact (Company)
POST /clio/api/v4/contacts
Content-Type: application/json
{
"data": {
"type": "Company",
"name": "Acme Corporation"
}
}Update Contact
PATCH /clio/api/v4/contacts/{id}
Content-Type: application/json
{
"data": {
"first_name": "Jane"
}
}Delete Contact
DELETE /clio/api/v4/contacts/{id}Activities
List Activities
GET /clio/api/v4/activities?fields=id,type,date,quantity,matter{id,description}Get Activity
GET /clio/api/v4/activities/{id}?fields=id,type,date,quantity,noteCreate Activity
POST /clio/api/v4/activities
Content-Type: application/json
{
"data": {
"type": "TimeEntry",
"date": "2026-02-11",
"quantity": 3600,
"matter": {"id": 12345}
}
}Update Activity
PATCH /clio/api/v4/activities/{id}
Content-Type: application/json
{
"data": {
"note": "Updated note"
}
}Delete Activity
DELETE /clio/api/v4/activities/{id}Tasks
List Tasks
GET /clio/api/v4/tasks?fields=id,name,status,due_at,priorityGet Task
GET /clio/api/v4/tasks/{id}?fields=id,name,description,status,due_atCreate Task
Requires assignee with id and type:
POST /clio/api/v4/tasks
Content-Type: application/json
{
"data": {
"name": "Review contract",
"due_at": "2026-02-15T17:00:00Z",
"priority": "Normal",
"assignee": {"id": 12345, "type": "User"},
"matter": {"id": 67890}
}
}Update Task
PATCH /clio/api/v4/tasks/{id}
Content-Type: application/json
{
"data": {
"status": "complete"
}
}Delete Task
DELETE /clio/api/v4/tasks/{id}Calendar Entries
List Calendar Entries
GET /clio/api/v4/calendar_entries?fields=id,summary,start_at,end_atGet Calendar Entry
GET /clio/api/v4/calendar_entries/{id}?fields=id,summary,description,start_at,end_atCreate Calendar Entry
Requires calendar_owner with id and type:
POST /clio/api/v4/calendar_entries
Content-Type: application/json
{
"data": {
"summary": "Client Meeting",
"start_at": "2026-02-15T10:00:00Z",
"end_at": "2026-02-15T11:00:00Z",
"calendar_owner": {"id": 12345, "type": "User"}
}
}Note: Associating a matter during creation may return 404. Use PATCH to link matters after creation.
Update Calendar Entry
PATCH /clio/api/v4/calendar_entries/{id}
Content-Type: application/json
{
"data": {
"summary": "Updated Meeting"
}
}Delete Calendar Entry
DELETE /clio/api/v4/calendar_entries/{id}Documents
List Documents
GET /clio/api/v4/documents?fields=id,name,content_type,sizeGet Document
GET /clio/api/v4/documents/{id}?fields=id,name,content_type,size,created_atDownload Document
GET /clio/api/v4/documents/{id}/downloadUsers
Get Current User
GET /clio/api/v4/users/who_am_i?fields=id,name,email,enabledList Users
GET /clio/api/v4/users?fields=id,name,email,enabledBills
List Bills
GET /clio/api/v4/bills?fields=id,number,issued_at,due_at,total,balance,stateGet Bill
GET /clio/api/v4/bills/{id}?fields=id,number,total,balance,statePagination
Clio uses cursor-based pagination:
GET /clio/api/v4/matters?fields=id,description&limit=50Response includes pagination in meta:
{
"data": [...],
"meta": {
"paging": {
"next": "https://app.clio.com/api/v4/matters?page_token=xyz123"
}
}
}Use page_token for next page:
GET /clio/api/v4/matters?page_token=xyz123Notes
- Always specify
fieldsparameter - defaults are minimal (id,etagonly) - Nested resources use curly brackets:
matter{id,description} - Only one level of nesting supported
- Contact types:
PersonorCompany - Task assignees require both
idandtype("User" or "Contact") - Calendar entries require
calendar_ownerwithidandtype; linking matters during creation may fail - use PATCH after creation - Activity quantity is in seconds (3600 = 1 hour)
- Rate limit: 50 requests/minute during peak hours
- Contact limits: max 20 emails, phones, and addresses each
- Activities, Documents, and Bills endpoints require additional OAuth scopes
Resources
Clockify Routing Reference
App name: clockify Base URL proxied: api.clockify.me
API Path Pattern
/clockify/api/v1/{resource}Common Endpoints
Get Current User
GET /clockify/api/v1/userList Workspaces
GET /clockify/api/v1/workspacesGet Workspace
GET /clockify/api/v1/workspaces/{workspaceId}List Workspace Users
GET /clockify/api/v1/workspaces/{workspaceId}/usersList Projects
GET /clockify/api/v1/workspaces/{workspaceId}/projectsGet Project
GET /clockify/api/v1/workspaces/{workspaceId}/projects/{projectId}Create Project
POST /clockify/api/v1/workspaces/{workspaceId}/projects
Content-Type: application/json
{
"name": "My Project",
"isPublic": true,
"clientId": "optional-client-id"
}Update Project
PUT /clockify/api/v1/workspaces/{workspaceId}/projects/{projectId}
Content-Type: application/json
{
"name": "Updated Project Name",
"archived": true
}Delete Project
DELETE /clockify/api/v1/workspaces/{workspaceId}/projects/{projectId}List Clients
GET /clockify/api/v1/workspaces/{workspaceId}/clientsCreate Client
POST /clockify/api/v1/workspaces/{workspaceId}/clients
Content-Type: application/json
{
"name": "Client Name",
"address": "123 Main St",
"note": "Client notes"
}List Tags
GET /clockify/api/v1/workspaces/{workspaceId}/tagsCreate Tag
POST /clockify/api/v1/workspaces/{workspaceId}/tags
Content-Type: application/json
{
"name": "urgent"
}List Tasks on Project
GET /clockify/api/v1/workspaces/{workspaceId}/projects/{projectId}/tasksCreate Task
POST /clockify/api/v1/workspaces/{workspaceId}/projects/{projectId}/tasks
Content-Type: application/json
{
"name": "Task Name",
"assigneeIds": ["user-id"],
"estimate": "PT2H",
"billable": true
}Get User's Time Entries
GET /clockify/api/v1/workspaces/{workspaceId}/user/{userId}/time-entriesCreate Time Entry
POST /clockify/api/v1/workspaces/{workspaceId}/time-entries
Content-Type: application/json
{
"start": "2026-02-13T09:00:00Z",
"end": "2026-02-13T10:00:00Z",
"description": "Working on task",
"projectId": "project-id",
"taskId": "task-id",
"tagIds": ["tag-id"],
"billable": true
}Get Time Entry
GET /clockify/api/v1/workspaces/{workspaceId}/time-entries/{timeEntryId}Update Time Entry
PUT /clockify/api/v1/workspaces/{workspaceId}/time-entries/{timeEntryId}
Content-Type: application/json
{
"description": "Updated description",
"end": "2026-02-13T11:00:00Z"
}Delete Time Entry
DELETE /clockify/api/v1/workspaces/{workspaceId}/time-entries/{timeEntryId}Stop Running Timer
PATCH /clockify/api/v1/workspaces/{workspaceId}/user/{userId}/time-entries
Content-Type: application/json
{
"end": "2026-02-13T17:00:00Z"
}Notes
- All IDs are strings
- Timestamps must be in ISO 8601 format with UTC timezone (e.g.,
2026-02-13T09:00:00Z) - Duration format uses ISO 8601 duration (e.g.,
PT1Hfor 1 hour,PT30Mfor 30 minutes) - Cannot delete active projects or tasks - must archive them first
- Page-based pagination with
pageandpage-sizequery parameters - Response includes
Last-Pageheader indicating if more pages exist - Rate limit: 50 requests per second per workspace
Resources
Coda Routing Reference
App name: coda Base URL proxied: coda.io/apis/v1
API Path Pattern
/coda/apis/v1/{resource}Common Endpoints
Account
Get Current User
GET /coda/apis/v1/whoamiDocs
List Docs
GET /coda/apis/v1/docsCreate Doc
POST /coda/apis/v1/docsGet Doc
GET /coda/apis/v1/docs/{docId}Delete Doc
DELETE /coda/apis/v1/docs/{docId}Pages
List Pages
GET /coda/apis/v1/docs/{docId}/pagesCreate Page
POST /coda/apis/v1/docs/{docId}/pagesGet Page
GET /coda/apis/v1/docs/{docId}/pages/{pageIdOrName}Update Page
PUT /coda/apis/v1/docs/{docId}/pages/{pageIdOrName}Delete Page
DELETE /coda/apis/v1/docs/{docId}/pages/{pageIdOrName}Tables
List Tables
GET /coda/apis/v1/docs/{docId}/tablesGet Table
GET /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}Columns
List Columns
GET /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/columnsGet Column
GET /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/columns/{columnIdOrName}Rows
List Rows
GET /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/rowsGet Row
GET /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName}Insert/Upsert Rows
POST /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/rowsUpdate Row
PUT /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName}Delete Row
DELETE /coda/apis/v1/docs/{docId}/tables/{tableIdOrName}/rows/{rowIdOrName}Formulas
List Formulas
GET /coda/apis/v1/docs/{docId}/formulasGet Formula
GET /coda/apis/v1/docs/{docId}/formulas/{formulaIdOrName}Controls
List Controls
GET /coda/apis/v1/docs/{docId}/controlsGet Control
GET /coda/apis/v1/docs/{docId}/controls/{controlIdOrName}Permissions
Get Sharing Metadata
GET /coda/apis/v1/docs/{docId}/acl/metadataList Permissions
GET /coda/apis/v1/docs/{docId}/acl/permissionsAdd Permission
POST /coda/apis/v1/docs/{docId}/acl/permissionsDelete Permission
DELETE /coda/apis/v1/docs/{docId}/acl/permissions/{permissionId}Categories
List Categories
GET /coda/apis/v1/categoriesUtilities
Resolve Browser Link
GET /coda/apis/v1/resolveBrowserLink?url={encodedUrl}Get Mutation Status
GET /coda/apis/v1/mutationStatus/{requestId}Analytics
List Doc Analytics
GET /coda/apis/v1/analytics/docsList Pack Analytics
GET /coda/apis/v1/analytics/packsGet Analytics Update Time
GET /coda/apis/v1/analytics/updatedQuery Parameters
Common parameters across endpoints:
limit- Page size (max: 200)pageToken- Cursor for paginationquery- Search filteruseColumnNames- Use column names vs IDs (rows)valueFormat- simple, simpleWithArrays, rich (rows)
Notes
- Mutations (create/update/delete) return HTTP 202 with requestId
- Use
/mutationStatus/{requestId}to check completion - Newly created docs need a moment before child resources are accessible
- Table/column names can be used instead of IDs
- Row operations require base tables, not views
- Page-level analytics require Enterprise plan
Resources
Cognito Forms Routing Reference
App name: cognito-forms Base URL proxied: www.cognitoforms.com
API Path Pattern
/cognito-forms/api/{endpoint}Common Endpoints
Forms
List Forms
GET /cognito-forms/api/formsGet Form
GET /cognito-forms/api/forms/{formId}Entries
List Entries
GET /cognito-forms/api/forms/{formId}/entriesGet Entry
GET /cognito-forms/api/forms/{formId}/entries/{entryId}Create Entry
POST /cognito-forms/api/forms/{formId}/entries
Content-Type: application/json
{
"Name": {
"First": "John",
"Last": "Doe"
},
"Email": "john.doe@example.com"
}Update Entry
PUT /cognito-forms/api/forms/{formId}/entries/{entryId}
Content-Type: application/json
{
"Name": {
"First": "Jane",
"Last": "Doe"
},
"Email": "jane.doe@example.com"
}Delete Entry
DELETE /cognito-forms/api/forms/{formId}/entries/{entryId}Documents
Get Document
GET /cognito-forms/api/forms/{formId}/entries/{entryId}/documents/{templateNumber}Files
Get File
GET /cognito-forms/api/files/{fileId}Form Availability
Set Form Availability
PUT /cognito-forms/api/forms/{formId}/availability
Content-Type: application/json
{
"start": "2026-03-01T00:00:00Z",
"end": "2026-03-31T23:59:59Z",
"message": "This form is currently unavailable."
}Field Types
Complex fields use nested JSON objects:
- Name:
{"First": "...", "Last": "..."} - Address:
{"Line1": "...", "Line2": "...", "City": "...", "State": "...", "PostalCode": "..."} - Choice (single):
"OptionValue" - Choice (multiple):
["Option1", "Option2"]
Notes
- Form IDs can be internal form name (string) or numeric ID
- Entry IDs can be entry number (integer) or entry ID (GUID)
- Authentication is automatic - the router injects OAuth token
- Rate limit: 100 requests per 60 seconds
- File and document endpoints return temporary download URLs
- API scopes: Read, Read/Write, or Read/Write/Delete
Resources
CompanyCam Routing Reference
App name: companycam Base URL proxied: api.companycam.com
API Path Pattern
/companycam/v2/{resource}Common Endpoints
Company
Get Company
GET /companycam/v2/companyUsers
Get Current User
GET /companycam/v2/users/currentList Users
GET /companycam/v2/usersCreate User
POST /companycam/v2/usersGet User
GET /companycam/v2/users/{id}Update User
PUT /companycam/v2/users/{id}Delete User
DELETE /companycam/v2/users/{id}Projects
List Projects
GET /companycam/v2/projectsCreate Project
POST /companycam/v2/projectsGet Project
GET /companycam/v2/projects/{id}Update Project
PUT /companycam/v2/projects/{id}Delete Project
DELETE /companycam/v2/projects/{id}Archive Project
PATCH /companycam/v2/projects/{id}/archiveRestore Project
PUT /companycam/v2/projects/{id}/restoreProject Photos
List Project Photos
GET /companycam/v2/projects/{project_id}/photosAdd Photo to Project
POST /companycam/v2/projects/{project_id}/photosProject Comments
List Project Comments
GET /companycam/v2/projects/{project_id}/commentsAdd Project Comment
POST /companycam/v2/projects/{project_id}/commentsProject Labels
List Project Labels
GET /companycam/v2/projects/{project_id}/labelsAdd Labels
POST /companycam/v2/projects/{project_id}/labelsProject Documents
List Documents
GET /companycam/v2/projects/{project_id}/documentsUpload Document
POST /companycam/v2/projects/{project_id}/documentsPhotos
List All Photos
GET /companycam/v2/photosGet Photo
GET /companycam/v2/photos/{id}Update Photo
PUT /companycam/v2/photos/{id}Delete Photo
DELETE /companycam/v2/photos/{id}Tags
List Tags
GET /companycam/v2/tagsCreate Tag
POST /companycam/v2/tagsGet Tag
GET /companycam/v2/tags/{id}Update Tag
PUT /companycam/v2/tags/{id}Delete Tag
DELETE /companycam/v2/tags/{id}Groups
List Groups
GET /companycam/v2/groupsCreate Group
POST /companycam/v2/groupsGet Group
GET /companycam/v2/groups/{id}Update Group
PUT /companycam/v2/groups/{id}Delete Group
DELETE /companycam/v2/groups/{id}Checklists
List Checklists
GET /companycam/v2/checklistsWebhooks
List Webhooks
GET /companycam/v2/webhooksCreate Webhook
POST /companycam/v2/webhooksGet Webhook
GET /companycam/v2/webhooks/{id}Update Webhook
PUT /companycam/v2/webhooks/{id}Delete Webhook
DELETE /companycam/v2/webhooks/{id}Query Parameters
page- Page number (default: 1)per_page- Results per page (default: 25)query- Search query (projects)status- Filter by statusmodified_since- Unix timestamp for filtering
Notes
- IDs are returned as strings
- Timestamps are Unix timestamps (seconds since epoch)
- Comments must be wrapped in a
commentobject - Webhooks use
scopesparameter (notevents) - Rate limits: 240 GET/min, 100 POST/PUT/DELETE/min
Resources
Confluence Routing Reference
App name: confluence Base URL proxied: api.atlassian.com
Getting Cloud ID
Confluence Cloud requires a cloud ID in the API path. First, get accessible resources:
GET /confluence/oauth/token/accessible-resourcesResponse:
[{
"id": "62909843-b784-4c35-b770-e4e2a26f024b",
"url": "https://yoursite.atlassian.net",
"name": "yoursite",
"scopes": ["read:confluence-content.all", "write:confluence-content", ...]
}]API Path Pattern
V2 API (recommended):
/confluence/ex/confluence/{cloudId}/wiki/api/v2/{endpoint}V1 REST API (limited):
/confluence/ex/confluence/{cloudId}/wiki/rest/api/{endpoint}Common Endpoints (V2 API)
Pages
List Pages
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages?space-id={spaceId}
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages?limit=25Get Page
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}?body-format=storageCreate Page
POST /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages
Content-Type: application/json
{
"spaceId": "98306",
"status": "current",
"title": "Page Title",
"body": {
"representation": "storage",
"value": "<p>Page content</p>"
}
}Update Page
PUT /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}
Content-Type: application/json
{
"id": "98391",
"status": "current",
"title": "Updated Title",
"body": {
"representation": "storage",
"value": "<p>Updated content</p>"
},
"version": {"number": 2}
}Delete Page
DELETE /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}Get Page Children
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}/childrenGet Page Labels
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}/labelsGet Page Comments
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}/footer-commentsSpaces
List Spaces
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/spacesGet Space
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/spaces/{spaceId}Get Space Pages
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/spaces/{spaceId}/pagesBlogposts
List Blogposts
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/blogpostsCreate Blogpost
POST /confluence/ex/confluence/{cloudId}/wiki/api/v2/blogposts
Content-Type: application/json
{
"spaceId": "98306",
"title": "Blog Post Title",
"body": {
"representation": "storage",
"value": "<p>Blog content</p>"
}
}Comments
List Footer Comments
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/footer-commentsCreate Footer Comment
POST /confluence/ex/confluence/{cloudId}/wiki/api/v2/footer-comments
Content-Type: application/json
{
"pageId": "98391",
"body": {
"representation": "storage",
"value": "<p>Comment text</p>"
}
}Attachments
List Attachments
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/attachmentsGet Page Attachments
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/pages/{pageId}/attachmentsTasks
List Tasks
GET /confluence/ex/confluence/{cloudId}/wiki/api/v2/tasksUser (V1 API)
Get Current User
GET /confluence/ex/confluence/{cloudId}/wiki/rest/api/user/currentNotes
- Always fetch cloud ID first using
/oauth/token/accessible-resources - V2 API is recommended for most operations
- Content uses Confluence storage format (XML-like):
<p>Paragraph</p> - When updating pages, you must increment the version number
- DELETE operations return 204 No Content
- Pagination uses cursor-based approach with
_links.nextcontaining the cursor value
Resources
Constant Contact Routing Reference
App name: constant-contact Base URL proxied: api.cc.email
API Path Pattern
/constant-contact/v3/{resource}Common Endpoints
List Contacts
GET /constant-contact/v3/contactsGet Contact
GET /constant-contact/v3/contacts/{contact_id}Create Contact
POST /constant-contact/v3/contacts
Content-Type: application/json
{
"email_address": {
"address": "john@example.com",
"permission_to_send": "implicit"
},
"first_name": "John",
"last_name": "Doe",
"list_memberships": ["list-uuid"]
}Update Contact
PUT /constant-contact/v3/contacts/{contact_id}
Content-Type: application/json
{
"first_name": "John",
"last_name": "Smith"
}Delete Contact
DELETE /constant-contact/v3/contacts/{contact_id}List Contact Lists
GET /constant-contact/v3/contact_listsCreate Contact List
POST /constant-contact/v3/contact_lists
Content-Type: application/json
{
"name": "Newsletter Subscribers",
"description": "Main newsletter list"
}List Email Campaigns
GET /constant-contact/v3/emailsCreate Email Campaign
POST /constant-contact/v3/emails
Content-Type: application/json
{
"name": "March Newsletter",
"email_campaign_activities": [
{
"format_type": 5,
"from_name": "Company",
"from_email": "marketing@example.com",
"reply_to_email": "reply@example.com",
"subject": "Newsletter",
"html_content": "<html><body>Hello</body></html>"
}
]
}List Segments
GET /constant-contact/v3/segmentsList Tags
GET /constant-contact/v3/contact_tagsGet Account Summary
GET /constant-contact/v3/account/summaryEmail Campaign Summaries
GET /constant-contact/v3/reports/summary_reports/email_campaign_summariesNotes
- Authentication is automatic - the router injects the OAuth token
- Resource IDs use UUID format (36 characters with hyphens)
- All dates use ISO-8601 format
- Uses cursor-based pagination with
limitandcursorparameters - Maximum 1,000 contact lists per account
- Bulk operations are asynchronous
Resources
Dropbox Routing Reference
App name: dropbox Base URL proxied: api.dropboxapi.com
API Path Pattern
/dropbox/2/{endpoint}Important: All Dropbox API v2 endpoints use HTTP POST with JSON request bodies.
Common Endpoints
Users
Get Current Account
POST /dropbox/2/users/get_current_account
Content-Type: application/json
nullGet Space Usage
POST /dropbox/2/users/get_space_usage
Content-Type: application/json
nullFiles
List Folder
POST /dropbox/2/files/list_folder
Content-Type: application/json
{
"path": ""
}Use empty string "" for root folder.
Continue Listing
POST /dropbox/2/files/list_folder/continue
Content-Type: application/json
{
"cursor": "..."
}Get Metadata
POST /dropbox/2/files/get_metadata
Content-Type: application/json
{
"path": "/document.pdf"
}Create Folder
POST /dropbox/2/files/create_folder_v2
Content-Type: application/json
{
"path": "/New Folder",
"autorename": false
}Copy
POST /dropbox/2/files/copy_v2
Content-Type: application/json
{
"from_path": "/source/file.pdf",
"to_path": "/destination/file.pdf"
}Move
POST /dropbox/2/files/move_v2
Content-Type: application/json
{
"from_path": "/old/file.pdf",
"to_path": "/new/file.pdf"
}Delete
POST /dropbox/2/files/delete_v2
Content-Type: application/json
{
"path": "/file-to-delete.pdf"
}Get Temporary Link
POST /dropbox/2/files/get_temporary_link
Content-Type: application/json
{
"path": "/document.pdf"
}Search
Search Files
POST /dropbox/2/files/search_v2
Content-Type: application/json
{
"query": "document"
}Revisions
List Revisions
POST /dropbox/2/files/list_revisions
Content-Type: application/json
{
"path": "/document.pdf"
}Tags
Get Tags
POST /dropbox/2/files/tags/get
Content-Type: application/json
{
"paths": ["/document.pdf"]
}Add Tag
POST /dropbox/2/files/tags/add
Content-Type: application/json
{
"path": "/document.pdf",
"tag_text": "important"
}Remove Tag
POST /dropbox/2/files/tags/remove
Content-Type: application/json
{
"path": "/document.pdf",
"tag_text": "important"
}Pagination
Dropbox uses cursor-based pagination:
POST /dropbox/2/files/list_folder
# Response includes "cursor" and "has_more": true/false
POST /dropbox/2/files/list_folder/continue
# Use cursor from previous responseNotes
- All endpoints use POST method
- Request bodies are JSON
- Use empty string
""for root folder path - Paths are case-insensitive but case-preserving
- Tag text must match pattern
[\w]+(alphanumeric and underscores) - Temporary links expire after 4 hours
Resources
ElevenLabs Routing Reference
App name: elevenlabs Base URL proxied: api.elevenlabs.io
API Path Pattern
/elevenlabs/v1/{resource}Common Endpoints
Text-to-Speech
Convert Text to Speech
POST /elevenlabs/v1/text-to-speech/{voice_id}Stream Text to Speech
POST /elevenlabs/v1/text-to-speech/{voice_id}/streamVoices
List Voices
GET /elevenlabs/v1/voicesGet Voice
GET /elevenlabs/v1/voices/{voice_id}Create Voice Clone
POST /elevenlabs/v1/voices/addDelete Voice
DELETE /elevenlabs/v1/voices/{voice_id}Models
List Models
GET /elevenlabs/v1/modelsUser
Get User Info
GET /elevenlabs/v1/userGet Subscription Info
GET /elevenlabs/v1/user/subscriptionHistory
List History
GET /elevenlabs/v1/history?page_size=100Get Audio from History
GET /elevenlabs/v1/history/{history_item_id}/audioSound Effects
Generate Sound Effect
POST /elevenlabs/v1/sound-generationAudio Isolation
Remove Background Noise
POST /elevenlabs/v1/audio-isolationSpeech-to-Text
Transcribe Audio
POST /elevenlabs/v1/speech-to-textSpeech-to-Speech
Convert Voice
POST /elevenlabs/v1/speech-to-speech/{voice_id}Notes
- Text-to-Speech returns audio/mpeg data
- Sound Effects returns audio/mpeg data
- Cursor-based pagination with
page_sizeandstart_after_history_item_id - Response headers include
x-character-countfor usage tracking - Models available:
eleven_multilingual_v2,eleven_turbo_v2_5
Resources
Fathom Routing Reference
App name: fathom Base URL proxied: api.fathom.ai
API Path Pattern
/fathom/external/v1/{resource}Common Endpoints
List Meetings
GET /fathom/external/v1/meetingsWith filters:
GET /fathom/external/v1/meetings?created_after=2025-01-01T00:00:00Z&teams[]=SalesGet Summary
GET /fathom/external/v1/recordings/{recording_id}/summaryAsync callback:
GET /fathom/external/v1/recordings/{recording_id}/summary?destination_url=https://example.com/webhookGet Transcript
GET /fathom/external/v1/recordings/{recording_id}/transcriptAsync callback:
GET /fathom/external/v1/recordings/{recording_id}/transcript?destination_url=https://example.com/webhookList Teams
GET /fathom/external/v1/teamsList Team Members
GET /fathom/external/v1/team_members?team=SalesCreate Webhook
POST /fathom/external/v1/webhooks
Content-Type: application/json
{
"destination_url": "https://example.com/webhook",
"triggered_for": ["my_recordings", "my_shared_with_team_recordings"],
"include_transcript": true,
"include_summary": true,
"include_action_items": true
}Delete Webhook
DELETE /fathom/external/v1/webhooks/{id}Notes
- Recording IDs are integers
- Timestamps are in ISO 8601 format
- OAuth users cannot use inline transcript/summary parameters on
/meetingsendpoint - use dedicated/recordings/{id}/summaryand/recordings/{id}/transcriptendpoints instead - Use cursor-based pagination with
cursorparameter - Webhook
triggered_foroptions:my_recordings,shared_external_recordings,my_shared_with_team_recordings,shared_team_recordings - Webhook secrets are used to verify webhook signatures
Resources
{
"name": "get_meeting_transcript",
"title": "Get the full transcript for a specific Granola meeting by ID",
"description": "Get the full transcript for a specific Granola meeting by ID. Returns only the verbatim transcript content, not summaries or notes.\nUse this when the user needs exact quotes, specific wording, or wants to review what was literally said in a meeting. For summarized content or action items, use query_granola_meetings or list_meetings/get_meetings instead.",
"inputSchema": {
"type": "object",
"properties": {
"meeting_id": {
"type": "string",
"format": "uuid",
"description": "Meeting UUID"
}
},
"required": [
"meeting_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
}Related skills
FAQ
How does authentication work?
All requests use the MATON_API_KEY in the Authorization header; the gateway injects the correct OAuth token, but the key alone grants no third-party access until the user authorizes each service via Maton's connect flow.
What is the base URL pattern?
https://gateway.maton.ai/{app}/{native-api-path}, where the path must start with the connection's app name such as /google-mail/ or /slack/.