Back to Skills
    🦞

    api-gateway

    API gateway for calling third-party APIs with managed auth.

    By @byungkyu
    View on GitHub
    SKILL.md
    ---
    name: api-gateway
    description: |
      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.
    compatibility: Requires network access and valid Maton API key
    metadata:
      author: maton
      version: "1.0"
    ---
    
    # 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
    
    ```bash
    # 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.
    
    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_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:
    
    ```bash
    export MATON_API_KEY="YOUR_API_KEY"
    ```
    
    ## Getting Your API Key
    
    1. Sign in or create an account at [maton.ai](https://maton.ai)
    2. Go to [maton.ai/settings](https://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
    
    ```bash
    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:**
    ```json
    {
      "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
    
    ```bash
    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
    
    ```bash
    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:**
    ```json
    {
      "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
    
    ```bash
    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:
    
    ```bash
    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` |
    | Basecamp | `basecamp` | `3.basecampapi.com` |
    | Calendly | `calendly` | `api.calendly.com` |
    | Chargebee | `chargebee` | `{subdomain}.chargebee.com` |
    | ClickUp | `clickup` | `api.clickup.com` |
    | Constant Contact | `constant-contact` | `api.cc.email` |
    | Eventbrite | `eventbrite` | `www.eventbriteapi.com` |
    | Fathom | `fathom` | `api.fathom.ai` |
    | GitHub | `github` | `api.github.com` |
    | Gumroad | `gumroad` | `api.gumroad.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 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` |
    | Jira | `jira` | `api.atlassian.com` |
    | Jobber | `jobber` | `api.getjobber.com` |
    | JotForm | `jotform` | `api.jotform.com` |
    | Keap | `keap` | `api.infusionsoft.com` |
    | Kit | `kit` | `api.kit.com` |
    | Klaviyo | `klaviyo` | `a.klaviyo.com` |
    | Linear | `linear` | `api.linear.app` |
    | LinkedIn | `linkedin` | `api.linkedin.com` |
    | Mailchimp | `mailchimp` | `{dc}.api.mailchimp.com` |
    | Microsoft Excel | `microsoft-excel` | `graph.microsoft.com` |
    | Microsoft To Do | `microsoft-to-do` | `graph.microsoft.com` |
    | Monday.com | `monday` | `api.monday.com` |
    | Notion | `notion` | `api.notion.com` |
    | OneDrive | `one-drive` | `graph.microsoft.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` |
    | Square | `squareup` | `connect.squareup.com` |
    | Stripe | `stripe` | `api.stripe.com` |
    | Telegram | `telegram` | `api.telegram.org` |
    | TickTick | `ticktick` | `api.ticktick.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/](references/) for detailed routing guides per provider:
    - [Acuity Scheduling](references/acuity-scheduling.md) - Appointments, calendars, clients, availability
    - [Airtable](references/airtable.md) - Records, bases, tables
    - [Apollo](references/apollo.md) - People search, enrichment, contacts
    - [Asana](references/asana.md) - Tasks, projects, workspaces, webhooks
    - [Attio](references/attio.md) - People, companies, records, tasks
    - [Basecamp](references/basecamp.md) - Projects, to-dos, messages, schedules, documents
    - [Calendly](references/calendly.md) - Event types, scheduled events, availability, webhooks
    - [Chargebee](references/chargebee.md) - Subscriptions, customers, invoices
    - [ClickUp](references/clickup.md) - Tasks, lists, folders, spaces, webhooks
    - [Constant Contact](references/constant-contact.md) - Contacts, email campaigns, lists, segments
    - [Eventbrite](references/eventbrite.md) - Events, venues, tickets, orders, attendees
    - [Fath
    
    ... (truncated)