API Gateway
Passthrough proxy for direct access to third-party APIs using managed auth connections. 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))
EOF
Base 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.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
The 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
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- 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))
EOF
Query 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",
"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))
EOF
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))
EOF
Response:
{
"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))
EOF
Specifying 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))
EOF
If omitted, the gateway uses the default (oldest) active connection for that app.
Supported Services
| Service |
App Name |
Base URL Proxied |
| 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 |
| Calendly |
calendly |
api.calendly.com |
| Chargebee |
chargebee |
{subdomain}.chargebee.com |
| ClickUp |
clickup |
api.clickup.com |
| Fathom |
fathom |
api.fathom.ai |
| GitHub |
github |
api.github.com |
| Google Ads |
google-ads |
googleads.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 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 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 Workspace Admin |
google-workspace-admin |
admin.googleapis.com |
| HubSpot |
hubspot |
api.hubapi.com |
| Jira |
jira |
api.atlassian.com |
| JotForm |
jotform |
api.jotform.com |
| Klaviyo |
klaviyo |
a.klaviyo.com |
| Linear |
linear |
api.linear.app |
| Mailchimp |
mailchimp |
{dc}.api.mailchimp.com |
| Monday.com |
monday |
api.monday.com |
| Notion |
notion |
api.notion.com |
| Outlook |
outlook |
graph.microsoft.com |
| Pipedrive |
pipedrive |
api.pipedrive.com |
| QuickBooks |
quickbooks |
quickbooks.api.intuit.com |
| Salesforce |
salesforce |
{instance}.salesforce.com |
| Slack |
slack |
slack.com |
| Stripe |
stripe |
api.stripe.com |
| Todoist |
todoist |
api.todoist.com |
| Trello |
trello |
api.trello.com |
| Typeform |
typeform |
api.typeform.com |
| WhatsApp Business |
whatsapp-business |
graph.facebook.com |
| WooCommerce |
woocommerce |
{store-url}/wp-json/wc/v3 |
| Xero |
xero |
api.xero.com |
| YouTube |
youtube |
www.googleapis.com |
| Zoho Bigin |
zoho-bigin |
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 Recruit |
zoho-recruit |
recruit.zoho.com |
See references/ for detailed routing guides per provider:
- 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
- Calendly - Event types, scheduled events, availability, webhooks
- Chargebee - Subscriptions, customers, invoices
- ClickUp - Tasks, lists, folders, spaces, webhooks
- Fathom - Meeting recordings, transcripts, summaries, webhooks
- GitHub - Repositories, issues, pull requests, commits
- Google Ads - Campaigns, ad groups, GAQL queries
- Google Analytics Admin - Reports, dimensions, metrics
- Google Analytics Data - Reports, dimensions, metrics
- Google Calendar - Events, calendars, free/busy
- 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 Play - In-app products, subscriptions, reviews
- Google Search Console - Search analytics, sitemaps
- Google Sheets - Values, ranges, formatting
- Google Slides - Presentations, slides, formatting
- Google Workspace Admin - Users, groups, org units, domains, roles
- HubSpot - Contacts, companies, deals
- Jira - Issues, projects, JQL queries
- JotForm - Forms, submissions, webhooks
- Klaviyo - Profiles, lists, campaigns, flows, events
- Linear - Issues, projects, teams, cycles (GraphQL)
- Mailchimp - Audiences, campaigns, templates, automations
- Monday.com - Boards, items, columns, groups (GraphQL)
- Notion - Pages, databases, blocks
- Outlook - Mail, calendar, contacts
- Pipedrive - Deals, persons, organizations, activities
- QuickBooks - Customers, invoices, reports
- Salesforce - SOQL, sObjects, CRUD
- Slack - Messages, channels, users
- Stripe - Customers, subscriptions, payments
- Todoist - Tasks, projects, sections, labels, comments
- Trello - Boards, lists, cards, checklists
- Typeform - Forms, responses, insights
- WhatsApp Business - Messages, templates, media
- WooCommerce - Products, orders, customers, coupons
- Xero - Contacts, invoices, reports
- YouTube - Videos, playlists, channels, subscriptions
- Zoho Bigin - Contacts, companies, pipelines, products
- 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 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))
EOF
HubSpot - 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))
EOF
Google 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))
EOF
Salesforce - 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))
EOF
Airtable - 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))
EOF
Notion - 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))
EOF
Stripe - 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))
EOF
Code 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: Invalid API Key
- Check that the
MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
- 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))
EOF
Troubleshooting: 500 Internal 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 -g flag 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
Use native API docs: Refer to each service's official API documentation for endpoint paths and parameters.
Headers are forwarded: Custom headers (except Host and Authorization) are forwarded to the target API.
Query params work: URL query parameters are passed through to the target API.
All HTTP methods supported: GET, POST, PUT, PATCH, DELETE are all supported.
QuickBooks special case: Use :realmId in the path and it will be replaced with the connected realm ID.
Optional
1---2name: api-gateway3description: API gateway for calling third-party APIs with managed auth. Use this skill when users want to interact with external services like Slack, HubSpot, Salesforce, Google Workspace, Stripe, and more.4---5
6# API Gateway
7
8Passthrough proxy for direct access to third-party APIs using managed auth connections. The API gateway lets you call native API endpoints directly.
9
10## Quick Start
11
12```bash
13# Native Slack API call
14python <<'EOF'
15import urllib.request, os, json
16data = json.dumps({'channel': 'C0123456', 'text': 'Hello from gateway!'}).encode()
17req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
18req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
19req.add_header('Content-Type', 'application/json')
20print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
21EOF
22```
23
24
25## Base URL
26
27```
28https://gateway.maton.ai/{app}/{native-api-path}
29```
30
31Replace `{app}` with the service name and `{native-api-path}` with the actual API endpoint path.
32
33## Authentication
34
35All requests require the Maton API key in the Authorization header:
36
37```
38Authorization: Bearer $MATON_API_KEY
39```
40
41The API gateway automatically injects the appropriate OAuth token for the target service.
42
43**Environment Variable:** You can set your API key as the `MATON_API_KEY` environment variable:
44
45```bash
46export MATON_API_KEY="YOUR_API_KEY"
47```
48
49## Getting Your API Key
50
511. Sign in or create an account at [maton.ai](https://maton.ai)
522. Go to [maton.ai/settings](https://maton.ai/settings)
533. Click the copy button on the right side of API Key section to copy it
54
55## Connection Management
56
57Connection management uses a separate base URL: `https://ctrl.maton.ai`
58
59### List Connections
60
61```bash
62python <<'EOF'
63import urllib.request, os, json
64req = urllib.request.Request('https://ctrl.maton.ai/connections?app=slack&status=ACTIVE')
65req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
66print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
67EOF
68```
69
70**Query Parameters (optional):**
71- `app` - Filter by service name (e.g., `slack`, `hubspot`, `salesforce`)
72- `status` - Filter by connection status (`ACTIVE`, `PENDING`, `FAILED`)
73
74**Response:**
75```json
76{
77 "connections": [
78 {
79 "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
80 "status": "ACTIVE",
81 "creation_time": "2025-12-08T07:20:53.488460Z",
82 "last_updated_time": "2026-01-31T20:03:32.593153Z",
83 "url": "https://connect.maton.ai/?session_token=5e9...",
84 "app": "slack",
85 "metadata": {}
86 }
87 ]
88}
89```
90
91### Create Connection
92
93```bash
94python <<'EOF'
95import urllib.request, os, json
96data = json.dumps({'app': 'slack'}).encode()
97req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
98req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
99req.add_header('Content-Type', 'application/json')
100print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
101EOF
102```
103
104### Get Connection
105
106```bash
107python <<'EOF'
108import urllib.request, os, json
109req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
110req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
111print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
112EOF
113```
114
115**Response:**
116```json
117{
118 "connection": {
119 "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
120 "status": "ACTIVE",
121 "creation_time": "2025-12-08T07:20:53.488460Z",
122 "last_updated_time": "2026-01-31T20:03:32.593153Z",
123 "url": "https://connect.maton.ai/?session_token=5e9...",
124 "app": "slack",
125 "metadata": {}
126 }
127}
128```
129
130Open the returned URL in a browser to complete OAuth.
131
132### Delete Connection
133
134```bash
135python <<'EOF'
136import urllib.request, os, json
137req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
138req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
139print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
140EOF
141```
142
143### Specifying Connection
144
145If 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:
146
147```bash
148python <<'EOF'
149import urllib.request, os, json
150data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
151req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
152req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
153req.add_header('Content-Type', 'application/json')
154req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
155print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
156EOF
157```
158
159If omitted, the gateway uses the default (oldest) active connection for that app.
160
161## Supported Services
162
163| Service | App Name | Base URL Proxied |
164|---------|----------|------------------|
165| Acuity Scheduling | `acuity-scheduling` | `acuityscheduling.com` |
166| Airtable | `airtable` | `api.airtable.com` |
167| Apollo | `apollo` | `api.apollo.io` |
168| Asana | `asana` | `app.asana.com` |
169| Attio | `attio` | `api.attio.com` |
170| Calendly | `calendly` | `api.calendly.com` |
171| Chargebee | `chargebee` | `{subdomain}.chargebee.com` |
172| ClickUp | `clickup` | `api.clickup.com` |
173| Fathom | `fathom` | `api.fathom.ai` |
174| GitHub | `github` | `api.github.com` |
175| Google Ads | `google-ads` | `googleads.googleapis.com` |
176| Google Analytics Admin | `google-analytics-admin` | `analyticsadmin.googleapis.com` |
177| Google Analytics Data | `google-analytics-data` | `analyticsdata.googleapis.com` |
178| Google Calendar | `google-calendar` | `www.googleapis.com` |
179| Google Docs | `google-docs` | `docs.googleapis.com` |
180| Google Drive | `google-drive` | `www.googleapis.com` |
181| Google Forms | `google-forms` | `forms.googleapis.com` |
182| Gmail | `google-mail` | `gmail.googleapis.com` |
183| Google Meet | `google-meet` | `meet.googleapis.com` |
184| Google Play | `google-play` | `androidpublisher.googleapis.com` |
185| Google Search Console | `google-search-console` | `www.googleapis.com` |
186| Google Sheets | `google-sheets` | `sheets.googleapis.com` |
187| Google Slides | `google-slides` | `slides.googleapis.com` |
188| Google Workspace Admin | `google-workspace-admin` | `admin.googleapis.com` |
189| HubSpot | `hubspot` | `api.hubapi.com` |
190| Jira | `jira` | `api.atlassian.com` |
191| JotForm | `jotform` | `api.jotform.com` |
192| Klaviyo | `klaviyo` | `a.klaviyo.com` |
193| Linear | `linear` | `api.linear.app` |
194| Mailchimp | `mailchimp` | `{dc}.api.mailchimp.com` |
195| Monday.com | `monday` | `api.monday.com` |
196| Notion | `notion` | `api.notion.com` |
197| Outlook | `outlook` | `graph.microsoft.com` |
198| Pipedrive | `pipedrive` | `api.pipedrive.com` |
199| QuickBooks | `quickbooks` | `quickbooks.api.intuit.com` |
200| Salesforce | `salesforce` | `{instance}.salesforce.com` |
201| Slack | `slack` | `slack.com` |
202| Stripe | `stripe` | `api.stripe.com` |
203| Todoist | `todoist` | `api.todoist.com` |
204| Trello | `trello` | `api.trello.com` |
205| Typeform | `typeform` | `api.typeform.com` |
206| WhatsApp Business | `whatsapp-business` | `graph.facebook.com` |
207| WooCommerce | `woocommerce` | `{store-url}/wp-json/wc/v3` |
208| Xero | `xero` | `api.xero.com` |
209| YouTube | `youtube` | `www.googleapis.com` |
210| Zoho Bigin | `zoho-bigin` | `www.zohoapis.com` |
211| Zoho Books | `zoho-books` | `www.zohoapis.com` |
212| Zoho Calendar | `zoho-calendar` | `calendar.zoho.com` |
213| Zoho CRM | `zoho-crm` | `www.zohoapis.com` |
214| Zoho Inventory | `zoho-inventory` | `www.zohoapis.com` |
215| Zoho Mail | `zoho-mail` | `mail.zoho.com` |
216| Zoho People | `zoho-people` | `people.zoho.com` |
217| Zoho Recruit | `zoho-recruit` | `recruit.zoho.com` |
218
219See [references/](references/) for detailed routing guides per provider:
220- [Acuity Scheduling](references/acuity-scheduling.md) - Appointments, calendars, clients, availability
221- [Airtable](references/airtable.md) - Records, bases, tables
222- [Apollo](references/apollo.md) - People search, enrichment, contacts
223- [Asana](references/asana.md) - Tasks, projects, workspaces, webhooks
224- [Attio](references/attio.md) - People, companies, records, tasks
225- [Calendly](references/calendly.md) - Event types, scheduled events, availability, webhooks
226- [Chargebee](references/chargebee.md) - Subscriptions, customers, invoices
227- [ClickUp](references/clickup.md) - Tasks, lists, folders, spaces, webhooks
228- [Fathom](references/fathom.md) - Meeting recordings, transcripts, summaries, webhooks
229- [GitHub](references/github.md) - Repositories, issues, pull requests, commits
230- [Google Ads](references/google-ads.md) - Campaigns, ad groups, GAQL queries
231- [Google Analytics Admin](references/google-analytics-admin.md) - Reports, dimensions, metrics
232- [Google Analytics Data](references/google-analytics-data.md) - Reports, dimensions, metrics
233- [Google Calendar](references/google-calendar.md) - Events, calendars, free/busy
234- [Google Docs](references/google-docs.md) - Document creation, batch updates
235- [Google Drive](references/google-drive.md) - Files, folders, permissions
236- [Google Forms](references/google-forms.md) - Forms, questions, responses
237- [Gmail](references/google-mail.md) - Messages, threads, labels
238- [Google Meet](references/google-meet.md) - Spaces, conference records, participants
239- [Google Play](references/google-play.md) - In-app products, subscriptions, reviews
240- [Google Search Console](references/google-search-console.md) - Search analytics, sitemaps
241- [Google Sheets](references/google-sheets.md) - Values, ranges, formatting
242- [Google Slides](references/google-slides.md) - Presentations, slides, formatting
243- [Google Workspace Admin](references/google-workspace-admin.md) - Users, groups, org units, domains, roles
244- [HubSpot](references/hubspot.md) - Contacts, companies, deals
245- [Jira](references/jira.md) - Issues, projects, JQL queries
246- [JotForm](references/jotform.md) - Forms, submissions, webhooks
247- [Klaviyo](references/klaviyo.md) - Profiles, lists, campaigns, flows, events
248- [Linear](references/linear.md) - Issues, projects, teams, cycles (GraphQL)
249- [Mailchimp](references/mailchimp.md) - Audiences, campaigns, templates, automations
250- [Monday.com](references/monday.md) - Boards, items, columns, groups (GraphQL)
251- [Notion](references/notion.md) - Pages, databases, blocks
252- [Outlook](references/outlook.md) - Mail, calendar, contacts
253- [Pipedrive](references/pipedrive.md) - Deals, persons, organizations, activities
254- [QuickBooks](references/quickbooks.md) - Customers, invoices, reports
255- [Salesforce](references/salesforce.md) - SOQL, sObjects, CRUD
256- [Slack](references/slack.md) - Messages, channels, users
257- [Stripe](references/stripe.md) - Customers, subscriptions, payments
258- [Todoist](references/todoist.md) - Tasks, projects, sections, labels, comments
259- [Trello](references/trello.md) - Boards, lists, cards, checklists
260- [Typeform](references/typeform.md) - Forms, responses, insights
261- [WhatsApp Business](references/whatsapp-business.md) - Messages, templates, media
262- [WooCommerce](references/woocommerce.md) - Products, orders, customers, coupons
263- [Xero](references/xero.md) - Contacts, invoices, reports
264- [YouTube](references/youtube.md) - Videos, playlists, channels, subscriptions
265- [Zoho Bigin](references/zoho-bigin.md) - Contacts, companies, pipelines, products
266- [Zoho Books](references/zoho-books.md) - Invoices, contacts, bills, expenses
267- [Zoho Calendar](references/zoho-calendar.md) - Calendars, events, attendees, reminders
268- [Zoho CRM](references/zoho-crm.md) - Leads, contacts, accounts, deals, search
269- [Zoho Inventory](references/zoho-inventory.md) - Items, sales orders, invoices, purchase orders, bills
270- [Zoho Mail](references/zoho-mail.md) - Messages, folders, labels, attachments
271- [Zoho People](references/zoho-people.md) - Employees, departments, designations, attendance, leave
272- [Zoho Recruit](references/zoho-recruit.md) - Candidates, job openings, interviews, applications
273
274## Examples
275
276### Slack - Post Message (Native API)
277
278```bash
279# Native Slack API: POST https://slack.com/api/chat.postMessage
280python <<'EOF'
281import urllib.request, os, json
282data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
283req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST')
284req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
285req.add_header('Content-Type', 'application/json; charset=utf-8')
286print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
287EOF
288```
289
290### HubSpot - Create Contact (Native API)
291
292```bash
293# Native HubSpot API: POST https://api.hubapi.com/crm/v3/objects/contacts
294python <<'EOF'
295import urllib.request, os, json
296data = json.dumps({'properties': {'email': 'john@example.com', 'firstname': 'John', 'lastname': 'Doe'}}).encode()
297req = urllib.request.Request('https://gateway.maton.ai/hubspot/crm/v3/objects/contacts', data=data, method='POST')
298req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
299req.add_header('Content-Type', 'application/json')
300print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
301EOF
302```
303
304### Google Sheets - Get Spreadsheet Values (Native API)
305
306```bash
307# Native Sheets API: GET https://sheets.googleapis.com/v4/spreadsheets/{id}/values/{range}
308python <<'EOF'
309import urllib.request, os, json
310req = urllib.request.Request('https://gateway.maton.ai/google-sheets/v4/spreadsheets/122BS1sFN2RKL8AOUQjkLdubzOwgqzPT64KfZ2rvYI4M/values/Sheet1!A1:B2')
311req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
312print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
313EOF
314```
315
316### Salesforce - SOQL Query (Native API)
317
318```bash
319# Native Salesforce API: GET https://{instance}.salesforce.com/services/data/v64.0/query?q=...
320python <<'EOF'
321import urllib.request, os, json
322req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v64.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10')
323req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
324print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
325EOF
326```
327
328### Airtable - List Tables (Native API)
329
330```bash
331# Native Airtable API: GET https://api.airtable.com/v0/meta/bases/{id}/tables
332python <<'EOF'
333import urllib.request, os, json
334req = urllib.request.Request('https://gateway.maton.ai/airtable/v0/meta/bases/appgqan2NzWGP5sBK/tables')
335req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
336print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
337EOF
338```
339
340### Notion - Query Database (Native API)
341
342```bash
343# Native Notion API: POST https://api.notion.com/v1/data_sources/{id}/query
344python <<'EOF'
345import urllib.request, os, json
346data = json.dumps({}).encode()
347req = urllib.request.Request('https://gateway.maton.ai/notion/v1/data_sources/23702dc5-9a3b-8001-9e1c-000b5af0a980/query', data=data, method='POST')
348req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
349req.add_header('Content-Type', 'application/json')
350req.add_header('Notion-Version', '2025-09-03')
351print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
352EOF
353```
354
355### Stripe - List Customers (Native API)
356
357```bash
358# Native Stripe API: GET https://api.stripe.com/v1/customers
359python <<'EOF'
360import urllib.request, os, json
361req = urllib.request.Request('https://gateway.maton.ai/stripe/v1/customers?limit=10')
362req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
363print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
364EOF
365```
366
367## Code Examples
368
369### JavaScript (Node.js)
370
371```javascript
372const response = await fetch('https://gateway.maton.ai/slack/api/chat.postMessage', {
373 method: 'POST',
374 headers: {
375 'Content-Type': 'application/json',
376 'Authorization': `Bearer ${process.env.MATON_API_KEY}`
377 },
378 body: JSON.stringify({ channel: 'C0123456', text: 'Hello!' })
379});
380```
381
382### Python
383
384```python
385import os
386import requests
387
388response = requests.post(
389 'https://gateway.maton.ai/slack/api/chat.postMessage',
390 headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
391 json={'channel': 'C0123456', 'text': 'Hello!'}
392)
393```
394
395## Error Handling
396
397| Status | Meaning |
398|--------|---------|
399| 400 | Missing connection for the requested app |
400| 401 | Invalid or missing Maton API key |
401| 429 | Rate limited (10 requests/second per account) |
402| 500 | Internal Server Error |
403| 4xx/5xx | Passthrough error from the target API |
404
405Errors from the target API are passed through with their original status codes and response bodies.
406
407### Troubleshooting: Invalid API Key
408
4091. Check that the `MATON_API_KEY` environment variable is set:
410
411```bash
412echo $MATON_API_KEY
413```
414
4152. Verify the API key is valid by listing connections:
416
417```bash
418python <<'EOF'
419import urllib.request, os, json
420req = urllib.request.Request('https://ctrl.maton.ai/connections')
421req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
422print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
423EOF
424```
425
426### Troubleshooting: 500 Internal Server Error
427
428A 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.
429
430## Rate Limits
431
432- 10 requests per second per account
433- Target API rate limits also apply
434
435## Notes
436
437- When using curl with URLs containing brackets (`fields[]`, `sort[]`, `records[]`), use the `-g` flag to disable glob parsing
438- When piping curl output to `jq`, environment variables may not expand correctly in some shells, which can cause "Invalid API key" errors
439
440## Tips
441
4421. **Use native API docs**: Refer to each service's official API documentation for endpoint paths and parameters.
443
4442. **Headers are forwarded**: Custom headers (except `Host` and `Authorization`) are forwarded to the target API.
445
4463. **Query params work**: URL query parameters are passed through to the target API.
447
4484. **All HTTP methods supported**: GET, POST, PUT, PATCH, DELETE are all supported.
449
4505. **QuickBooks special case**: Use `:realmId` in the path and it will be replaced with the connected realm ID.
451
452## Optional
453
454- [Github](https://github.com/maton-ai/api-gateway-skill)
455- [Documentation](https://www.maton.ai/docs/api-reference)
456- [Community](https://discord.com/invite/dBfFAcefs2)