Fresh start - excluded large ROM JSON files

This commit is contained in:
OpenClaw Agent
2026-04-11 09:45:12 -05:00
commit 5deb387aa6
395 changed files with 47744 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
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.

555
skills/api-gateway/SKILL.md Normal file
View File

@@ -0,0 +1,555 @@
---
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"
clawdbot:
emoji: 🧠
requires:
env:
- MATON_API_KEY
---
# 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 |
|---------|----------|------------------|
| 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` |
| Box | `box` | `api.box.com` |
| Brevo | `brevo` | `api.brevo.com` |
| Calendly | `calendly` | `api.calendly.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` |
| Cognito Forms | `cognito-forms` | `www.cognitoforms.com` |
| Constant Contact | `constant-contact` | `api.cc.email` |
| Dropbox | `dropbox` | `api.dropboxapi.com` |
| 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` |
| MailerLite | `mailerlite` | `connect.mailerlite.com` |
| ManyChat | `manychat` | `api.manychat.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` |
| Quo | `quo` | `api.openphone.com` |
| Salesforce | `salesforce` | `{instance}.salesforce.com` |
| SignNow | `signnow` | `api.signnow.com` |
| Slack | `slack` | `slack.com` |
| Square | `squareup` | `connect.squareup.com` |
| Stripe | `stripe` | `api.stripe.com` |
| Systeme.io | `systeme` | `api.systeme.io` |
| Tally | `tally` | `api.tally.so` |
| Telegram | `telegram` | `api.telegram.org` |
| TickTick | `ticktick` | `api.ticktick.com` |
| Todoist | `todoist` | `api.todoist.com` |
| Trello | `trello` | `api.trello.com` |
| Twilio | `twilio` | `api.twilio.com` |
| Typeform | `typeform` | `api.typeform.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 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:
- [ActiveCampaign](references/active-campaign.md) - Contacts, deals, tags, lists, automations, campaigns
- [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
- [Box](references/box.md) - Files, folders, collaborations, shared links
- [Brevo](references/brevo.md) - Contacts, email campaigns, transactional emails, templates
- [Calendly](references/calendly.md) - Event types, scheduled events, availability, webhooks
- [CallRail](references/callrail.md) - Calls, trackers, companies, tags, analytics
- [Chargebee](references/chargebee.md) - Subscriptions, customers, invoices
- [ClickFunnels](references/clickfunnels.md) - Contacts, products, orders, courses, webhooks
- [ClickSend](references/clicksend.md) - SMS, MMS, voice messages, contacts, lists
- [ClickUp](references/clickup.md) - Tasks, lists, folders, spaces, webhooks
- [Cognito Forms](references/cognito-forms.md) - Forms, entries, documents, files
- [Constant Contact](references/constant-contact.md) - Contacts, email campaigns, lists, segments
- [Dropbox](references/dropbox.md) - Files, folders, search, metadata, revisions, tags
- [Eventbrite](references/eventbrite.md) - Events, venues, tickets, orders, attendees
- [Fathom](references/fathom.md) - Meeting recordings, transcripts, summaries, webhooks
- [GitHub](references/github.md) - Repositories, issues, pull requests, commits
- [Gumroad](references/gumroad.md) - Products, sales, subscribers, licenses, webhooks
- [Google Ads](references/google-ads.md) - Campaigns, ad groups, GAQL queries
- [Google Analytics Admin](references/google-analytics-admin.md) - Reports, dimensions, metrics
- [Google Analytics Data](references/google-analytics-data.md) - Reports, dimensions, metrics
- [Google Calendar](references/google-calendar.md) - Events, calendars, free/busy
- [Google Contacts](references/google-contacts.md) - Contacts, contact groups, people search
- [Google Docs](references/google-docs.md) - Document creation, batch updates
- [Google Drive](references/google-drive.md) - Files, folders, permissions
- [Google Forms](references/google-forms.md) - Forms, questions, responses
- [Gmail](references/google-mail.md) - Messages, threads, labels
- [Google Meet](references/google-meet.md) - Spaces, conference records, participants
- [Google Merchant](references/google-merchant.md) - Products, inventories, promotions, reports
- [Google Play](references/google-play.md) - In-app products, subscriptions, reviews
- [Google Search Console](references/google-search-console.md) - Search analytics, sitemaps
- [Google Sheets](references/google-sheets.md) - Values, ranges, formatting
- [Google Slides](references/google-slides.md) - Presentations, slides, formatting
- [Google Tasks](references/google-tasks.md) - Task lists, tasks, subtasks
- [Google Workspace Admin](references/google-workspace-admin.md) - Users, groups, org units, domains, roles
- [HubSpot](references/hubspot.md) - Contacts, companies, deals
- [Jira](references/jira.md) - Issues, projects, JQL queries
- [Jobber](references/jobber.md) - Clients, jobs, invoices, quotes (GraphQL)
- [JotForm](references/jotform.md) - Forms, submissions, webhooks
- [Keap](references/keap.md) - Contacts, companies, tags, tasks, opportunities, campaigns
- [Kit](references/kit.md) - Subscribers, tags, forms, sequences, broadcasts
- [Klaviyo](references/klaviyo.md) - Profiles, lists, campaigns, flows, events
- [Linear](references/linear.md) - Issues, projects, teams, cycles (GraphQL)
- [LinkedIn](references/linkedin.md) - Profile, posts, shares, media uploads
- [Mailchimp](references/mailchimp.md) - Audiences, campaigns, templates, automations
- [MailerLite](references/mailerlite.md) - Subscribers, groups, campaigns, automations, forms
- [ManyChat](references/manychat.md) - Subscribers, tags, flows, messaging
- [Microsoft Excel](references/microsoft-excel.md) - Workbooks, worksheets, ranges, tables, charts
- [Microsoft To Do](references/microsoft-to-do.md) - Task lists, tasks, checklist items, linked resources
- [Monday.com](references/monday.md) - Boards, items, columns, groups (GraphQL)
- [Notion](references/notion.md) - Pages, databases, blocks
- [OneDrive](references/one-drive.md) - Files, folders, drives, sharing
- [Outlook](references/outlook.md) - Mail, calendar, contacts
- [Pipedrive](references/pipedrive.md) - Deals, persons, organizations, activities
- [QuickBooks](references/quickbooks.md) - Customers, invoices, reports
- [Quo](references/quo.md) - Calls, messages, contacts, conversations, webhooks
- [Salesforce](references/salesforce.md) - SOQL, sObjects, CRUD
- [SignNow](references/signnow.md) - Documents, templates, invites, e-signatures
- [Slack](references/slack.md) - Messages, channels, users
- [Square](references/squareup.md) - Payments, customers, orders, catalog, inventory, invoices
- [Stripe](references/stripe.md) - Customers, subscriptions, payments
- [Systeme.io](references/systeme.md) - Contacts, tags, courses, communities, webhooks
- [Tally](references/tally.md) - Forms, submissions, workspaces, webhooks
- [Telegram](references/telegram.md) - Messages, chats, bots, updates, polls
- [TickTick](references/ticktick.md) - Tasks, projects, task lists
- [Todoist](references/todoist.md) - Tasks, projects, sections, labels, comments
- [Trello](references/trello.md) - Boards, lists, cards, checklists
- [Twilio](references/twilio.md) - SMS, voice calls, phone numbers, messaging
- [Typeform](references/typeform.md) - Forms, responses, insights
- [Vimeo](references/vimeo.md) - Videos, folders, albums, comments, likes
- [WhatsApp Business](references/whatsapp-business.md) - Messages, templates, media
- [WooCommerce](references/woocommerce.md) - Products, orders, customers, coupons
- [WordPress.com](references/wordpress.md) - Posts, pages, sites, users, settings
- [Xero](references/xero.md) - Contacts, invoices, reports
- [YouTube](references/youtube.md) - Videos, playlists, channels, subscriptions
- [Zoho Bigin](references/zoho-bigin.md) - Contacts, companies, pipelines, products
- [Zoho Books](references/zoho-books.md) - Invoices, contacts, bills, expenses
- [Zoho Calendar](references/zoho-calendar.md) - Calendars, events, attendees, reminders
- [Zoho CRM](references/zoho-crm.md) - Leads, contacts, accounts, deals, search
- [Zoho Inventory](references/zoho-inventory.md) - Items, sales orders, invoices, purchase orders, bills
- [Zoho Mail](references/zoho-mail.md) - Messages, folders, labels, attachments
- [Zoho People](references/zoho-people.md) - Employees, departments, designations, attendance, leave
- [Zoho Recruit](references/zoho-recruit.md) - Candidates, job openings, interviews, applications
## Examples
### Slack - Post Message (Native API)
```bash
# 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)
```bash
# 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)
```bash
# 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)
```bash
# 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)
```bash
# 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)
```bash
# 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)
```bash
# 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)
```javascript
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
```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:
```bash
echo $MATON_API_KEY
```
2. Verify the API key is valid by listing connections:
```bash
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: 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:
```bash
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))
EOF
```
### Troubleshooting: 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
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
- [Github](https://github.com/maton-ai/api-gateway-skill)
- [API Reference](https://www.maton.ai/docs/api-reference)
- [Maton Community](https://discord.com/invite/dBfFAcefs2)
- [Maton Support](mailto:support@maton.ai)

View File

@@ -0,0 +1,6 @@
{
"ownerId": "kn75240wq8bnv2qm2xgry748jd80b9r0",
"slug": "api-gateway",
"version": "1.0.21",
"publishedAt": 1770755516421
}

View File

@@ -0,0 +1,220 @@
# 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
```bash
GET /active-campaign/api/3/contacts
```
#### Get Contact
```bash
GET /active-campaign/api/3/contacts/{contactId}
```
#### Create Contact
```bash
POST /active-campaign/api/3/contacts
Content-Type: application/json
{
"contact": {
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe"
}
}
```
#### Update Contact
```bash
PUT /active-campaign/api/3/contacts/{contactId}
```
#### Delete Contact
```bash
DELETE /active-campaign/api/3/contacts/{contactId}
```
### Tags
#### List Tags
```bash
GET /active-campaign/api/3/tags
```
#### Create Tag
```bash
POST /active-campaign/api/3/tags
Content-Type: application/json
{
"tag": {
"tag": "Tag Name",
"tagType": "contact"
}
}
```
### Contact Tags
#### Add Tag to Contact
```bash
POST /active-campaign/api/3/contactTags
Content-Type: application/json
{
"contactTag": {
"contact": "1",
"tag": "1"
}
}
```
#### Remove Tag from Contact
```bash
DELETE /active-campaign/api/3/contactTags/{contactTagId}
```
### Lists
#### List All Lists
```bash
GET /active-campaign/api/3/lists
```
#### Create List
```bash
POST /active-campaign/api/3/lists
```
### Deals
#### List Deals
```bash
GET /active-campaign/api/3/deals
```
#### Create Deal
```bash
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
```bash
GET /active-campaign/api/3/dealStages
```
#### List Pipelines (Deal Groups)
```bash
GET /active-campaign/api/3/dealGroups
```
### Automations
#### List Automations
```bash
GET /active-campaign/api/3/automations
```
### Campaigns
#### List Campaigns
```bash
GET /active-campaign/api/3/campaigns
```
### Users
#### List Users
```bash
GET /active-campaign/api/3/users
```
### Accounts
#### List Accounts
```bash
GET /active-campaign/api/3/accounts
```
### Custom Fields
#### List Fields
```bash
GET /active-campaign/api/3/fields
```
### Notes
#### List Notes
```bash
GET /active-campaign/api/3/notes
```
### Webhooks
#### List Webhooks
```bash
GET /active-campaign/api/3/webhooks
```
## Pagination
Uses offset-based pagination:
```bash
GET /active-campaign/api/3/contacts?limit=20&offset=0
```
**Parameters:**
- `limit` - Results per page (default: 20)
- `offset` - Starting index
Response includes meta with total:
```json
{
"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
- [ActiveCampaign API Overview](https://developers.activecampaign.com/reference/overview)
- [Developer Portal](https://developers.activecampaign.com/)
- [Contacts API](https://developers.activecampaign.com/reference/list-all-contacts)

View File

@@ -0,0 +1,154 @@
# 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
```bash
GET /acuity-scheduling/api/v1/me
```
### List Appointments
```bash
GET /acuity-scheduling/api/v1/appointments?max=100&minDate=2026-02-01
```
### Get Appointment
```bash
GET /acuity-scheduling/api/v1/appointments/{id}
```
### Create Appointment
```bash
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
```bash
PUT /acuity-scheduling/api/v1/appointments/{id}
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Smith"
}
```
### Cancel Appointment
```bash
PUT /acuity-scheduling/api/v1/appointments/{id}/cancel
```
### Reschedule Appointment
```bash
PUT /acuity-scheduling/api/v1/appointments/{id}/reschedule
Content-Type: application/json
{
"datetime": "2026-02-20T10:00"
}
```
### List Calendars
```bash
GET /acuity-scheduling/api/v1/calendars
```
### List Appointment Types
```bash
GET /acuity-scheduling/api/v1/appointment-types
```
### Get Available Dates
```bash
GET /acuity-scheduling/api/v1/availability/dates?month=2026-02&appointmentTypeID=123
```
### Get Available Times
```bash
GET /acuity-scheduling/api/v1/availability/times?date=2026-02-04&appointmentTypeID=123
```
### List Clients
```bash
GET /acuity-scheduling/api/v1/clients?search=John
```
### Create Client
```bash
POST /acuity-scheduling/api/v1/clients
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com"
}
```
### List Blocks
```bash
GET /acuity-scheduling/api/v1/blocks?calendarID=1234
```
### Create Block
```bash
POST /acuity-scheduling/api/v1/blocks
Content-Type: application/json
{
"start": "2026-02-15T12:00",
"end": "2026-02-15T13:00",
"calendarID": 1234
}
```
### Delete Block
```bash
DELETE /acuity-scheduling/api/v1/blocks/{id}
```
### List Forms
```bash
GET /acuity-scheduling/api/v1/forms
```
### List Labels
```bash
GET /acuity-scheduling/api/v1/labels
```
## Notes
- Datetime values must be parseable by PHP's `strtotime()` function
- Timezones use IANA format (e.g., "America/New_York")
- Use `max` parameter to limit results (default: 100)
- Use `minDate` and `maxDate` for 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
- [Acuity Scheduling API Quick Start](https://developers.acuityscheduling.com/reference/quick-start)
- [Appointments API](https://developers.acuityscheduling.com/reference/get-appointments)
- [Availability API](https://developers.acuityscheduling.com/reference/get-availability-dates)
- [OAuth2 Documentation](https://developers.acuityscheduling.com/docs/oauth2)

View File

@@ -0,0 +1,149 @@
# Airtable Routing Reference
**App name:** `airtable`
**Base URL proxied:** `api.airtable.com`
## API Path Pattern
```
/airtable/v0/{baseId}/{tableIdOrName}
```
## Common Endpoints
### List Records
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?maxRecords=100
```
With view:
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?view=Grid%20view&maxRecords=100
```
With filter formula:
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?filterByFormula={Status}='Active'
```
With field selection:
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?fields[]=Name&fields[]=Status&fields[]=Email
```
With sorting:
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?sort[0][field]=Created&sort[0][direction]=desc
```
### Get Record
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}/{recordId}
```
### Create Records
```bash
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)
```bash
PATCH /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Status": "Completed"
}
}
]
}
```
### Update Records (PUT - full replace)
```bash
PUT /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Name": "Updated Name",
"Status": "Active"
}
}
]
}
```
### Delete Records
```bash
DELETE /airtable/v0/{baseId}/{tableIdOrName}?records[]=recXXXXX&records[]=recYYYYY
```
### List Bases
```bash
GET /airtable/v0/meta/bases
```
### Get Base Schema
```bash
GET /airtable/v0/meta/bases/{baseId}/tables
```
## Pagination
**Parameters:**
- `pageSize` - Number of records per request (max 100, default 100)
- `maxRecords` - Maximum total records across all pages
- `offset` - Cursor for next page (returned in response)
Response includes `offset` when more records exist:
```json
{
"records": [...],
"offset": "itrXXXXXXXXXXX"
}
```
Use offset for next page:
```bash
GET /airtable/v0/{baseId}/{tableIdOrName}?pageSize=50&offset=itrXXXXXXXXXXX
```
## Notes
- 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
- [API Overview](https://airtable.com/developers/web/api/introduction)
- [List Records](https://airtable.com/developers/web/api/list-records)
- [Create Records](https://airtable.com/developers/web/api/create-records)
- [Update Records](https://airtable.com/developers/web/api/update-record)
- [Delete Records](https://airtable.com/developers/web/api/delete-record)
- [Formula Reference](https://support.airtable.com/docs/formula-field-reference)

View File

@@ -0,0 +1,213 @@
# Apollo Routing Reference
**App name:** `apollo`
**Base URL proxied:** `api.apollo.io`
## API Path Pattern
```
/apollo/v1/{endpoint}
```
## Common Endpoints
### People
#### Search People
```bash
POST /apollo/v1/mixed_people/api_search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}
```
#### Get Person
```bash
GET /apollo/v1/people/{personId}
```
#### Enrich Person
```bash
POST /apollo/v1/people/match
Content-Type: application/json
{
"email": "john@example.com"
}
```
Or by LinkedIn:
```bash
POST /apollo/v1/people/match
Content-Type: application/json
{
"linkedin_url": "https://linkedin.com/in/johndoe"
}
```
### Organizations
#### Search Organizations
```bash
POST /apollo/v1/organizations/search
Content-Type: application/json
{
"q_organization_name": "Google",
"page": 1,
"per_page": 25
}
```
#### Enrich Organization
```bash
POST /apollo/v1/organizations/enrich
Content-Type: application/json
{
"domain": "google.com"
}
```
### Contacts
#### Search Contacts
```bash
POST /apollo/v1/contacts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
```
#### Create Contact
```bash
POST /apollo/v1/contacts
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"organization_name": "Acme Corp"
}
```
#### Update Contact
```bash
PUT /apollo/v1/contacts/{contactId}
Content-Type: application/json
{
"first_name": "Jane"
}
```
### Accounts
#### Search Accounts
```bash
POST /apollo/v1/accounts/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
```
#### Create Account
```bash
POST /apollo/v1/accounts
Content-Type: application/json
{
"name": "Acme Corp",
"domain": "acme.com"
}
```
### Sequences
#### Search Sequences
```bash
POST /apollo/v1/emailer_campaigns/search
Content-Type: application/json
{
"page": 1,
"per_page": 25
}
```
#### Add Contact to Sequence
```bash
POST /apollo/v1/emailer_campaigns/{campaignId}/add_contact_ids
Content-Type: application/json
{
"contact_ids": ["contact_id_1", "contact_id_2"]
}
```
### Email
#### Search Email Messages
```bash
POST /apollo/v1/emailer_messages/search
Content-Type: application/json
{
"contact_id": "{contactId}"
}
```
### Labels
#### List Labels
```bash
GET /apollo/v1/labels
```
## Search Filters
Common search parameters:
- `q_organization_name` - Company name
- `q_person_title` - Job title
- `person_locations` - Array of locations
- `organization_num_employees_ranges` - Employee count ranges
- `q_keywords` - General keyword search
## Notes
- Authentication is automatic - the router injects the API key
- Pagination uses `page` and `per_page` parameters in POST body
- Most list endpoints use POST with `/search` suffix (not GET)
- Email enrichment consumes credits
- Rate limits apply per endpoint
- `people/search` and `mixed_people/search` are deprecated - use `mixed_people/api_search` instead
## Resources
- [API Overview](https://docs.apollo.io/reference/introduction)
- [Search People](https://docs.apollo.io/reference/people-api-search.md)
- [Enrich Person](https://docs.apollo.io/reference/people-enrichment.md)
- [Search Organizations](https://docs.apollo.io/reference/organization-search.md)
- [Enrich Organization](https://docs.apollo.io/reference/organization-enrichment.md)
- [Search Contacts](https://docs.apollo.io/reference/search-for-contacts.md)
- [Create Contact](https://docs.apollo.io/reference/create-a-contact.md)
- [Update Contact](https://docs.apollo.io/reference/update-a-contact.md)
- [Search Accounts](https://docs.apollo.io/reference/search-for-accounts.md)
- [Create Account](https://docs.apollo.io/reference/create-an-account.md)
- [Search Sequences](https://docs.apollo.io/reference/search-for-sequences.md)
- [Add Contacts to Sequence](https://docs.apollo.io/reference/add-contacts-to-sequence.md)
- [Search Email Messages](https://docs.apollo.io/reference/search-for-outreach-emails.md)
- [List Labels](https://docs.apollo.io/reference/get-a-list-of-all-lists.md)
- [LLM Reference](https://docs.apollo.io/llms.txt)

View File

@@ -0,0 +1,154 @@
# 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
```bash
GET /asana/api/1.0/users/me
```
### List Workspaces
```bash
GET /asana/api/1.0/workspaces
```
### List Tasks
```bash
GET /asana/api/1.0/tasks?project=PROJECT_GID&opt_fields=name,completed,due_on
```
### Get a Task
```bash
GET /asana/api/1.0/tasks/{task_gid}
```
### Create a Task
```bash
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
```bash
PUT /asana/api/1.0/tasks/{task_gid}
Content-Type: application/json
{
"data": {
"completed": true
}
}
```
### Delete a Task
```bash
DELETE /asana/api/1.0/tasks/{task_gid}
```
### Get Subtasks
```bash
GET /asana/api/1.0/tasks/{task_gid}/subtasks
```
### Create Subtask
```bash
POST /asana/api/1.0/tasks/{task_gid}/subtasks
Content-Type: application/json
{
"data": {
"name": "Subtask name"
}
}
```
### List Projects
```bash
GET /asana/api/1.0/projects?workspace=WORKSPACE_GID&opt_fields=name,owner,due_date
```
### Get a Project
```bash
GET /asana/api/1.0/projects/{project_gid}
```
### Create a Project
```bash
POST /asana/api/1.0/projects
Content-Type: application/json
{
"data": {
"name": "New Project",
"workspace": "WORKSPACE_GID"
}
}
```
### List Users in Workspace
```bash
GET /asana/api/1.0/workspaces/{workspace_gid}/users?opt_fields=name,email
```
### Create Webhook
```bash
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
```bash
DELETE /asana/api/1.0/webhooks/{webhook_gid}
```
## Notes
- Resource IDs (GIDs) are strings
- Timestamps are in ISO 8601 format
- Use `opt_fields` to specify which fields to return in responses
- Workspaces are the highest-level organizational unit
- Use cursor-based pagination with `offset` parameter
- Webhook creation requires the target URL to respond with 200 status
## Resources
- [Asana API Overview](https://developers.asana.com)
- [API Reference](https://developers.asana.com/reference)
- [Tasks](https://developers.asana.com/reference/tasks)
- [Projects](https://developers.asana.com/reference/projects)
- [Workspaces](https://developers.asana.com/reference/workspaces)
- [Webhooks](https://developers.asana.com/reference/webhooks)
- [LLM Reference](https://developers.asana.com/llms.txt)

View File

@@ -0,0 +1,122 @@
# Attio Routing Reference
**App name:** `attio`
**Base URL proxied:** `api.attio.com`
## API Path Pattern
```
/attio/v2/{resource}
```
## Common Endpoints
### List Objects
```bash
GET /attio/v2/objects
```
### Get Object
```bash
GET /attio/v2/objects/{object}
```
### List Attributes
```bash
GET /attio/v2/objects/{object}/attributes
```
### Query Records
```bash
POST /attio/v2/objects/{object}/records/query
Content-Type: application/json
{
"limit": 50,
"offset": 0
}
```
### Get Record
```bash
GET /attio/v2/objects/{object}/records/{record_id}
```
### Create Record
```bash
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
```bash
PATCH /attio/v2/objects/{object}/records/{record_id}
Content-Type: application/json
{
"data": {
"values": {
"job_title": "Engineer"
}
}
}
```
### Delete Record
```bash
DELETE /attio/v2/objects/{object}/records/{record_id}
```
### List Tasks
```bash
GET /attio/v2/tasks?limit=50
```
### Create Task
```bash
POST /attio/v2/tasks
Content-Type: application/json
{
"data": {
"content": "Task description",
"format": "plaintext",
"assignees": [],
"linked_records": []
}
}
```
### List Workspace Members
```bash
GET /attio/v2/workspace_members
```
### Identify Self
```bash
GET /attio/v2/self
```
## Notes
- Object slugs are lowercase snake_case (e.g., `people`, `companies`)
- Record IDs are UUIDs
- For personal-name attributes, include `full_name` when creating records
- Task creation requires `format` and `assignees` fields
- Rate limits: 100 read/sec, 25 write/sec
- Pagination uses `limit` and `offset` parameters
## Resources
- [Attio API Overview](https://docs.attio.com/rest-api/overview)
- [Attio API Reference](https://docs.attio.com/rest-api/endpoint-reference)
- [Records API](https://docs.attio.com/rest-api/endpoint-reference/records)

View File

@@ -0,0 +1,148 @@
# 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}.json
```
All paths must end with `.json`.
## Common Endpoints
### Get Current User
```bash
GET /basecamp/my/profile.json
```
### List People
```bash
GET /basecamp/people.json
```
### List Projects
```bash
GET /basecamp/projects.json
```
### Get Project
```bash
GET /basecamp/projects/{project_id}.json
```
Returns project with `dock` array containing tool IDs.
### Create Project
```bash
POST /basecamp/projects.json
Content-Type: application/json
{
"name": "Project Name",
"description": "Description"
}
```
### Get Todoset
```bash
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}.json
```
### List Todolists
```bash
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
```
### List Todos
```bash
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
```
### Create Todo
```bash
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
```bash
POST /basecamp/buckets/{project_id}/todos/{todo_id}/completion.json
```
### Get Message Board
```bash
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}.json
```
### List Messages
```bash
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.json
```
### Get Schedule
```bash
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}.json
```
### List Schedule Entries
```bash
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.json
```
### Get Vault (Documents)
```bash
GET /basecamp/buckets/{project_id}/vaults/{vault_id}.json
```
### List Documents
```bash
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.json
```
### List Campfires
```bash
GET /basecamp/chats.json
```
### Trash Recording
```bash
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/trashed.json
```
## Key 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: 150
```
## Notes
- 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: true` in dock before using tools
## Resources
- [Basecamp 4 API Documentation](https://github.com/basecamp/bc3-api)
- [API Endpoints](https://github.com/basecamp/bc3-api#endpoints)

View File

@@ -0,0 +1,191 @@
# Box Routing Reference
**App name:** `box`
**Base URL proxied:** `api.box.com`
## API Path Pattern
```
/box/2.0/{resource}
```
## Common Endpoints
### Get Current User
```bash
GET /box/2.0/users/me
```
### Get User
```bash
GET /box/2.0/users/{user_id}
```
### Get Folder
```bash
GET /box/2.0/folders/{folder_id}
```
Root folder ID is `0`.
### List Folder Items
```bash
GET /box/2.0/folders/{folder_id}/items
GET /box/2.0/folders/{folder_id}/items?limit=100&offset=0
```
### Create Folder
```bash
POST /box/2.0/folders
Content-Type: application/json
{
"name": "New Folder",
"parent": {"id": "0"}
}
```
### Update Folder
```bash
PUT /box/2.0/folders/{folder_id}
Content-Type: application/json
{
"name": "Updated Name",
"description": "Description"
}
```
### Copy Folder
```bash
POST /box/2.0/folders/{folder_id}/copy
Content-Type: application/json
{
"name": "Copied Folder",
"parent": {"id": "0"}
}
```
### Delete Folder
```bash
DELETE /box/2.0/folders/{folder_id}
DELETE /box/2.0/folders/{folder_id}?recursive=true
```
### Get File
```bash
GET /box/2.0/files/{file_id}
```
### Download File
```bash
GET /box/2.0/files/{file_id}/content
```
### Update File
```bash
PUT /box/2.0/files/{file_id}
```
### Copy File
```bash
POST /box/2.0/files/{file_id}/copy
```
### Delete File
```bash
DELETE /box/2.0/files/{file_id}
```
### Create Shared Link
```bash
PUT /box/2.0/folders/{folder_id}
Content-Type: application/json
{
"shared_link": {"access": "open"}
}
```
### List Collaborations
```bash
GET /box/2.0/folders/{folder_id}/collaborations
```
### Create Collaboration
```bash
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
```bash
GET /box/2.0/search?query=keyword
```
### Events
```bash
GET /box/2.0/events
```
### Trash
```bash
GET /box/2.0/folders/trash/items
DELETE /box/2.0/files/{file_id}/trash
DELETE /box/2.0/folders/{folder_id}/trash
```
### Collections
```bash
GET /box/2.0/collections
GET /box/2.0/collections/{collection_id}/items
```
### Recent Items
```bash
GET /box/2.0/recent_items
```
### Webhooks
```bash
GET /box/2.0/webhooks
POST /box/2.0/webhooks
DELETE /box/2.0/webhooks/{webhook_id}
```
## Pagination
Offset-based pagination:
```bash
GET /box/2.0/folders/0/items?limit=100&offset=0
```
Response:
```json
{
"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 `fields` parameter to select specific fields
## Resources
- [Box API Reference](https://developer.box.com/reference)
- [Box Developer Documentation](https://developer.box.com/guides)

View File

@@ -0,0 +1,229 @@
# Brevo Routing Reference
**App name:** `brevo`
**Base URL proxied:** `api.brevo.com`
## API Path Pattern
```
/brevo/v3/{resource}
```
## Common Endpoints
### Account
```bash
GET /brevo/v3/account
```
### Contacts
#### List Contacts
```bash
GET /brevo/v3/contacts?limit=50&offset=0
```
#### Get Contact
```bash
GET /brevo/v3/contacts/{identifier}
```
#### Create Contact
```bash
POST /brevo/v3/contacts
Content-Type: application/json
{
"email": "contact@example.com",
"attributes": {"FIRSTNAME": "John", "LASTNAME": "Doe"},
"listIds": [2]
}
```
#### Update Contact
```bash
PUT /brevo/v3/contacts/{identifier}
Content-Type: application/json
{
"attributes": {"FIRSTNAME": "Updated"}
}
```
#### Delete Contact
```bash
DELETE /brevo/v3/contacts/{identifier}
```
### Lists
#### List All Lists
```bash
GET /brevo/v3/contacts/lists
```
#### Create List
```bash
POST /brevo/v3/contacts/lists
Content-Type: application/json
{
"name": "New List",
"folderId": 1
}
```
#### Add Contacts to List
```bash
POST /brevo/v3/contacts/lists/{listId}/contacts/add
Content-Type: application/json
{
"emails": ["contact@example.com"]
}
```
### Folders
#### List Folders
```bash
GET /brevo/v3/contacts/folders
```
#### Create Folder
```bash
POST /brevo/v3/contacts/folders
Content-Type: application/json
{
"name": "New Folder"
}
```
### Transactional Emails
#### Send Email
```bash
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
```bash
GET /brevo/v3/smtp/statistics/events?limit=50
```
### Email Templates
#### List Templates
```bash
GET /brevo/v3/smtp/templates
```
#### Create Template
```bash
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
```bash
GET /brevo/v3/emailCampaigns
```
#### Create Campaign
```bash
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
```bash
POST /brevo/v3/emailCampaigns/{campaignId}/sendNow
```
### Senders
#### List Senders
```bash
GET /brevo/v3/senders
```
#### Create Sender
```bash
POST /brevo/v3/senders
Content-Type: application/json
{
"name": "Marketing",
"email": "marketing@company.com"
}
```
### Attributes
#### List Attributes
```bash
GET /brevo/v3/contacts/attributes
```
## Pagination
Brevo uses offset-based pagination:
```bash
GET /brevo/v3/contacts?limit=50&offset=0
```
**Parameters:**
- `limit` - Results per page (max varies by endpoint, typically 500)
- `offset` - Starting index (0-based)
Response includes count:
```json
{
"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
- [Brevo API Overview](https://developers.brevo.com/)
- [API Key Concepts](https://developers.brevo.com/docs/how-it-works)
- [Manage Contacts](https://developers.brevo.com/docs/synchronise-contact-lists)
- [Send Transactional Email](https://developers.brevo.com/docs/send-a-transactional-email)

View File

@@ -0,0 +1,108 @@
# Calendly Routing Reference
**App name:** `calendly`
**Base URL proxied:** `api.calendly.com`
## API Path Pattern
```
/calendly/{resource}
```
## Common Endpoints
### Get Current User
```bash
GET /calendly/users/me
```
### List Event Types
```bash
GET /calendly/event_types?user=USER_URI&active=true
```
### Get an Event Type
```bash
GET /calendly/event_types/{uuid}
```
### List Scheduled Events
```bash
GET /calendly/scheduled_events?user=USER_URI&status=active&min_start_time=2025-03-01T00:00:00Z
```
### Get a Scheduled Event
```bash
GET /calendly/scheduled_events/{uuid}
```
### Cancel a Scheduled Event
```bash
POST /calendly/scheduled_events/{uuid}/cancellation
Content-Type: application/json
{
"reason": "Meeting rescheduled"
}
```
### List Event Invitees
```bash
GET /calendly/scheduled_events/{event_uuid}/invitees
```
### Get Available Times
```bash
GET /calendly/event_type_available_times?event_type=EVENT_TYPE_URI&start_time=2025-03-15T00:00:00Z&end_time=2025-03-22T00:00:00Z
```
### Get User Busy Times
```bash
GET /calendly/user_busy_times?user=USER_URI&start_time=2025-03-15T00:00:00Z&end_time=2025-03-22T00:00:00Z
```
### List Organization Memberships
```bash
GET /calendly/organization_memberships?organization=ORGANIZATION_URI
```
### List Webhook Subscriptions
```bash
GET /calendly/webhook_subscriptions?organization=ORGANIZATION_URI&scope=organization
```
### Create Webhook Subscription
```bash
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
```bash
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_token` for pagination
## Resources
- [Calendly Developer Portal](https://developer.calendly.com/)
- [API Reference](https://developer.calendly.com/api-docs)
- [Event Types](https://developer.calendly.com/api-docs/e2f95ebd44914-list-user-s-event-types)
- [Scheduled Events](https://developer.calendly.com/api-docs/d61a40b4ea90e-list-events)
- [Availability](https://developer.calendly.com/api-docs/4241cf0f7f0d4-get-event-type-available-times)
- [Webhooks](https://developer.calendly.com/api-docs/c1ddc06ce1f1a-create-webhook-subscription)

View File

@@ -0,0 +1,178 @@
# CallRail Routing Reference
**App name:** `callrail`
**Base URL proxied:** `api.callrail.com`
## API Path Pattern
```
/callrail/v3/a/{account_id}/{resource}.json
```
**Important:** All CallRail API endpoints end with `.json`. Account IDs start with `ACC`.
## Common Endpoints
### Accounts
#### List Accounts
```bash
GET /callrail/v3/a.json
```
#### Get Account
```bash
GET /callrail/v3/a/{account_id}.json
```
### Companies
#### List Companies
```bash
GET /callrail/v3/a/{account_id}/companies.json
```
#### Get Company
```bash
GET /callrail/v3/a/{account_id}/companies/{company_id}.json
```
### Calls
#### List Calls
```bash
GET /callrail/v3/a/{account_id}/calls.json
```
Query parameters: `page`, `per_page`, `date_range`, `start_date`, `end_date`, `company_id`, `tracker_id`, `search`, `fields`, `sort`, `order`
#### Get Call
```bash
GET /callrail/v3/a/{account_id}/calls/{call_id}.json
```
#### Update Call
```bash
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
```bash
GET /callrail/v3/a/{account_id}/calls/summary.json
```
#### Call Timeseries
```bash
GET /callrail/v3/a/{account_id}/calls/timeseries.json
```
### Trackers
#### List Trackers
```bash
GET /callrail/v3/a/{account_id}/trackers.json
```
#### Get Tracker
```bash
GET /callrail/v3/a/{account_id}/trackers/{tracker_id}.json
```
### Tags
#### List Tags
```bash
GET /callrail/v3/a/{account_id}/tags.json
```
#### Create Tag
```bash
POST /callrail/v3/a/{account_id}/tags.json
Content-Type: application/json
{
"name": "New Tag",
"tag_level": "account",
"color": "blue1"
}
```
#### Update Tag
```bash
PUT /callrail/v3/a/{account_id}/tags/{tag_id}.json
Content-Type: application/json
{
"name": "Updated Name",
"color": "green1"
}
```
#### Delete Tag
```bash
DELETE /callrail/v3/a/{account_id}/tags/{tag_id}.json
```
### Users
#### List Users
```bash
GET /callrail/v3/a/{account_id}/users.json
```
#### Get User
```bash
GET /callrail/v3/a/{account_id}/users/{user_id}.json
```
### Integrations
#### List Integrations
```bash
GET /callrail/v3/a/{account_id}/integrations.json?company_id={company_id}
```
### Notifications
#### List Notifications
```bash
GET /callrail/v3/a/{account_id}/notifications.json
```
## ID 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:
```bash
GET /callrail/v3/a/{account_id}/calls.json?page=2&per_page=50
# Response includes page, per_page, total_pages, total_records
```
For 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
- [CallRail API Documentation](https://apidocs.callrail.com/)
- [CallRail Help Center - API](https://support.callrail.com/hc/en-us/sections/4426797289229-API)

View File

@@ -0,0 +1,203 @@
# 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
```bash
GET /chargebee/api/v2/customers?limit=10
```
#### Get Customer
```bash
GET /chargebee/api/v2/customers/{customerId}
```
#### Create Customer
```bash
POST /chargebee/api/v2/customers
Content-Type: application/x-www-form-urlencoded
first_name=John&last_name=Doe&email=john@example.com
```
#### Update Customer
```bash
POST /chargebee/api/v2/customers/{customerId}
Content-Type: application/x-www-form-urlencoded
first_name=Jane
```
### Subscriptions
#### List Subscriptions
```bash
GET /chargebee/api/v2/subscriptions?limit=10
```
#### Get Subscription
```bash
GET /chargebee/api/v2/subscriptions/{subscriptionId}
```
#### Create Subscription
```bash
POST /chargebee/api/v2/subscriptions
Content-Type: application/x-www-form-urlencoded
plan_id=basic-plan&customer[email]=john@example.com&customer[first_name]=John
```
#### Cancel Subscription
```bash
POST /chargebee/api/v2/subscriptions/{subscriptionId}/cancel
Content-Type: application/x-www-form-urlencoded
end_of_term=true
```
### Item Prices (Product Catalog 2.0)
#### List Item Prices
```bash
GET /chargebee/api/v2/item_prices?limit=10
```
#### Get Item Price
```bash
GET /chargebee/api/v2/item_prices/{itemPriceId}
```
### Items (Product Catalog 2.0)
#### List Items
```bash
GET /chargebee/api/v2/items?limit=10
```
#### Get Item
```bash
GET /chargebee/api/v2/items/{itemId}
```
### Plans (Product Catalog 1.0 - Legacy)
#### List Plans
```bash
GET /chargebee/api/v2/plans?limit=10
```
#### Get Plan
```bash
GET /chargebee/api/v2/plans/{planId}
```
### Invoices
#### List Invoices
```bash
GET /chargebee/api/v2/invoices?limit=10
```
#### Get Invoice
```bash
GET /chargebee/api/v2/invoices/{invoiceId}
```
#### Download Invoice PDF
```bash
POST /chargebee/api/v2/invoices/{invoiceId}/pdf
```
### Transactions
#### List Transactions
```bash
GET /chargebee/api/v2/transactions?limit=10
```
### Hosted Pages
#### Checkout New Subscription
```bash
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.com
```
#### Manage Payment Sources
```bash
POST /chargebee/api/v2/hosted_pages/manage_payment_sources
Content-Type: application/x-www-form-urlencoded
customer[id]=cust_123
```
### Portal Sessions
#### Create Portal Session
```bash
POST /chargebee/api/v2/portal_sessions
Content-Type: application/x-www-form-urlencoded
customer[id]=cust_123
```
## Filtering
Use filter parameters:
```bash
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]=1704067200
```
## Notes
- 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_offset` for pagination
- Status values: `active`, `cancelled`, `non_renewing`, etc.
- **Product Catalog versions**: Use `item_prices` and `items` for PC 2.0, or `plans` and `addons` for PC 1.0
## Resources
- [Getting Started](https://apidocs.chargebee.com/docs/api)
- [List Customers](https://apidocs.chargebee.com/docs/api/customers/list-customers.md)
- [Retrieve a Customer](https://apidocs.chargebee.com/docs/api/customers/retrieve-a-customer.md)
- [Create a Customer](https://apidocs.chargebee.com/docs/api/customers/create-a-customer.md)
- [Update a Customer](https://apidocs.chargebee.com/docs/api/customers/update-a-customer.md)
- [List Subscriptions](https://apidocs.chargebee.com/docs/api/subscriptions/list-subscriptions.md)
- [Retrieve a Subscription](https://apidocs.chargebee.com/docs/api/subscriptions/retrieve-a-subscription.md)
- [Create a Subscription](https://apidocs.chargebee.com/docs/api/subscriptions/create-subscription-for-items.md)
- [Cancel a Subscription](https://apidocs.chargebee.com/docs/api/subscriptions/cancel-subscription-for-items.md)
- [List Items](https://apidocs.chargebee.com/docs/api/items/list-items.md)
- [Retrieve an Item](https://apidocs.chargebee.com/docs/api/items/retrieve-an-item.md)
- [List Item Prices](https://apidocs.chargebee.com/docs/api/item_prices/list-item-prices.md)
- [Retrieve an Item Price](https://apidocs.chargebee.com/docs/api/item_prices/retrieve-an-item-price.md)
- [List Plans](https://apidocs.chargebee.com/docs/api/v2/pcv-1/plans/list-plans.md)
- [Retrieve a Plan](https://apidocs.chargebee.com/docs/api/v2/pcv-1/plans/retrieve-a-plan.md)
- [List Invoices](https://apidocs.chargebee.com/docs/api/invoices/list-invoices.md)
- [Retrieve an Invoice](https://apidocs.chargebee.com/docs/api/invoices/retrieve-an-invoice.md)
- [Download Invoice as PDF](https://apidocs.chargebee.com/docs/api/invoices/download-e-invoice.md)
- [List Transactions](https://apidocs.chargebee.com/docs/api/transactions/list-transactions.md)
- [Checkout New Subscription](https://apidocs.chargebee.com/docs/api/hosted_pages/create-checkout-for-a-new-subscription.md)
- [Manage Payment Sources](https://apidocs.chargebee.com/docs/api/hosted_pages/manage-payment-sources.md)
- [Create a Portal Session](https://apidocs.chargebee.com/docs/api/portal_sessions/create-a-portal-session.md)

View File

@@ -0,0 +1,274 @@
# 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.0
```
## Common Endpoints
### Teams
#### List Teams
```bash
GET /clickfunnels/api/v2/teams
```
#### Get Team
```bash
GET /clickfunnels/api/v2/teams/{team_id}
```
### Workspaces
#### List Workspaces
```bash
GET /clickfunnels/api/v2/teams/{team_id}/workspaces
```
#### Get Workspace
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}
```
### Contacts
#### List Contacts
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
```
#### Get Contact
```bash
GET /clickfunnels/api/v2/contacts/{contact_id}
```
#### Create Contact
```bash
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
```bash
PUT /clickfunnels/api/v2/contacts/{contact_id}
Content-Type: application/json
{
"contact": {
"first_name": "Updated"
}
}
```
#### Delete Contact
```bash
DELETE /clickfunnels/api/v2/contacts/{contact_id}
```
#### Upsert Contact
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/upsert
```
### Products
#### List Products
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/products
```
#### Get Product
```bash
GET /clickfunnels/api/v2/products/{product_id}
```
#### Create Product
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/products
Content-Type: application/json
{
"product": {
"name": "New Product",
"visible_in_store": true
}
}
```
#### Archive/Unarchive Product
```bash
POST /clickfunnels/api/v2/products/{product_id}/archive
POST /clickfunnels/api/v2/products/{product_id}/unarchive
```
### Orders
#### List Orders
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/orders
```
#### Get Order
```bash
GET /clickfunnels/api/v2/orders/{order_id}
```
### Fulfillments
#### List Fulfillments
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
```
#### Create Fulfillment
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
```
#### Cancel Fulfillment
```bash
POST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancel
```
### Courses & Enrollments
#### List Courses
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/courses
```
#### List Enrollments
```bash
GET /clickfunnels/api/v2/courses/{course_id}/enrollments
```
#### Create Enrollment
```bash
POST /clickfunnels/api/v2/courses/{course_id}/enrollments
```
### Forms & Submissions
#### List Forms
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/forms
```
#### List Submissions
```bash
GET /clickfunnels/api/v2/forms/{form_id}/submissions
```
### Webhooks
#### List Webhook Endpoints
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
```
#### Create Webhook Endpoint
```bash
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
```bash
DELETE /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
```
### Images
#### List Images
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/images
```
#### Upload Image via URL
```bash
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:
```bash
# 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=1087091674
```
Response headers:
- `Pagination-Next`: ID of last item
- `Link`: Full URL for next page
## Filtering
```bash
# 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]=123
```
## Notes
- Subdomain is automatically determined from your OAuth connection
- IDs are integers; each resource also has a `public_id` string
- 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 `after` parameter for pagination
## Resources
- [ClickFunnels API Introduction](https://developers.myclickfunnels.com/docs/intro)
- [ClickFunnels API Reference](https://developers.myclickfunnels.com/reference)
- [Pagination Guide](https://developers.myclickfunnels.com/docs/pagination)
- [Filtering Guide](https://developers.myclickfunnels.com/docs/filtering)

View File

@@ -0,0 +1,152 @@
# ClickSend Routing Reference
**App name:** `clicksend`
**Base URL proxied:** `rest.clicksend.com`
## API Path Pattern
```
/clicksend/v3/{resource}
```
## Common Endpoints
### Account
#### Get Account
```bash
GET /clicksend/v3/account
```
### SMS
#### Send SMS
```bash
POST /clicksend/v3/sms/send
Content-Type: application/json
{
"messages": [
{
"to": "+15551234567",
"body": "Hello!",
"source": "api"
}
]
}
```
#### SMS History
```bash
GET /clicksend/v3/sms/history
```
#### SMS Templates
```bash
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
```bash
POST /clicksend/v3/mms/send
```
#### MMS History
```bash
GET /clicksend/v3/mms/history
```
### Voice
#### Send Voice
```bash
POST /clicksend/v3/voice/send
```
#### Voice Languages
```bash
GET /clicksend/v3/voice/lang
```
### Contact Lists
#### List All Lists
```bash
GET /clicksend/v3/lists
```
#### CRUD Operations
```bash
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
```bash
GET /clicksend/v3/lists/{list_id}/contacts
```
#### CRUD Operations
```bash
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
```bash
GET /clicksend/v3/email/addresses
POST /clicksend/v3/email/addresses
DELETE /clicksend/v3/email/addresses/{email_address_id}
```
### Utility
```bash
GET /clicksend/v3/countries
```
## Response Format
All responses follow this structure:
```json
{
"http_code": 200,
"response_code": "SUCCESS",
"response_msg": "Description",
"data": { ... }
}
```
## Pagination
Uses page-based pagination:
```bash
GET /clicksend/v3/lists?page=2&limit=50
# Response includes total, per_page, current_page, last_page
```
## Notes
- Phone numbers must be E.164 format
- Timestamps are Unix timestamps
- Voice access requires account permissions
- SMS over 160 chars split into segments
## Resources
- [ClickSend Developer Portal](https://developers.clicksend.com/)
- [ClickSend REST API v3](https://developers.clicksend.com/docs)

View File

@@ -0,0 +1,155 @@
# 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
```bash
GET /clickup/api/v2/user
```
### Get Workspaces (Teams)
```bash
GET /clickup/api/v2/team
```
### Get Spaces
```bash
GET /clickup/api/v2/team/{team_id}/space
```
### Get Folders
```bash
GET /clickup/api/v2/space/{space_id}/folder
```
### Get Lists
```bash
GET /clickup/api/v2/folder/{folder_id}/list
```
### Get Folderless Lists
```bash
GET /clickup/api/v2/space/{space_id}/list
```
### Get Tasks
```bash
GET /clickup/api/v2/list/{list_id}/task?include_closed=true
```
### Get a Task
```bash
GET /clickup/api/v2/task/{task_id}
```
### Create a Task
```bash
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
```bash
PUT /clickup/api/v2/task/{task_id}
Content-Type: application/json
{
"status": "complete",
"priority": null
}
```
### Delete a Task
```bash
DELETE /clickup/api/v2/task/{task_id}
```
### Get Filtered Team Tasks
```bash
GET /clickup/api/v2/team/{team_id}/task?statuses[]=to%20do&assignees[]=123
```
### Create Space
```bash
POST /clickup/api/v2/team/{team_id}/space
Content-Type: application/json
{
"name": "New Space",
"multiple_assignees": true
}
```
### Create Folder
```bash
POST /clickup/api/v2/space/{space_id}/folder
Content-Type: application/json
{"name": "New Folder"}
```
### Create List
```bash
POST /clickup/api/v2/folder/{folder_id}/list
Content-Type: application/json
{"name": "New List"}
```
### Create Webhook
```bash
POST /clickup/api/v2/team/{team_id}/webhook
Content-Type: application/json
{
"endpoint": "https://example.com/webhook",
"events": ["taskCreated", "taskUpdated", "taskDeleted"]
}
```
### Delete Webhook
```bash
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 `page` parameter (0-indexed)
- Responses are limited to 100 items per page
## Resources
- [ClickUp API Overview](https://developer.clickup.com/docs/Getting%20Started.md)
- [Tasks](https://developer.clickup.com/reference/gettasks.md)
- [Spaces](https://developer.clickup.com/reference/getspaces.md)
- [Lists](https://developer.clickup.com/reference/getlists.md)
- [Webhooks](https://developer.clickup.com/reference/createwebhook.md)
- [Rate Limits](https://developer.clickup.com/docs/rate-limits.md)
- [LLM Reference](https://developer.clickup.com/llms.txt)

View File

@@ -0,0 +1,121 @@
# 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
```bash
GET /cognito-forms/api/forms
```
#### Get Form
```bash
GET /cognito-forms/api/forms/{formId}
```
### Entries
#### List Entries
```bash
GET /cognito-forms/api/forms/{formId}/entries
```
#### Get Entry
```bash
GET /cognito-forms/api/forms/{formId}/entries/{entryId}
```
#### Create Entry
```bash
POST /cognito-forms/api/forms/{formId}/entries
Content-Type: application/json
{
"Name": {
"First": "John",
"Last": "Doe"
},
"Email": "john.doe@example.com"
}
```
#### Update Entry
```bash
PUT /cognito-forms/api/forms/{formId}/entries/{entryId}
Content-Type: application/json
{
"Name": {
"First": "Jane",
"Last": "Doe"
},
"Email": "jane.doe@example.com"
}
```
#### Delete Entry
```bash
DELETE /cognito-forms/api/forms/{formId}/entries/{entryId}
```
### Documents
#### Get Document
```bash
GET /cognito-forms/api/forms/{formId}/entries/{entryId}/documents/{templateNumber}
```
### Files
#### Get File
```bash
GET /cognito-forms/api/files/{fileId}
```
### Form Availability
#### Set Form Availability
```bash
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
- [Cognito Forms API Overview](https://www.cognitoforms.com/support/475/data-integration/cognito-forms-api)
- [REST API Reference](https://www.cognitoforms.com/support/476/data-integration/cognito-forms-api/rest-api-reference)
- [API Reference](https://www.cognitoforms.com/support/476/data-integration/cognito-forms-api/api-reference)

View File

@@ -0,0 +1,130 @@
# 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
```bash
GET /constant-contact/v3/contacts
```
### Get Contact
```bash
GET /constant-contact/v3/contacts/{contact_id}
```
### Create Contact
```bash
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
```bash
PUT /constant-contact/v3/contacts/{contact_id}
Content-Type: application/json
{
"first_name": "John",
"last_name": "Smith"
}
```
### Delete Contact
```bash
DELETE /constant-contact/v3/contacts/{contact_id}
```
### List Contact Lists
```bash
GET /constant-contact/v3/contact_lists
```
### Create Contact List
```bash
POST /constant-contact/v3/contact_lists
Content-Type: application/json
{
"name": "Newsletter Subscribers",
"description": "Main newsletter list"
}
```
### List Email Campaigns
```bash
GET /constant-contact/v3/emails
```
### Create Email Campaign
```bash
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
```bash
GET /constant-contact/v3/segments
```
### List Tags
```bash
GET /constant-contact/v3/contact_tags
```
### Get Account Summary
```bash
GET /constant-contact/v3/account/summary
```
### Email Campaign Summaries
```bash
GET /constant-contact/v3/reports/summary_reports/email_campaign_summaries
```
## Notes
- 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 `limit` and `cursor` parameters
- Maximum 1,000 contact lists per account
- Bulk operations are asynchronous
## Resources
- [V3 API Overview](https://developer.constantcontact.com/api_guide/getting_started.html)
- [API Reference](https://developer.constantcontact.com/api_reference/index.html)
- [Technical Overview](https://developer.constantcontact.com/api_guide/v3_technical_overview.html)

View File

@@ -0,0 +1,204 @@
# 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
```bash
POST /dropbox/2/users/get_current_account
Content-Type: application/json
null
```
#### Get Space Usage
```bash
POST /dropbox/2/users/get_space_usage
Content-Type: application/json
null
```
### Files
#### List Folder
```bash
POST /dropbox/2/files/list_folder
Content-Type: application/json
{
"path": ""
}
```
Use empty string `""` for root folder.
#### Continue Listing
```bash
POST /dropbox/2/files/list_folder/continue
Content-Type: application/json
{
"cursor": "..."
}
```
#### Get Metadata
```bash
POST /dropbox/2/files/get_metadata
Content-Type: application/json
{
"path": "/document.pdf"
}
```
#### Create Folder
```bash
POST /dropbox/2/files/create_folder_v2
Content-Type: application/json
{
"path": "/New Folder",
"autorename": false
}
```
#### Copy
```bash
POST /dropbox/2/files/copy_v2
Content-Type: application/json
{
"from_path": "/source/file.pdf",
"to_path": "/destination/file.pdf"
}
```
#### Move
```bash
POST /dropbox/2/files/move_v2
Content-Type: application/json
{
"from_path": "/old/file.pdf",
"to_path": "/new/file.pdf"
}
```
#### Delete
```bash
POST /dropbox/2/files/delete_v2
Content-Type: application/json
{
"path": "/file-to-delete.pdf"
}
```
#### Get Temporary Link
```bash
POST /dropbox/2/files/get_temporary_link
Content-Type: application/json
{
"path": "/document.pdf"
}
```
### Search
#### Search Files
```bash
POST /dropbox/2/files/search_v2
Content-Type: application/json
{
"query": "document"
}
```
### Revisions
#### List Revisions
```bash
POST /dropbox/2/files/list_revisions
Content-Type: application/json
{
"path": "/document.pdf"
}
```
### Tags
#### Get Tags
```bash
POST /dropbox/2/files/tags/get
Content-Type: application/json
{
"paths": ["/document.pdf"]
}
```
#### Add Tag
```bash
POST /dropbox/2/files/tags/add
Content-Type: application/json
{
"path": "/document.pdf",
"tag_text": "important"
}
```
#### Remove Tag
```bash
POST /dropbox/2/files/tags/remove
Content-Type: application/json
{
"path": "/document.pdf",
"tag_text": "important"
}
```
## Pagination
Dropbox uses cursor-based pagination:
```bash
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 response
```
## Notes
- 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
- [Dropbox HTTP API Overview](https://www.dropbox.com/developers/documentation/http/overview)
- [Dropbox API Explorer](https://dropbox.github.io/dropbox-api-v2-explorer/)
- [DBX File Access Guide](https://developers.dropbox.com/dbx-file-access-guide)

View File

@@ -0,0 +1,214 @@
# Eventbrite Routing Reference
**App name:** `eventbrite`
**Base URL proxied:** `www.eventbriteapi.com`
## API Path Pattern
```
/eventbrite/v3/{resource}/
```
Note: All Eventbrite API paths should end with a trailing slash.
## Common Endpoints
### Get Current User
```bash
GET /eventbrite/v3/users/me/
```
### List User Organizations
```bash
GET /eventbrite/v3/users/me/organizations/
```
### List User Orders
```bash
GET /eventbrite/v3/users/me/orders/
```
### List Organization Events
```bash
GET /eventbrite/v3/organizations/{organization_id}/events/
```
Query parameters:
- `status` - Filter: `draft`, `live`, `started`, `ended`, `completed`, `canceled`
- `order_by` - Sort: `start_asc`, `start_desc`, `created_asc`, `created_desc`
- `time_filter` - Filter: `current_future`, `past`
### Create Event
```bash
POST /eventbrite/v3/organizations/{organization_id}/events/
Content-Type: application/json
{
"event": {
"name": {"html": "My Event"},
"start": {"timezone": "America/Los_Angeles", "utc": "2026-03-01T19:00:00Z"},
"end": {"timezone": "America/Los_Angeles", "utc": "2026-03-01T22:00:00Z"},
"currency": "USD"
}
}
```
### Get Event
```bash
GET /eventbrite/v3/events/{event_id}/
```
### Update Event
```bash
POST /eventbrite/v3/events/{event_id}/
Content-Type: application/json
{
"event": {
"name": {"html": "Updated Name"}
}
}
```
### Publish Event
```bash
POST /eventbrite/v3/events/{event_id}/publish/
```
### Cancel Event
```bash
POST /eventbrite/v3/events/{event_id}/cancel/
```
### Delete Event
```bash
DELETE /eventbrite/v3/events/{event_id}/
```
### List Ticket Classes
```bash
GET /eventbrite/v3/events/{event_id}/ticket_classes/
```
### Create Ticket Class
```bash
POST /eventbrite/v3/events/{event_id}/ticket_classes/
Content-Type: application/json
{
"ticket_class": {
"name": "General Admission",
"quantity_total": 100,
"cost": "USD,2500"
}
}
```
### List Event Attendees
```bash
GET /eventbrite/v3/events/{event_id}/attendees/
```
### List Event Orders
```bash
GET /eventbrite/v3/events/{event_id}/orders/
```
### Get Order
```bash
GET /eventbrite/v3/orders/{order_id}/
```
### List Organization Venues
```bash
GET /eventbrite/v3/organizations/{organization_id}/venues/
```
### Create Venue
```bash
POST /eventbrite/v3/organizations/{organization_id}/venues/
Content-Type: application/json
{
"venue": {
"name": "Conference Center",
"address": {
"address_1": "123 Main St",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
}
}
}
```
### Get Venue
```bash
GET /eventbrite/v3/venues/{venue_id}/
```
### List Categories
```bash
GET /eventbrite/v3/categories/
```
### Get Category
```bash
GET /eventbrite/v3/categories/{category_id}/
```
### List Subcategories
```bash
GET /eventbrite/v3/subcategories/
```
### List Formats
```bash
GET /eventbrite/v3/formats/
```
### List Countries
```bash
GET /eventbrite/v3/system/countries/
```
### List Regions
```bash
GET /eventbrite/v3/system/regions/
```
## Expansions
Include related data with the `expand` parameter:
```bash
GET /eventbrite/v3/events/{event_id}/?expand=venue,ticket_classes,category
```
Available expansions: `venue`, `ticket_classes`, `category`, `subcategory`, `format`, `organizer`
## Pagination
Use `continuation` token for pagination:
```bash
GET /eventbrite/v3/organizations/{org_id}/events/?page_size=50
GET /eventbrite/v3/organizations/{org_id}/events/?continuation=eyJwYWdlIjogMn0
```
## Notes
- All endpoint paths must end with a trailing slash (`/`)
- Event creation requires an organization - use `/organizations/{org_id}/events/`
- Legacy user-based event endpoints (e.g., `/users/me/owned_events/`) are deprecated
- Timestamps are in ISO 8601 format (UTC)
- Currency amounts use format "CURRENCY,AMOUNT" where amount is in cents (e.g., "USD,2500" = $25.00)
- Rate limit: 1,000 calls per hour, 48,000 calls per day
- Event Search API is no longer publicly available (deprecated February 2020)
## Resources
- [Eventbrite API Documentation](https://www.eventbrite.com/platform/api)
- [API Basics](https://www.eventbrite.com/platform/docs/api-basics)
- [API Explorer](https://www.eventbrite.com/platform/docs/api-explorer)

View File

@@ -0,0 +1,85 @@
# Fathom Routing Reference
**App name:** `fathom`
**Base URL proxied:** `api.fathom.ai`
## API Path Pattern
```
/fathom/external/v1/{resource}
```
## Common Endpoints
### List Meetings
```bash
GET /fathom/external/v1/meetings
```
With filters:
```bash
GET /fathom/external/v1/meetings?created_after=2025-01-01T00:00:00Z&teams[]=Sales
```
### Get Summary
```bash
GET /fathom/external/v1/recordings/{recording_id}/summary
```
Async callback:
```bash
GET /fathom/external/v1/recordings/{recording_id}/summary?destination_url=https://example.com/webhook
```
### Get Transcript
```bash
GET /fathom/external/v1/recordings/{recording_id}/transcript
```
Async callback:
```bash
GET /fathom/external/v1/recordings/{recording_id}/transcript?destination_url=https://example.com/webhook
```
### List Teams
```bash
GET /fathom/external/v1/teams
```
### List Team Members
```bash
GET /fathom/external/v1/team_members?team=Sales
```
### Create Webhook
```bash
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
```bash
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 `/meetings` endpoint - use dedicated `/recordings/{id}/summary` and `/recordings/{id}/transcript` endpoints instead
- Use cursor-based pagination with `cursor` parameter
- Webhook `triggered_for` options: `my_recordings`, `shared_external_recordings`, `my_shared_with_team_recordings`, `shared_team_recordings`
- Webhook secrets are used to verify webhook signatures
## Resources
- [Fathom API Documentation](https://developers.fathom.ai)
- [LLM Reference](https://developers.fathom.ai/llms.txt)

View File

@@ -0,0 +1,125 @@
# GitHub Routing Reference
**App name:** `github`
**Base URL proxied:** `api.github.com`
## API Path Pattern
```
/github/{resource}
```
GitHub API does not use a version prefix in paths. Versioning is handled via the `X-GitHub-Api-Version` header.
## Common Endpoints
### Get Authenticated User
```bash
GET /github/user
```
### Get User by Username
```bash
GET /github/users/{username}
```
### List User Repositories
```bash
GET /github/user/repos?per_page=30&sort=updated
```
### Get Repository
```bash
GET /github/repos/{owner}/{repo}
```
### List Repository Contents
```bash
GET /github/repos/{owner}/{repo}/contents/{path}
```
### List Branches
```bash
GET /github/repos/{owner}/{repo}/branches
```
### List Commits
```bash
GET /github/repos/{owner}/{repo}/commits?per_page=30
```
### List Repository Issues
```bash
GET /github/repos/{owner}/{repo}/issues?state=open&per_page=30
```
### Create Issue
```bash
POST /github/repos/{owner}/{repo}/issues
Content-Type: application/json
{
"title": "Issue title",
"body": "Issue description",
"labels": ["bug"]
}
```
### List Pull Requests
```bash
GET /github/repos/{owner}/{repo}/pulls?state=open&per_page=30
```
### Create Pull Request
```bash
POST /github/repos/{owner}/{repo}/pulls
Content-Type: application/json
{
"title": "PR title",
"body": "PR description",
"head": "feature-branch",
"base": "main"
}
```
### Merge Pull Request
```bash
PUT /github/repos/{owner}/{repo}/pulls/{pull_number}/merge
Content-Type: application/json
{
"merge_method": "squash"
}
```
### Search Repositories
```bash
GET /github/search/repositories?q={query}&per_page=30
```
### Search Issues
```bash
GET /github/search/issues?q={query}&per_page=30
```
### Get Rate Limit
```bash
GET /github/rate_limit
```
## Notes
- Repository names are case-insensitive but the API preserves case
- Issue numbers and PR numbers share the same sequence per repository
- File content must be Base64 encoded when creating/updating files
- Rate limits: 5000 requests/hour for authenticated users, 30 searches/minute
- Pagination uses `per_page` (max 100, default 30) and `page` parameters
- Some endpoints require specific OAuth scopes (e.g., `read:org` for organization operations)
## Resources
- [GitHub REST API Documentation](https://docs.github.com/en/rest)
- [Repositories API](https://docs.github.com/en/rest/repos/repos)
- [Issues API](https://docs.github.com/en/rest/issues/issues)
- [Pull Requests API](https://docs.github.com/en/rest/pulls/pulls)

View File

@@ -0,0 +1,172 @@
# Google Ads Routing Reference
**App name:** `google-ads`
**Base URL proxied:** `googleads.googleapis.com`
## API Path Pattern
```
/google-ads/v23/customers/{customerId}/{endpoint}
```
## Common Endpoints
### List Accessible Customers
```bash
GET /google-ads/v23/customers:listAccessibleCustomers
```
### Search (GAQL Query)
```bash
POST /google-ads/v23/customers/{customerId}/googleAds:search
Content-Type: application/json
{
"query": "SELECT campaign.id, campaign.name, campaign.status FROM campaign ORDER BY campaign.id"
}
```
### Search Stream (for large result sets)
```bash
POST /google-ads/v23/customers/{customerId}/googleAds:searchStream
Content-Type: application/json
{
"query": "SELECT campaign.id, campaign.name FROM campaign"
}
```
## Common GAQL Queries
### List Campaigns
```sql
SELECT
campaign.id,
campaign.name,
campaign.status,
campaign.advertising_channel_type
FROM campaign
WHERE campaign.status != 'REMOVED'
ORDER BY campaign.name
```
### Campaign Performance
```sql
SELECT
campaign.id,
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
```
### List Ad Groups
```sql
SELECT
ad_group.id,
ad_group.name,
ad_group.status,
campaign.id,
campaign.name
FROM ad_group
WHERE ad_group.status != 'REMOVED'
```
### Ad Group Performance
```sql
SELECT
ad_group.id,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.average_cpc
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
```
### List Keywords
```sql
SELECT
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.status,
metrics.impressions,
metrics.clicks
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS
```
### List Ads
```sql
SELECT
ad_group_ad.ad.id,
ad_group_ad.ad.name,
ad_group_ad.status,
ad_group_ad.ad.type
FROM ad_group_ad
WHERE ad_group_ad.status != 'REMOVED'
```
## Mutate Operations
### Create Campaign
```bash
POST /google-ads/v23/customers/{customerId}/campaigns:mutate
Content-Type: application/json
{
"operations": [
{
"create": {
"name": "New Campaign",
"advertisingChannelType": "SEARCH",
"status": "PAUSED",
"manualCpc": {},
"campaignBudget": "customers/{customerId}/campaignBudgets/{budgetId}"
}
}
]
}
```
### Update Campaign Status
```bash
POST /google-ads/v23/customers/{customerId}/campaigns:mutate
Content-Type: application/json
{
"operations": [
{
"update": {
"resourceName": "customers/{customerId}/campaigns/{campaignId}",
"status": "ENABLED"
},
"updateMask": "status"
}
]
}
```
## Notes
- Authentication is automatic - the router injects OAuth token and developer-token headers
- Use `listAccessibleCustomers` first to get available customer IDs
- Customer IDs are 10-digit numbers (remove dashes if formatted as XXX-XXX-XXXX)
- Monetary values are in micros (divide by 1,000,000)
- Use GAQL (Google Ads Query Language) for querying
- Date ranges: `LAST_7_DAYS`, `LAST_30_DAYS`, `THIS_MONTH`, etc.
- Status values: `ENABLED`, `PAUSED`, `REMOVED`
- API version updates frequently - check release notes for latest (currently v23)
## Resources
- [API Overview](https://developers.google.com/google-ads/api/docs/start)
- [List Accessible Customers](https://developers.google.com/google-ads/api/reference/rpc/v23/CustomerService/ListAccessibleCustomers?transport=rest)
- [Search](https://developers.google.com/google-ads/api/reference/rpc/v23/GoogleAdsService/Search?transport=rest)
- [Search Stream](https://developers.google.com/google-ads/api/reference/rpc/v23/GoogleAdsService/SearchStream?transport=rest)
- [GAQL Reference](https://developers.google.com/google-ads/api/docs/query/overview)
- [Metrics Reference](https://developers.google.com/google-ads/api/fields/v23/metrics)

View File

@@ -0,0 +1,210 @@
# Google Analytics Admin Routing Reference
**App name:** `google-analytics-admin`
**Base URL proxied:** `analyticsadmin.googleapis.com`
## API Path Pattern
```
/google-analytics-admin/v1beta/{endpoint}
```
## Common Endpoints
### List Accounts
```bash
GET /google-analytics-admin/v1beta/accounts
```
### Get Account
```bash
GET /google-analytics-admin/v1beta/accounts/{accountId}
```
### List Properties
```bash
GET /google-analytics-admin/v1beta/properties?filter=parent:accounts/{accountId}
```
### Get Property
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}
```
### Create Property
```bash
POST /google-analytics-admin/v1beta/properties
Content-Type: application/json
{
"parent": "accounts/{accountId}",
"displayName": "My New Property",
"timeZone": "America/Los_Angeles",
"currencyCode": "USD",
"industryCategory": "TECHNOLOGY"
}
```
### Update Property
```bash
PATCH /google-analytics-admin/v1beta/properties/{propertyId}?updateMask=displayName
Content-Type: application/json
{
"displayName": "Updated Property Name"
}
```
### List Data Streams
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/dataStreams
```
### Get Data Stream
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/dataStreams/{dataStreamId}
```
### Create Web Data Stream
```bash
POST /google-analytics-admin/v1beta/properties/{propertyId}/dataStreams
Content-Type: application/json
{
"type": "WEB_DATA_STREAM",
"displayName": "My Website",
"webStreamData": {
"defaultUri": "https://example.com"
}
}
```
### List Custom Dimensions
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/customDimensions
```
### Create Custom Dimension
```bash
POST /google-analytics-admin/v1beta/properties/{propertyId}/customDimensions
Content-Type: application/json
{
"parameterName": "user_type",
"displayName": "User Type",
"scope": "USER",
"description": "Type of user (free, premium, enterprise)"
}
```
### List Custom Metrics
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/customMetrics
```
### Create Custom Metric
```bash
POST /google-analytics-admin/v1beta/properties/{propertyId}/customMetrics
Content-Type: application/json
{
"parameterName": "points_earned",
"displayName": "Points Earned",
"scope": "EVENT",
"measurementUnit": "STANDARD",
"description": "Number of loyalty points earned"
}
```
### List Conversion Events
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/conversionEvents
```
### Create Conversion Event
```bash
POST /google-analytics-admin/v1beta/properties/{propertyId}/conversionEvents
Content-Type: application/json
{
"eventName": "purchase"
}
```
### Get Measurement Protocol Secret
```bash
GET /google-analytics-admin/v1beta/properties/{propertyId}/dataStreams/{dataStreamId}/measurementProtocolSecrets
```
### Create Measurement Protocol Secret
```bash
POST /google-analytics-admin/v1beta/properties/{propertyId}/dataStreams/{dataStreamId}/measurementProtocolSecrets
Content-Type: application/json
{
"displayName": "Server-side tracking"
}
```
## Account Summaries
### List Account Summaries
```bash
GET /google-analytics-admin/v1beta/accountSummaries
```
Returns a lightweight summary of all accounts and properties the user has access to.
## Data Stream Types
- `WEB_DATA_STREAM` - Website tracking
- `ANDROID_APP_DATA_STREAM` - Android app
- `IOS_APP_DATA_STREAM` - iOS app
## Custom Dimension Scopes
- `EVENT` - Dimension applies to events
- `USER` - Dimension applies to users
## Custom Metric Scopes
- `EVENT` - Metric applies to events
## Measurement Units (Custom Metrics)
- `STANDARD` - Integer or decimal
- `CURRENCY` - Currency value
- `FEET`, `METERS` - Distance
- `MILES`, `KILOMETERS` - Distance
- `MILLISECONDS`, `SECONDS`, `MINUTES`, `HOURS` - Time
## Industry Categories
- `AUTOMOTIVE`, `BUSINESS_AND_INDUSTRIAL_MARKETS`, `FINANCE`, `HEALTHCARE`
- `TECHNOLOGY`, `TRAVEL`, `RETAIL`, `REAL_ESTATE`, `GAMES`
- `ARTS_AND_ENTERTAINMENT`, `BEAUTY_AND_FITNESS`, `BOOKS_AND_LITERATURE`
- `FOOD_AND_DRINK`, `HOBBIES_AND_LEISURE`, `HOME_AND_GARDEN`
- `INTERNET_AND_TELECOM`, `JOBS_AND_EDUCATION`, `LAW_AND_GOVERNMENT`
- `NEWS`, `ONLINE_COMMUNITIES`, `PEOPLE_AND_SOCIETY`, `PETS_AND_ANIMALS`
- `REFERENCE`, `SCIENCE`, `SHOPPING`, `SPORTS`
## Notes
- Authentication is automatic - the router injects the OAuth token
- Property IDs are numeric (e.g., `properties/521310447`)
- Account IDs are numeric (e.g., `accounts/123456789`)
- GA4 properties only (Universal Analytics not supported)
- Use `accountSummaries` endpoint to quickly list all accessible properties
- The `filter` parameter on list properties uses format: `parent:accounts/{accountId}`
- Use `updateMask` query parameter to specify which fields to update in PATCH requests
- This API is for property/account management - use the Data API for running reports
## Resources
- [API Overview](https://developers.google.com/analytics/devguides/config/admin/v1)
- [List Accounts](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/accounts/list)
- [List Properties](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties/list)
- [Create Property](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties/create)
- [Data Streams](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties.dataStreams)
- [Custom Dimensions](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties.customDimensions)
- [Custom Metrics](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties.customMetrics)
- [Conversion Events](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1beta/properties.conversionEvents)

View File

@@ -0,0 +1,151 @@
# Google Analytics Data Routing Reference
**App name:** `google-analytics-data`
**Base URL proxied:** `analyticsdata.googleapis.com`
## API Path Pattern
```
/google-analytics-data/v1beta/{endpoint}
```
## Common Endpoints
### Run Report
```bash
POST /google-analytics-data/v1beta/properties/{propertyId}:runReport
Content-Type: application/json
{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "city"}],
"metrics": [{"name": "activeUsers"}]
}
```
### Run Realtime Report
```bash
POST /google-analytics-data/v1beta/properties/{propertyId}:runRealtimeReport
Content-Type: application/json
{
"dimensions": [{"name": "country"}],
"metrics": [{"name": "activeUsers"}]
}
```
### Batch Run Reports
```bash
POST /google-analytics-data/v1beta/properties/{propertyId}:batchRunReports
Content-Type: application/json
{
"requests": [
{
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
"dimensions": [{"name": "country"}],
"metrics": [{"name": "sessions"}]
},
{
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
"dimensions": [{"name": "deviceCategory"}],
"metrics": [{"name": "sessions"}]
}
]
}
```
### Get Metadata (available dimensions/metrics)
```bash
GET /google-analytics-data/v1beta/properties/{propertyId}/metadata
```
## Common Report Examples
### Page Views by Page
```json
{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "pagePath"}],
"metrics": [{"name": "screenPageViews"}],
"orderBys": [{"metric": {"metricName": "screenPageViews"}, "desc": true}],
"limit": 10
}
```
### Users by Country
```json
{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "country"}],
"metrics": [{"name": "activeUsers"}, {"name": "sessions"}],
"orderBys": [{"metric": {"metricName": "activeUsers"}, "desc": true}]
}
```
### Traffic Sources
```json
{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "sessionSource"}, {"name": "sessionMedium"}],
"metrics": [{"name": "sessions"}, {"name": "conversions"}]
}
```
### Device Breakdown
```json
{
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
"dimensions": [{"name": "deviceCategory"}],
"metrics": [{"name": "activeUsers"}, {"name": "sessions"}, {"name": "bounceRate"}]
}
```
### Daily Sessions Trend
```json
{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "date"}],
"metrics": [{"name": "sessions"}, {"name": "activeUsers"}],
"orderBys": [{"dimension": {"dimensionName": "date"}}]
}
```
## Common Dimensions
- `date`, `dateHour`, `dateHourMinute`
- `country`, `city`, `region`
- `deviceCategory`, `browser`, `operatingSystem`
- `pagePath`, `pageTitle`, `landingPage`
- `sessionSource`, `sessionMedium`, `sessionCampaignName`
- `eventName`
## Common Metrics
- `activeUsers`, `newUsers`, `totalUsers`
- `sessions`, `sessionsPerUser`
- `screenPageViews`, `screenPageViewsPerSession`
- `bounceRate`, `averageSessionDuration`
- `conversions`, `eventCount`
## Date Formats
- Relative: `today`, `yesterday`, `7daysAgo`, `30daysAgo`
- Absolute: `2026-01-01`
## Notes
- Authentication is automatic - the router injects the OAuth token
- Property IDs are numeric (e.g., `521310447` from URL `p521310447`)
- GA4 properties only (Universal Analytics not supported)
- Use metadata endpoint to discover available dimensions/metrics
- Results are paginated with `limit` and `offset`
- This API is for running reports only - listing properties requires the Admin API
## Resources
- [API Overview](https://developers.google.com/analytics/devguides/reporting/data/v1)
- [Run Report](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport)
- [Run Realtime Report](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runRealtimeReport)
- [Batch Run Reports](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/batchRunReports)
- [Get Metadata](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/getMetadata)

View File

@@ -0,0 +1,139 @@
# Google Calendar Routing Reference
**App name:** `google-calendar`
**Base URL proxied:** `www.googleapis.com`
## API Path Pattern
```
/google-calendar/calendar/v3/{endpoint}
```
## Common Endpoints
### List Calendars
```bash
GET /google-calendar/calendar/v3/users/me/calendarList
```
### Get Calendar
```bash
GET /google-calendar/calendar/v3/calendars/{calendarId}
```
Use `primary` for the user's primary calendar.
### List Events
```bash
GET /google-calendar/calendar/v3/calendars/primary/events?maxResults=10&orderBy=startTime&singleEvents=true
```
With time bounds:
```bash
GET /google-calendar/calendar/v3/calendars/primary/events?timeMin=2024-01-01T00:00:00Z&timeMax=2024-12-31T23:59:59Z&singleEvents=true&orderBy=startTime
```
### Get Event
```bash
GET /google-calendar/calendar/v3/calendars/primary/events/{eventId}
```
### Insert Event
```bash
POST /google-calendar/calendar/v3/calendars/primary/events
Content-Type: application/json
{
"summary": "Team Meeting",
"description": "Weekly sync",
"start": {
"dateTime": "2024-01-15T10:00:00",
"timeZone": "America/Los_Angeles"
},
"end": {
"dateTime": "2024-01-15T11:00:00",
"timeZone": "America/Los_Angeles"
},
"attendees": [
{"email": "attendee@example.com"}
]
}
```
All-day event:
```bash
POST /google-calendar/calendar/v3/calendars/primary/events
Content-Type: application/json
{
"summary": "All Day Event",
"start": {"date": "2024-01-15"},
"end": {"date": "2024-01-16"}
}
```
### Update Event
```bash
PUT /google-calendar/calendar/v3/calendars/primary/events/{eventId}
Content-Type: application/json
{
"summary": "Updated Meeting Title",
"start": {"dateTime": "2024-01-15T10:00:00Z"},
"end": {"dateTime": "2024-01-15T11:00:00Z"}
}
```
### Patch Event (partial update)
```bash
PATCH /google-calendar/calendar/v3/calendars/primary/events/{eventId}
Content-Type: application/json
{
"summary": "New Title Only"
}
```
### Delete Event
```bash
DELETE /google-calendar/calendar/v3/calendars/primary/events/{eventId}
```
### Quick Add Event (natural language)
```bash
POST /google-calendar/calendar/v3/calendars/primary/events/quickAdd?text=Meeting+with+John+tomorrow+at+3pm
```
### Free/Busy Query
```bash
POST /google-calendar/calendar/v3/freeBusy
Content-Type: application/json
{
"timeMin": "2024-01-15T00:00:00Z",
"timeMax": "2024-01-16T00:00:00Z",
"items": [{"id": "primary"}]
}
```
## Notes
- Authentication is automatic - the router injects the OAuth token
- Use `primary` as calendarId for the user's main calendar
- Times must be in RFC3339 format (e.g., `2026-01-15T10:00:00Z`)
- For recurring events, use `singleEvents=true` to expand instances
- `orderBy=startTime` requires `singleEvents=true`
## Resources
- [API Overview](https://developers.google.com/calendar/api/v3/reference)
- [List Calendars](https://developers.google.com/workspace/calendar/api/v3/reference/calendarList/list)
- [Get Calendar](https://developers.google.com/workspace/calendar/api/v3/reference/calendarList/get)
- [List Events](https://developers.google.com/workspace/calendar/api/v3/reference/events/list)
- [Get Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/get)
- [Insert Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/insert)
- [Update Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/update)
- [Patch Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/patch)
- [Delete Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/delete)
- [Quick Add Event](https://developers.google.com/workspace/calendar/api/v3/reference/events/quickAdd)
- [Free/Busy Query](https://developers.google.com/workspace/calendar/api/v3/reference/freebusy/query)

View File

@@ -0,0 +1,139 @@
# Google Contacts Routing Reference
**App name:** `google-contacts`
**Base URL proxied:** `people.googleapis.com`
## API Path Pattern
```
/google-contacts/v1/{endpoint}
```
## Common Endpoints
### List Contacts
```bash
GET /google-contacts/v1/people/me/connections?personFields=names,emailAddresses,phoneNumbers&pageSize=100
```
### Get Contact
```bash
GET /google-contacts/v1/people/{resourceName}?personFields=names,emailAddresses,phoneNumbers
```
Example: `GET /google-contacts/v1/people/c1234567890?personFields=names,emailAddresses`
### Create Contact
```bash
POST /google-contacts/v1/people:createContact
Content-Type: application/json
{
"names": [{"givenName": "John", "familyName": "Doe"}],
"emailAddresses": [{"value": "john@example.com"}],
"phoneNumbers": [{"value": "+1-555-0123"}]
}
```
### Update Contact
```bash
PATCH /google-contacts/v1/people/{resourceName}:updateContact?updatePersonFields=names,emailAddresses
Content-Type: application/json
{
"etag": "%EgcBAgkLLjc9...",
"names": [{"givenName": "John", "familyName": "Smith"}]
}
```
### Delete Contact
```bash
DELETE /google-contacts/v1/people/{resourceName}:deleteContact
```
### Batch Get Contacts
```bash
GET /google-contacts/v1/people:batchGet?resourceNames=people/c123&resourceNames=people/c456&personFields=names
```
### Batch Create Contacts
```bash
POST /google-contacts/v1/people:batchCreateContacts
Content-Type: application/json
{
"contacts": [{"contactPerson": {"names": [{"givenName": "Alice"}]}}],
"readMask": "names"
}
```
### Batch Delete Contacts
```bash
POST /google-contacts/v1/people:batchDeleteContacts
Content-Type: application/json
{
"resourceNames": ["people/c123", "people/c456"]
}
```
### Search Contacts
```bash
GET /google-contacts/v1/people:searchContacts?query=John&readMask=names,emailAddresses
```
### List Contact Groups
```bash
GET /google-contacts/v1/contactGroups?pageSize=100
```
### Get Contact Group
```bash
GET /google-contacts/v1/contactGroups/{resourceName}?maxMembers=100
```
### Create Contact Group
```bash
POST /google-contacts/v1/contactGroups
Content-Type: application/json
{
"contactGroup": {"name": "Work Contacts"}
}
```
### Delete Contact Group
```bash
DELETE /google-contacts/v1/contactGroups/{resourceName}?deleteContacts=false
```
### Modify Group Members
```bash
POST /google-contacts/v1/contactGroups/{resourceName}/members:modify
Content-Type: application/json
{
"resourceNamesToAdd": ["people/c123"],
"resourceNamesToRemove": ["people/c456"]
}
```
### List Other Contacts
```bash
GET /google-contacts/v1/otherContacts?readMask=names,emailAddresses&pageSize=100
```
## Notes
- Resource names for contacts: `people/c{id}` (e.g., `people/c1234567890`)
- Resource names for groups: `contactGroups/{id}` (e.g., `contactGroups/starred`)
- System groups: `starred`, `friends`, `family`, `coworkers`, `myContacts`, `all`, `blocked`
- `personFields` parameter is required for most read operations
- Include `etag` when updating to prevent concurrent modification issues
- Pagination uses `pageToken` parameter
## Resources
- [Google People API Overview](https://developers.google.com/people/api/rest)
- [People Resource](https://developers.google.com/people/api/rest/v1/people)
- [Contact Groups Resource](https://developers.google.com/people/api/rest/v1/contactGroups)

View File

@@ -0,0 +1,158 @@
# Google Docs Routing Reference
**App name:** `google-docs`
**Base URL proxied:** `docs.googleapis.com`
## API Path Pattern
```
/google-docs/v1/documents/{documentId}
```
## Common Endpoints
### Get Document
```bash
GET /google-docs/v1/documents/{documentId}
```
### Create Document
```bash
POST /google-docs/v1/documents
Content-Type: application/json
{
"title": "New Document"
}
```
### Batch Update Document
```bash
POST /google-docs/v1/documents/{documentId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"insertText": {
"location": {"index": 1},
"text": "Hello, World!"
}
}
]
}
```
## Common Requests for batchUpdate
### Insert Text
```json
{
"insertText": {
"location": {"index": 1},
"text": "Text to insert"
}
}
```
### Delete Content
```json
{
"deleteContentRange": {
"range": {
"startIndex": 1,
"endIndex": 10
}
}
}
```
### Replace All Text
```json
{
"replaceAllText": {
"containsText": {
"text": "{{placeholder}}",
"matchCase": true
},
"replaceText": "replacement value"
}
}
```
### Insert Table
```json
{
"insertTable": {
"location": {"index": 1},
"rows": 3,
"columns": 3
}
}
```
### Insert Inline Image
```json
{
"insertInlineImage": {
"location": {"index": 1},
"uri": "https://example.com/image.png",
"objectSize": {
"height": {"magnitude": 100, "unit": "PT"},
"width": {"magnitude": 100, "unit": "PT"}
}
}
}
```
### Update Text Style
```json
{
"updateTextStyle": {
"range": {
"startIndex": 1,
"endIndex": 10
},
"textStyle": {
"bold": true,
"fontSize": {"magnitude": 14, "unit": "PT"}
},
"fields": "bold,fontSize"
}
}
```
### Insert Page Break
```json
{
"insertPageBreak": {
"location": {"index": 1}
}
}
```
## Document Structure
The document body contains:
- `content` - Array of structural elements
- `body.content[].paragraph` - Paragraph element
- `body.content[].table` - Table element
- `body.content[].sectionBreak` - Section break
## Notes
- Authentication is automatic - the router injects the OAuth token
- Index positions are 1-based (document starts at index 1)
- Use `endOfSegmentLocation` to append at end
- Multiple requests in batchUpdate are applied atomically
- Get document first to find correct indices for updates
- The `fields` parameter in style updates uses field mask syntax
## Resources
- [API Overview](https://developers.google.com/docs/api/how-tos/overview)
- [Get Document](https://developers.google.com/docs/api/reference/rest/v1/documents/get)
- [Create Document](https://developers.google.com/docs/api/reference/rest/v1/documents/create)
- [Batch Update](https://developers.google.com/docs/api/reference/rest/v1/documents/batchUpdate)
- [Request Types Reference](https://developers.google.com/docs/api/reference/rest/v1/documents/request)
- [Document Structure Guide](https://developers.google.com/docs/api/concepts/structure)

View File

@@ -0,0 +1,158 @@
# Google Drive Routing Reference
**App name:** `google-drive`
**Base URL proxied:** `www.googleapis.com`
## API Path Pattern
```
/google-drive/drive/v3/{endpoint}
```
## Common Endpoints
### List Files
```bash
GET /google-drive/drive/v3/files?pageSize=10
```
With query:
```bash
GET /google-drive/drive/v3/files?q=name%20contains%20'report'&pageSize=10
```
Only folders:
```bash
GET /google-drive/drive/v3/files?q=mimeType='application/vnd.google-apps.folder'
```
Files in specific folder:
```bash
GET /google-drive/drive/v3/files?q='FOLDER_ID'+in+parents
```
With fields:
```bash
GET /google-drive/drive/v3/files?fields=files(id,name,mimeType,createdTime,modifiedTime,size)
```
### Get File Metadata
```bash
GET /google-drive/drive/v3/files/{fileId}?fields=id,name,mimeType,size,createdTime
```
### Download File Content
```bash
GET /google-drive/drive/v3/files/{fileId}?alt=media
```
### Export Google Docs (to PDF, DOCX, etc.)
```bash
GET /google-drive/drive/v3/files/{fileId}/export?mimeType=application/pdf
```
### Create File (metadata only)
```bash
POST /google-drive/drive/v3/files
Content-Type: application/json
{
"name": "New Document",
"mimeType": "application/vnd.google-apps.document"
}
```
### Create Folder
```bash
POST /google-drive/drive/v3/files
Content-Type: application/json
{
"name": "New Folder",
"mimeType": "application/vnd.google-apps.folder"
}
```
### Update File Metadata
```bash
PATCH /google-drive/drive/v3/files/{fileId}
Content-Type: application/json
{
"name": "Renamed File"
}
```
### Move File to Folder
```bash
PATCH /google-drive/drive/v3/files/{fileId}?addParents=NEW_FOLDER_ID&removeParents=OLD_FOLDER_ID
```
### Delete File
```bash
DELETE /google-drive/drive/v3/files/{fileId}
```
### Copy File
```bash
POST /google-drive/drive/v3/files/{fileId}/copy
Content-Type: application/json
{
"name": "Copy of File"
}
```
### Create Permission (Share File)
```bash
POST /google-drive/drive/v3/files/{fileId}/permissions
Content-Type: application/json
{
"role": "reader",
"type": "user",
"emailAddress": "user@example.com"
}
```
## Query Operators
Use in the `q` parameter:
- `name = 'exact name'`
- `name contains 'partial'`
- `mimeType = 'application/pdf'`
- `'folderId' in parents`
- `trashed = false`
- `modifiedTime > '2024-01-01T00:00:00'`
Combine with `and`:
```
name contains 'report' and mimeType = 'application/pdf'
```
## Common MIME Types
- `application/vnd.google-apps.document` - Google Docs
- `application/vnd.google-apps.spreadsheet` - Google Sheets
- `application/vnd.google-apps.presentation` - Google Slides
- `application/vnd.google-apps.folder` - Folder
- `application/pdf` - PDF
## Notes
- Authentication is automatic - the router injects the OAuth token
- Use `fields` parameter to limit response data
- Pagination uses `pageToken` from previous response's `nextPageToken`
## Resources
- [API Overview](https://developers.google.com/workspace/drive/api/reference/rest/v3#rest-resource:-v3.about)
- [List Files](https://developers.google.com/drive/api/reference/rest/v3/files/list)
- [Get File](https://developers.google.com/drive/api/reference/rest/v3/files/get)
- [Create File](https://developers.google.com/drive/api/reference/rest/v3/files/create)
- [Update File](https://developers.google.com/drive/api/reference/rest/v3/files/update)
- [Delete File](https://developers.google.com/drive/api/reference/rest/v3/files/delete)
- [Copy File](https://developers.google.com/drive/api/reference/rest/v3/files/copy)
- [Export File](https://developers.google.com/drive/api/reference/rest/v3/files/export)
- [Create Permission](https://developers.google.com/workspace/drive/api/reference/rest/v3/permissions/create)
- [Search Query Syntax](https://developers.google.com/drive/api/guides/search-files)

View File

@@ -0,0 +1,206 @@
# Google Forms Routing Reference
**App name:** `google-forms`
**Base URL proxied:** `forms.googleapis.com`
## API Path Pattern
```
/google-forms/v1/forms/{formId}
```
## Common Endpoints
### Get Form
```bash
GET /google-forms/v1/forms/{formId}
```
### Create Form
```bash
POST /google-forms/v1/forms
Content-Type: application/json
{
"info": {
"title": "Customer Feedback Survey"
}
}
```
### Batch Update Form
```bash
POST /google-forms/v1/forms/{formId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createItem": {
"item": {
"title": "What is your name?",
"questionItem": {
"question": {
"required": true,
"textQuestion": {
"paragraph": false
}
}
}
},
"location": {"index": 0}
}
}
]
}
```
### List Responses
```bash
GET /google-forms/v1/forms/{formId}/responses
```
### Get Response
```bash
GET /google-forms/v1/forms/{formId}/responses/{responseId}
```
## Common Requests for batchUpdate
### Create Text Question
```json
{
"createItem": {
"item": {
"title": "Question text",
"questionItem": {
"question": {
"required": true,
"textQuestion": {"paragraph": false}
}
}
},
"location": {"index": 0}
}
}
```
### Create Multiple Choice Question
```json
{
"createItem": {
"item": {
"title": "Select an option",
"questionItem": {
"question": {
"required": true,
"choiceQuestion": {
"type": "RADIO",
"options": [
{"value": "Option A"},
{"value": "Option B"},
{"value": "Option C"}
]
}
}
}
},
"location": {"index": 0}
}
}
```
### Create Checkbox Question
```json
{
"createItem": {
"item": {
"title": "Select all that apply",
"questionItem": {
"question": {
"choiceQuestion": {
"type": "CHECKBOX",
"options": [
{"value": "Option 1"},
{"value": "Option 2"}
]
}
}
}
},
"location": {"index": 0}
}
}
```
### Create Scale Question
```json
{
"createItem": {
"item": {
"title": "Rate your experience",
"questionItem": {
"question": {
"scaleQuestion": {
"low": 1,
"high": 5,
"lowLabel": "Poor",
"highLabel": "Excellent"
}
}
}
},
"location": {"index": 0}
}
}
```
### Update Form Info
```json
{
"updateFormInfo": {
"info": {
"title": "New Form Title",
"description": "Form description"
},
"updateMask": "title,description"
}
}
```
### Delete Item
```json
{
"deleteItem": {
"location": {"index": 0}
}
}
```
## Question Types
- `textQuestion` - Short or paragraph text
- `choiceQuestion` - Radio, checkbox, or dropdown
- `scaleQuestion` - Linear scale
- `dateQuestion` - Date picker
- `timeQuestion` - Time picker
- `fileUploadQuestion` - File upload
## Notes
- Authentication is automatic - the router injects the OAuth token
- Form IDs can be found in the form URL
- Responses include `answers` keyed by question ID
- Use `updateMask` to specify which fields to update
- Location index is 0-based for item positioning
## Resources
- [API Overview](https://developers.google.com/workspace/forms/api/reference/rest)
- [Get Form](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms/get)
- [Create Form](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms/create)
- [Batch Update Form](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms/batchUpdate)
- [Batch Update Request Types](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms/batchUpdate#request)
- [List Responses](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms.responses/list)
- [Get Response](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms.responses/get)
- [Form Resource](https://developers.google.com/workspace/forms/api/reference/rest/v1/forms)

View File

@@ -0,0 +1,146 @@
# Gmail Routing Reference
**App name:** `google-mail`
**Base URL proxied:** `gmail.googleapis.com`
## API Path Pattern
```
/google-mail/gmail/v1/users/me/{endpoint}
```
## Common Endpoints
### List Messages
```bash
GET /google-mail/gmail/v1/users/me/messages?maxResults=10
```
With query filter:
```bash
GET /google-mail/gmail/v1/users/me/messages?q=is:unread&maxResults=10
```
### Get Message
```bash
GET /google-mail/gmail/v1/users/me/messages/{messageId}
```
With metadata only:
```bash
GET /google-mail/gmail/v1/users/me/messages/{messageId}?format=metadata&metadataHeaders=From&metadataHeaders=Subject&metadataHeaders=Date
```
### Send Message
```bash
POST /google-mail/gmail/v1/users/me/messages/send
Content-Type: application/json
{
"raw": "BASE64_ENCODED_EMAIL"
}
```
### List Labels
```bash
GET /google-mail/gmail/v1/users/me/labels
```
### List Threads
```bash
GET /google-mail/gmail/v1/users/me/threads?maxResults=10
```
### Get Thread
```bash
GET /google-mail/gmail/v1/users/me/threads/{threadId}
```
### Modify Message Labels
```bash
POST /google-mail/gmail/v1/users/me/messages/{messageId}/modify
Content-Type: application/json
{
"addLabelIds": ["STARRED"],
"removeLabelIds": ["UNREAD"]
}
```
### Trash Message
```bash
POST /google-mail/gmail/v1/users/me/messages/{messageId}/trash
```
### Create Draft
```bash
POST /google-mail/gmail/v1/users/me/drafts
Content-Type: application/json
{
"message": {
"raw": "BASE64URL_ENCODED_EMAIL"
}
}
```
### Update Draft
```bash
PUT /google-mail/gmail/v1/users/me/drafts/{draftId}
Content-Type: application/json
{
"message": {
"raw": "BASE64URL_ENCODED_EMAIL"
}
}
```
### Send Draft
```bash
POST /google-mail/gmail/v1/users/me/drafts/send
Content-Type: application/json
{
"id": "{draftId}"
}
```
### Get Profile
```bash
GET /google-mail/gmail/v1/users/me/profile
```
## Query Operators
Use in the `q` parameter:
- `is:unread` - Unread messages
- `is:starred` - Starred messages
- `from:email@example.com` - From specific sender
- `to:email@example.com` - To specific recipient
- `subject:keyword` - Subject contains keyword
- `after:2024/01/01` - After date
- `before:2024/12/31` - Before date
- `has:attachment` - Has attachments
## Notes
- Authentication is automatic - the router injects the OAuth token
- Use `me` as userId for the authenticated user
- Message body is base64url encoded in the `raw` field
## Resources
- [API Overview](https://developers.google.com/gmail/api/reference/rest)
- [List Messages](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/list)
- [Get Message](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/get)
- [Send Message](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/send)
- [Modify Message Labels](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/modify)
- [Trash Message](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/trash)
- [List Threads](https://developers.google.com/gmail/api/reference/rest/v1/users.threads/list)
- [Get Thread](https://developers.google.com/gmail/api/reference/rest/v1/users.threads/get)
- [List Labels](https://developers.google.com/gmail/api/reference/rest/v1/users.labels/list)
- [Create Draft](https://developers.google.com/gmail/api/reference/rest/v1/users.drafts/create)
- [Update Draft](https://developers.google.com/gmail/api/reference/rest/v1/users.drafts/update)
- [Send Draft](https://developers.google.com/gmail/api/reference/rest/v1/users.drafts/send)
- [Get Profile](https://developers.google.com/gmail/api/reference/rest/v1/users/getProfile)

View File

@@ -0,0 +1,121 @@
# Google Meet Routing Reference
**App name:** `google-meet`
**Base URL proxied:** `meet.googleapis.com`
## API Path Pattern
```
/google-meet/v2/{resource}
```
## Common Endpoints
### Create Space
```bash
POST /google-meet/v2/spaces
Content-Type: application/json
{}
```
Response:
```json
{
"name": "spaces/abc123",
"meetingUri": "https://meet.google.com/abc-defg-hij",
"meetingCode": "abc-defg-hij",
"config": {
"accessType": "OPEN",
"entryPointAccess": "ALL"
}
}
```
### Get Space
```bash
GET /google-meet/v2/spaces/{spaceId}
```
### Update Space
```bash
PATCH /google-meet/v2/spaces/{spaceId}
Content-Type: application/json
{
"config": {
"accessType": "TRUSTED"
}
}
```
### End Active Call
```bash
POST /google-meet/v2/spaces/{spaceId}:endActiveConference
```
### List Conference Records
```bash
GET /google-meet/v2/conferenceRecords
```
With filter:
```bash
GET /google-meet/v2/conferenceRecords?filter=space.name="spaces/abc123"
```
### Get Conference Record
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}
```
### List Participants
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/participants
```
### Get Participant
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/participants/{participantId}
```
### List Recordings
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/recordings
```
### Get Recording
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/recordings/{recordingId}
```
### List Transcripts
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/transcripts
```
### Get Transcript
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/transcripts/{transcriptId}
```
### List Transcript Entries
```bash
GET /google-meet/v2/conferenceRecords/{conferenceRecordId}/transcripts/{transcriptId}/entries
```
## Notes
- Spaces are persistent meeting rooms that can be reused
- Conference records are created when a meeting starts and track meeting history
- Access types: `OPEN` (anyone with link), `TRUSTED` (organization members only), `RESTRICTED` (invited only)
- Recordings and transcripts require Google Workspace with recording enabled
## Resources
- [Google Meet API Overview](https://developers.google.com/meet/api/reference/rest)
- [Spaces](https://developers.google.com/meet/api/reference/rest/v2/spaces)
- [Conference Records](https://developers.google.com/meet/api/reference/rest/v2/conferenceRecords)
- [Participants](https://developers.google.com/meet/api/reference/rest/v2/conferenceRecords.participants)
- [Recordings](https://developers.google.com/meet/api/reference/rest/v2/conferenceRecords.recordings)
- [Transcripts](https://developers.google.com/meet/api/reference/rest/v2/conferenceRecords.transcripts)

View File

@@ -0,0 +1,96 @@
# Google Merchant Routing Reference
**App name:** `google-merchant`
**Base URL proxied:** `merchantapi.googleapis.com`
## API Path Pattern
```
/google-merchant/{sub-api}/{version}/accounts/{accountId}/{resource}
```
The Merchant API uses sub-APIs: `products`, `accounts`, `datasources`, `reports`, `promotions`, `inventories`, `notifications`, `conversions`, `lfp`
## Common Endpoints
### List Products
```bash
GET /google-merchant/products/v1/accounts/{accountId}/products
```
### Get Product
```bash
GET /google-merchant/products/v1/accounts/{accountId}/products/{productId}
```
Product ID format: `contentLanguage~feedLabel~offerId` (e.g., `en~US~sku123`)
### Insert Product Input
```bash
POST /google-merchant/products/v1/accounts/{accountId}/productInputs:insert?dataSource=accounts/{accountId}/dataSources/{dataSourceId}
Content-Type: application/json
{
"offerId": "sku123",
"contentLanguage": "en",
"feedLabel": "US",
"attributes": {
"title": "Product Title",
"link": "https://example.com/product",
"imageLink": "https://example.com/image.jpg",
"availability": "in_stock",
"price": {"amountMicros": "19990000", "currencyCode": "USD"}
}
}
```
### Delete Product Input
```bash
DELETE /google-merchant/products/v1/accounts/{accountId}/productInputs/{productId}?dataSource=accounts/{accountId}/dataSources/{dataSourceId}
```
### List Data Sources
```bash
GET /google-merchant/datasources/v1/accounts/{accountId}/dataSources
```
### Search Reports
```bash
POST /google-merchant/reports/v1/accounts/{accountId}/reports:search
Content-Type: application/json
{
"query": "SELECT offer_id, title, clicks FROM product_performance_view WHERE date BETWEEN '2026-01-01' AND '2026-01-31'"
}
```
### List Promotions
```bash
GET /google-merchant/promotions/v1/accounts/{accountId}/promotions
```
### Get Account
```bash
GET /google-merchant/accounts/v1/accounts/{accountId}
```
### List Local Inventories
```bash
GET /google-merchant/inventories/v1/accounts/{accountId}/products/{productId}/localInventories
```
## Notes
- Authentication is automatic - the router injects the OAuth token
- Account ID is your Merchant Center numeric ID (visible in MC URL)
- Product IDs use format `contentLanguage~feedLabel~offerId`
- Monetary values use micros (divide by 1,000,000)
- Products can only be inserted in data sources of type `API`
- Uses token-based pagination with `pageSize` and `pageToken`
## Resources
- [Merchant API Overview](https://developers.google.com/merchant/api/overview)
- [Merchant API Reference](https://developers.google.com/merchant/api/reference/rest)
- [Products Guide](https://developers.google.com/merchant/api/guides/products/overview)
- [Reports Guide](https://developers.google.com/merchant/api/guides/reports)

View File

@@ -0,0 +1,147 @@
# Google Play Routing Reference
**App name:** `google-play`
**Base URL proxied:** `androidpublisher.googleapis.com`
## API Path Pattern
```
/google-play/androidpublisher/v3/applications/{packageName}/{resource}
```
## Common Endpoints
### In-App Products
#### List In-App Products
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/inappproducts
```
#### Get In-App Product
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}
```
#### Create In-App Product
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/inappproducts
Content-Type: application/json
{
"packageName": "com.example.app",
"sku": "premium_upgrade",
"status": "active",
"purchaseType": "managedUser",
"defaultPrice": {
"priceMicros": "990000",
"currency": "USD"
},
"listings": {
"en-US": {
"title": "Premium Upgrade",
"description": "Unlock all premium features"
}
}
}
```
#### Delete In-App Product
```bash
DELETE /google-play/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}
```
### Subscriptions
#### List Subscriptions
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/subscriptions
```
#### Get Subscription
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}
```
### Purchases
#### Get Product Purchase
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}
```
#### Acknowledge Purchase
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:acknowledge
Content-Type: application/json
{
"developerPayload": "optional payload"
}
```
#### Get Subscription Purchase
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}
```
#### Cancel Subscription
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel
```
### Reviews
#### List Reviews
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/reviews
```
#### Get Review
```bash
GET /google-play/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}
```
#### Reply to Review
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}:reply
Content-Type: application/json
{
"replyText": "Thank you for your feedback!"
}
```
### Edits (App Updates)
#### Create Edit
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/edits
```
#### Commit Edit
```bash
POST /google-play/androidpublisher/v3/applications/{packageName}/edits/{editId}:commit
```
#### Delete Edit
```bash
DELETE /google-play/androidpublisher/v3/applications/{packageName}/edits/{editId}
```
## Notes
- Replace `{packageName}` with your app's package name (e.g., `com.example.app`)
- The Google Play Developer API requires the app to be published on Google Play
- Subscription management requires the app to have active subscriptions configured
- Edits are transactional - create an edit, make changes, then commit
- Prices are in micros (1,000,000 micros = 1 unit of currency)
## Resources
- [Android Publisher API Overview](https://developers.google.com/android-publisher)
- [In-App Products](https://developers.google.com/android-publisher/api-ref/rest/v3/inappproducts)
- [Subscriptions](https://developers.google.com/android-publisher/api-ref/rest/v3/monetization.subscriptions)
- [Purchases](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products)
- [Reviews](https://developers.google.com/android-publisher/api-ref/rest/v3/reviews)
- [Edits](https://developers.google.com/android-publisher/api-ref/rest/v3/edits)

View File

@@ -0,0 +1,189 @@
# Google Search Console Routing Reference
**App name:** `google-search-console`
**Base URL proxied:** `www.googleapis.com`
## API Path Pattern
```
/google-search-console/webmasters/v3/{endpoint}
```
## Common Endpoints
### List Sites
```bash
GET /google-search-console/webmasters/v3/sites
```
### Get Site
```bash
GET /google-search-console/webmasters/v3/sites/{siteUrl}
```
Note: Site URL must be URL-encoded (e.g., `https%3A%2F%2Fexample.com%2F`)
### Search Analytics Query
```bash
POST /google-search-console/webmasters/v3/sites/{siteUrl}/searchAnalytics/query
Content-Type: application/json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["query"],
"rowLimit": 100
}
```
### List Sitemaps
```bash
GET /google-search-console/webmasters/v3/sites/{siteUrl}/sitemaps
```
### Get Sitemap
```bash
GET /google-search-console/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}
```
### Submit Sitemap
```bash
PUT /google-search-console/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}
```
### Delete Sitemap
```bash
DELETE /google-search-console/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}
```
## Search Analytics Query Examples
### Top Queries
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["query"],
"rowLimit": 25,
"startRow": 0
}
```
### Top Pages
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["page"],
"rowLimit": 25
}
```
### Queries by Country
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["query", "country"],
"rowLimit": 100
}
```
### Device Breakdown
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["device"],
"rowLimit": 10
}
```
### Daily Performance
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["date"],
"rowLimit": 31
}
```
### Filtered Query
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["query"],
"dimensionFilterGroups": [{
"filters": [{
"dimension": "query",
"operator": "contains",
"expression": "keyword"
}]
}],
"rowLimit": 100
}
```
### Search Type Filter
```json
{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"dimensions": ["query"],
"type": "image",
"rowLimit": 25
}
```
## Dimensions
- `query` - Search query
- `page` - Page URL
- `country` - Country code (ISO 3166-1 alpha-3)
- `device` - DESKTOP, MOBILE, TABLET
- `date` - Date in YYYY-MM-DD format
- `searchAppearance` - Rich result types
## Metrics (returned automatically)
- `clicks` - Number of clicks
- `impressions` - Number of impressions
- `ctr` - Click-through rate
- `position` - Average position
## Filter Operators
- `equals`
- `contains`
- `notContains`
- `includingRegex`
- `excludingRegex`
## Search Types
- `web` - Web search (default)
- `image` - Image search
- `video` - Video search
- `news` - News search
## Notes
- Authentication is automatic - the router injects the OAuth token
- Site URLs must be URL-encoded in the path (e.g., `sc-domain%3Aexample.com`)
- Date range is limited to 16 months of data
- Maximum 25,000 rows per request
- Use `startRow` for pagination
- Data has a 2-3 day delay
## Resources
- [API Reference](https://developers.google.com/webmaster-tools/v1/api_reference_index)
- [List Sites](https://developers.google.com/webmaster-tools/v1/sites/list)
- [Get Site](https://developers.google.com/webmaster-tools/v1/sites/get)
- [Search Analytics Query](https://developers.google.com/webmaster-tools/v1/searchanalytics/query)
- [List Sitemaps](https://developers.google.com/webmaster-tools/v1/sitemaps/list)
- [Get Sitemap](https://developers.google.com/webmaster-tools/v1/sitemaps/get)
- [Submit Sitemap](https://developers.google.com/webmaster-tools/v1/sitemaps/submit)
- [Delete Sitemap](https://developers.google.com/webmaster-tools/v1/sitemaps/delete)

View File

@@ -0,0 +1,240 @@
# Google Sheets Routing Reference
**App name:** `google-sheets`
**Base URL proxied:** `sheets.googleapis.com`
## API Path Pattern
```
/google-sheets/v4/spreadsheets/{spreadsheetId}/{endpoint}
```
## Common Endpoints
### Get Spreadsheet Metadata
```bash
GET /google-sheets/v4/spreadsheets/{spreadsheetId}
```
### Get Values
```bash
GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}
```
Example:
```bash
GET /google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:D10
```
### Get Multiple Ranges
```bash
GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values:batchGet?ranges=Sheet1!A1:B10&ranges=Sheet2!A1:C5
```
### Update Values
```bash
PUT /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}?valueInputOption=USER_ENTERED
Content-Type: application/json
{
"values": [
["A1", "B1", "C1"],
["A2", "B2", "C2"]
]
}
```
### Append Values
```bash
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}:append?valueInputOption=USER_ENTERED
Content-Type: application/json
{
"values": [
["New Row 1", "Data", "More Data"],
["New Row 2", "Data", "More Data"]
]
}
```
### Batch Update Values
```bash
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values:batchUpdate
Content-Type: application/json
{
"valueInputOption": "USER_ENTERED",
"data": [
{"range": "Sheet1!A1:B2", "values": [["A1", "B1"], ["A2", "B2"]]},
{"range": "Sheet1!D1:E2", "values": [["D1", "E1"], ["D2", "E2"]]}
]
}
```
### Clear Values
```bash
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}:clear
```
### Create Spreadsheet
```bash
POST /google-sheets/v4/spreadsheets
Content-Type: application/json
{
"properties": {"title": "New Spreadsheet"},
"sheets": [{"properties": {"title": "Sheet1"}}]
}
```
### Batch Update (formatting, add sheets, etc.)
```bash
POST /google-sheets/v4/spreadsheets/{spreadsheetId}:batchUpdate
Content-Type: application/json
{
"requests": [
{"addSheet": {"properties": {"title": "New Sheet"}}}
]
}
```
## Common batchUpdate Requests
See [full list of request types](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/request).
### Update Cells with Formatting
```json
{
"updateCells": {
"rows": [
{"values": [{"userEnteredValue": {"stringValue": "Name"}}, {"userEnteredValue": {"numberValue": 100}}]}
],
"fields": "userEnteredValue",
"start": {"sheetId": 0, "rowIndex": 0, "columnIndex": 0}
}
}
```
### Format Header Row (Bold + Background Color)
```json
{
"repeatCell": {
"range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 3},
"cell": {
"userEnteredFormat": {
"backgroundColor": {"red": 0.2, "green": 0.6, "blue": 0.9},
"textFormat": {"bold": true}
}
},
"fields": "userEnteredFormat(backgroundColor,textFormat)"
}
}
```
### Auto-Resize Columns
```json
{
"autoResizeDimensions": {
"dimensions": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 0, "endIndex": 3}
}
}
```
### Rename Sheet
```json
{
"updateSheetProperties": {
"properties": {"sheetId": 0, "title": "NewName"},
"fields": "title"
}
}
```
### Insert Rows/Columns
```json
{
"insertDimension": {
"range": {"sheetId": 0, "dimension": "ROWS", "startIndex": 1, "endIndex": 3},
"inheritFromBefore": true
}
}
```
### Sort Range
```json
{
"sortRange": {
"range": {"sheetId": 0, "startRowIndex": 1, "endRowIndex": 10, "startColumnIndex": 0, "endColumnIndex": 3},
"sortSpecs": [{"dimensionIndex": 1, "sortOrder": "DESCENDING"}]
}
}
```
### Add Conditional Formatting
```json
{
"addConditionalFormatRule": {
"rule": {
"ranges": [{"sheetId": 0, "startRowIndex": 1, "endRowIndex": 10, "startColumnIndex": 1, "endColumnIndex": 2}],
"booleanRule": {
"condition": {"type": "NUMBER_GREATER_THAN_EQ", "values": [{"userEnteredValue": "90"}]},
"format": {"backgroundColor": {"red": 0.7, "green": 1, "blue": 0.7}}
}
},
"index": 0
}
}
```
### Add Filter
```json
{
"setBasicFilter": {
"filter": {
"range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 100, "startColumnIndex": 0, "endColumnIndex": 5}
}
}
}
```
### Delete Sheet
```json
{
"deleteSheet": {"sheetId": 123456789}
}
```
## Value Input Options
- `RAW` - Values are stored as-is
- `USER_ENTERED` - Values are parsed as if typed into the UI (formulas executed, numbers parsed)
## Range Notation
- `Sheet1!A1:D10` - Specific range
- `Sheet1!A:D` - Entire columns A through D
- `Sheet1!1:10` - Entire rows 1 through 10
- `Sheet1` - Entire sheet
- `A1:D10` - Range in first sheet
## Notes
- Authentication is automatic - the router injects the OAuth token
- Range in URL path must be URL-encoded (`!``%21`, `:``%3A`)
- Use `valueInputOption=USER_ENTERED` to parse formulas and numbers
- Delete spreadsheets via Google Drive API
## Resources
- [API Overview](https://developers.google.com/workspace/sheets/api/reference/rest)
- [Get Spreadsheet](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/get)
- [Create Spreadsheet](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/create)
- [Batch Update](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/batchUpdate)
- [Batch Update Request Types](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/request)
- [Get Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/get)
- [Update Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/update)
- [Append Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/append)
- [Batch Get Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/batchGet)
- [Batch Update Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate)
- [Clear Values](https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/clear)

View File

@@ -0,0 +1,215 @@
# Google Slides Routing Reference
**App name:** `google-slides`
**Base URL proxied:** `slides.googleapis.com`
## API Path Pattern
```
/google-slides/v1/presentations/{presentationId}
```
## Common Endpoints
### Create Presentation
```bash
POST /google-slides/v1/presentations
Content-Type: application/json
{
"title": "My Presentation"
}
```
### Get Presentation
```bash
GET /google-slides/v1/presentations/{presentationId}
```
### Get Page (Slide)
```bash
GET /google-slides/v1/presentations/{presentationId}/pages/{pageId}
```
### Get Page Thumbnail
```bash
GET /google-slides/v1/presentations/{presentationId}/pages/{pageId}/thumbnail
```
### Batch Update (All Modifications)
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [...]
}
```
### Create Slide
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createSlide": {
"objectId": "slide_001",
"slideLayoutReference": {
"predefinedLayout": "TITLE_AND_BODY"
}
}
}
]
}
```
Predefined layouts: `BLANK`, `TITLE`, `TITLE_AND_BODY`, `TITLE_AND_TWO_COLUMNS`, `TITLE_ONLY`, `SECTION_HEADER`, `ONE_COLUMN_TEXT`, `MAIN_POINT`, `BIG_NUMBER`
### Insert Text
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"insertText": {
"objectId": "{shapeId}",
"text": "Hello, World!",
"insertionIndex": 0
}
}
]
}
```
### Create Shape (Text Box)
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createShape": {
"objectId": "shape_001",
"shapeType": "TEXT_BOX",
"elementProperties": {
"pageObjectId": "{slideId}",
"size": {
"width": {"magnitude": 300, "unit": "PT"},
"height": {"magnitude": 100, "unit": "PT"}
},
"transform": {
"scaleX": 1,
"scaleY": 1,
"translateX": 100,
"translateY": 100,
"unit": "PT"
}
}
}
}
]
}
```
### Create Image
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createImage": {
"objectId": "image_001",
"url": "https://example.com/image.png",
"elementProperties": {
"pageObjectId": "{slideId}",
"size": {
"width": {"magnitude": 200, "unit": "PT"},
"height": {"magnitude": 200, "unit": "PT"}
}
}
}
}
]
}
```
### Delete Object
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"deleteObject": {
"objectId": "{objectId}"
}
}
]
}
```
### Replace All Text (Template Substitution)
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"replaceAllText": {
"containsText": {
"text": "{{placeholder}}",
"matchCase": true
},
"replaceText": "Actual Value"
}
}
]
}
```
### Update Text Style
```bash
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"updateTextStyle": {
"objectId": "{shapeId}",
"textRange": {"type": "ALL"},
"style": {
"bold": true,
"fontSize": {"magnitude": 24, "unit": "PT"}
},
"fields": "bold,fontSize"
}
}
]
}
```
## Notes
- Object IDs must be unique within a presentation
- Use batchUpdate for all modifications (adding slides, text, shapes, etc.)
- Multiple requests in a batchUpdate are applied atomically
- Sizes and positions use PT (points) as the unit (72 points = 1 inch)
- Use `replaceAllText` for template-based presentation generation
## Resources
- [Slides API Overview](https://developers.google.com/slides/api/reference/rest)
- [Presentations](https://developers.google.com/slides/api/reference/rest/v1/presentations)
- [Pages](https://developers.google.com/slides/api/reference/rest/v1/presentations.pages)
- [BatchUpdate Requests](https://developers.google.com/slides/api/reference/rest/v1/presentations/batchUpdate)
- [Page Layouts](https://developers.google.com/slides/api/reference/rest/v1/presentations/create#predefinedlayout)

View File

@@ -0,0 +1,156 @@
# Google Tasks Routing Reference
**App name:** `google-tasks`
**Base URL proxied:** `tasks.googleapis.com`
## API Path Pattern
```
/google-tasks/tasks/v1/{endpoint}
```
## Common Endpoints
### Task Lists
#### List Task Lists
```bash
GET /google-tasks/tasks/v1/users/@me/lists
```
With pagination:
```bash
GET /google-tasks/tasks/v1/users/@me/lists?maxResults=20
```
#### Get Task List
```bash
GET /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
```
#### Create Task List
```bash
POST /google-tasks/tasks/v1/users/@me/lists
Content-Type: application/json
{
"title": "New Task List"
}
```
#### Update Task List
```bash
PATCH /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Content-Type: application/json
{
"title": "Updated Title"
}
```
#### Delete Task List
```bash
DELETE /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
```
### Tasks
#### List Tasks
```bash
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks
```
With filters:
```bash
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks?showCompleted=true&showHidden=true&maxResults=50
```
With date filters:
```bash
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks?dueMin=2026-01-01T00:00:00Z&dueMax=2026-12-31T23:59:59Z
```
#### Get Task
```bash
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
```
#### Create Task
```bash
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks
Content-Type: application/json
{
"title": "New Task",
"notes": "Task description",
"due": "2026-03-01T00:00:00.000Z"
}
```
Create subtask:
```bash
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks?parent={parentTaskId}
Content-Type: application/json
{
"title": "Subtask"
}
```
#### Update Task (partial)
```bash
PATCH /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Updated Title",
"status": "completed"
}
```
#### Update Task (full replace)
```bash
PUT /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Replaced Task",
"notes": "New notes",
"status": "needsAction"
}
```
#### Delete Task
```bash
DELETE /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
```
#### Move Task
```bash
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}/move?previous={previousTaskId}
```
Make subtask:
```bash
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}/move?parent={parentTaskId}
```
#### Clear Completed Tasks
```bash
POST /google-tasks/tasks/v1/lists/{tasklistId}/clear
```
## Notes
- Authentication is automatic - the router injects the OAuth token
- Task list and task IDs are opaque base64-encoded strings
- Status values: "needsAction" or "completed"
- Dates must be in RFC 3339 format (e.g., `2026-01-15T00:00:00.000Z`)
- Maximum title length: 1024 characters
- Maximum notes length: 8192 characters
## Resources
- [Google Tasks API Overview](https://developers.google.com/workspace/tasks)
- [Tasks Reference](https://developers.google.com/workspace/tasks/reference/rest/v1/tasks)
- [TaskLists Reference](https://developers.google.com/workspace/tasks/reference/rest/v1/tasklists)

View File

@@ -0,0 +1,236 @@
# Google Workspace Admin Routing Reference
**App name:** `google-workspace-admin`
**Base URL proxied:** `admin.googleapis.com`
## API Path Pattern
```
/google-workspace-admin/admin/directory/v1/{endpoint}
```
## Common Endpoints
### Users
#### List Users
```bash
GET /google-workspace-admin/admin/directory/v1/users?customer=my_customer&maxResults=100
```
With search query:
```bash
GET /google-workspace-admin/admin/directory/v1/users?customer=my_customer&query=email:john*
```
#### Get User
```bash
GET /google-workspace-admin/admin/directory/v1/users/{userKey}
```
`userKey` can be the user's primary email or unique user ID.
#### Create User
```bash
POST /google-workspace-admin/admin/directory/v1/users
Content-Type: application/json
{
"primaryEmail": "newuser@example.com",
"name": {
"givenName": "Jane",
"familyName": "Smith"
},
"password": "temporaryPassword123!",
"changePasswordAtNextLogin": true,
"orgUnitPath": "/Engineering"
}
```
#### Update User
```bash
PUT /google-workspace-admin/admin/directory/v1/users/{userKey}
Content-Type: application/json
{
"name": {
"givenName": "Jane",
"familyName": "Smith-Johnson"
},
"suspended": false
}
```
#### Patch User (partial update)
```bash
PATCH /google-workspace-admin/admin/directory/v1/users/{userKey}
Content-Type: application/json
{
"suspended": true
}
```
#### Delete User
```bash
DELETE /google-workspace-admin/admin/directory/v1/users/{userKey}
```
#### Make User Admin
```bash
POST /google-workspace-admin/admin/directory/v1/users/{userKey}/makeAdmin
Content-Type: application/json
{
"status": true
}
```
### Groups
#### List Groups
```bash
GET /google-workspace-admin/admin/directory/v1/groups?customer=my_customer
```
#### Get Group
```bash
GET /google-workspace-admin/admin/directory/v1/groups/{groupKey}
```
#### Create Group
```bash
POST /google-workspace-admin/admin/directory/v1/groups
Content-Type: application/json
{
"email": "engineering@example.com",
"name": "Engineering Team",
"description": "All engineering staff"
}
```
#### Update Group
```bash
PUT /google-workspace-admin/admin/directory/v1/groups/{groupKey}
Content-Type: application/json
{
"name": "Engineering Department",
"description": "Updated description"
}
```
#### Delete Group
```bash
DELETE /google-workspace-admin/admin/directory/v1/groups/{groupKey}
```
### Group Members
#### List Members
```bash
GET /google-workspace-admin/admin/directory/v1/groups/{groupKey}/members
```
#### Add Member
```bash
POST /google-workspace-admin/admin/directory/v1/groups/{groupKey}/members
Content-Type: application/json
{
"email": "user@example.com",
"role": "MEMBER"
}
```
Roles: `OWNER`, `MANAGER`, `MEMBER`
#### Update Member Role
```bash
PATCH /google-workspace-admin/admin/directory/v1/groups/{groupKey}/members/{memberKey}
Content-Type: application/json
{
"role": "MANAGER"
}
```
#### Remove Member
```bash
DELETE /google-workspace-admin/admin/directory/v1/groups/{groupKey}/members/{memberKey}
```
### Organizational Units
#### List Org Units
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/orgunits
```
#### Get Org Unit
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/orgunits/{orgUnitPath}
```
#### Create Org Unit
```bash
POST /google-workspace-admin/admin/directory/v1/customer/my_customer/orgunits
Content-Type: application/json
{
"name": "Engineering",
"parentOrgUnitPath": "/",
"description": "Engineering department"
}
```
#### Delete Org Unit
```bash
DELETE /google-workspace-admin/admin/directory/v1/customer/my_customer/orgunits/{orgUnitPath}
```
### Domains
#### List Domains
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/domains
```
#### Get Domain
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/domains/{domainName}
```
### Roles
#### List Roles
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/roles
```
#### List Role Assignments
```bash
GET /google-workspace-admin/admin/directory/v1/customer/my_customer/roleassignments
```
#### Create Role Assignment
```bash
POST /google-workspace-admin/admin/directory/v1/customer/my_customer/roleassignments
Content-Type: application/json
{
"roleId": "123456789",
"assignedTo": "user_id",
"scopeType": "CUSTOMER"
}
```
## Notes
- Use `my_customer` as the customer ID for your own domain
- User keys can be primary email or unique user ID
- Group keys can be group email or unique group ID
- Org unit paths start with `/` (e.g., `/Engineering/Frontend`)
- Admin privileges are required for most operations
- Password must meet Google's complexity requirements

View File

@@ -0,0 +1,147 @@
# Gumroad Routing Reference
**App name:** `gumroad`
**Base URL proxied:** `api.gumroad.com`
## API Path Pattern
```
/gumroad/v2/{resource}
```
## Common Endpoints
### Get Current User
```bash
GET /gumroad/v2/user
```
### List Products
```bash
GET /gumroad/v2/products
```
### Get Product
```bash
GET /gumroad/v2/products/{product_id}
```
### Update Product
```bash
PUT /gumroad/v2/products/{product_id}
Content-Type: application/x-www-form-urlencoded
name=Updated%20Name
```
### Delete Product
```bash
DELETE /gumroad/v2/products/{product_id}
```
### List Sales
```bash
GET /gumroad/v2/sales
GET /gumroad/v2/sales?after=2026-01-01&before=2026-12-31
```
### Get Sale
```bash
GET /gumroad/v2/sales/{sale_id}
```
### List Subscribers
```bash
GET /gumroad/v2/products/{product_id}/subscribers
```
### Get Subscriber
```bash
GET /gumroad/v2/subscribers/{subscriber_id}
```
### Verify License
```bash
POST /gumroad/v2/licenses/verify
Content-Type: application/x-www-form-urlencoded
product_id={product_id}&license_key={license_key}
```
### Enable/Disable License
```bash
PUT /gumroad/v2/licenses/enable
PUT /gumroad/v2/licenses/disable
```
### List Resource Subscriptions (Webhooks)
```bash
GET /gumroad/v2/resource_subscriptions?resource_name=sale
```
Resource names: `sale`, `refund`, `dispute`, `dispute_won`, `cancellation`, `subscription_updated`, `subscription_ended`, `subscription_restarted`
### Create Resource Subscription
```bash
PUT /gumroad/v2/resource_subscriptions
Content-Type: application/x-www-form-urlencoded
resource_name=sale&post_url=https://example.com/webhook
```
### Delete Resource Subscription
```bash
DELETE /gumroad/v2/resource_subscriptions/{resource_subscription_id}
```
### Offer Codes
```bash
GET /gumroad/v2/products/{product_id}/offer_codes
POST /gumroad/v2/products/{product_id}/offer_codes
PUT /gumroad/v2/products/{product_id}/offer_codes/{offer_code_id}
DELETE /gumroad/v2/products/{product_id}/offer_codes/{offer_code_id}
```
### Variant Categories
```bash
GET /gumroad/v2/products/{product_id}/variant_categories
POST /gumroad/v2/products/{product_id}/variant_categories
DELETE /gumroad/v2/products/{product_id}/variant_categories/{variant_category_id}
```
### Variants
```bash
GET /gumroad/v2/products/{product_id}/variant_categories/{variant_category_id}/variants
POST /gumroad/v2/products/{product_id}/variant_categories/{variant_category_id}/variants
PUT /gumroad/v2/products/{product_id}/variant_categories/{variant_category_id}/variants/{variant_id}
DELETE /gumroad/v2/products/{product_id}/variant_categories/{variant_category_id}/variants/{variant_id}
```
### Custom Fields
```bash
GET /gumroad/v2/products/{product_id}/custom_fields
POST /gumroad/v2/products/{product_id}/custom_fields
PUT /gumroad/v2/products/{product_id}/custom_fields/{name}
DELETE /gumroad/v2/products/{product_id}/custom_fields/{name}
```
## Pagination
Page-based pagination:
```bash
GET /gumroad/v2/sales?page=1
GET /gumroad/v2/sales?page=2
```
## Notes
- All responses include `success` boolean field
- Product creation not available via API
- POST/PUT use `application/x-www-form-urlencoded` (not JSON)
- Prices in cents (500 = $5.00)
- License keys are case-insensitive
## Resources
- [Gumroad API Documentation](https://gumroad.com/api)
- [Create API Application](https://help.gumroad.com/article/280-create-application-api)

View File

@@ -0,0 +1,357 @@
# HubSpot Routing Reference
**App name:** `hubspot`
**Base URL proxied:** `api.hubapi.com`
## API Path Pattern
```
/hubspot/crm/v3/objects/{objectType}/{endpoint}
```
## Common Endpoints
### Contacts
#### List Contacts
```bash
GET /hubspot/crm/v3/objects/contacts?limit=100
```
With properties:
```bash
GET /hubspot/crm/v3/objects/contacts?limit=100&properties=email,firstname,lastname,phone
```
With pagination:
```bash
GET /hubspot/crm/v3/objects/contacts?limit=100&properties=email,firstname&after={cursor}
```
#### Get Contact
```bash
GET /hubspot/crm/v3/objects/contacts/{contactId}?properties=email,firstname,lastname
```
#### Create Contact
```bash
POST /hubspot/crm/v3/objects/contacts
Content-Type: application/json
{
"properties": {
"email": "john@example.com",
"firstname": "John",
"lastname": "Doe",
"phone": "+1234567890"
}
}
```
#### Update Contact
```bash
PATCH /hubspot/crm/v3/objects/contacts/{contactId}
Content-Type: application/json
{
"properties": {
"phone": "+0987654321"
}
}
```
#### Delete Contact
```bash
DELETE /hubspot/crm/v3/objects/contacts/{contactId}
```
#### Search Contacts
```bash
POST /hubspot/crm/v3/objects/contacts/search
Content-Type: application/json
{
"filterGroups": [{
"filters": [{
"propertyName": "email",
"operator": "EQ",
"value": "john@example.com"
}]
}],
"properties": ["email", "firstname", "lastname"]
}
```
### Companies
#### List Companies
```bash
GET /hubspot/crm/v3/objects/companies?limit=100&properties=name,domain,industry
```
#### Get Company
```bash
GET /hubspot/crm/v3/objects/companies/{companyId}?properties=name,domain,industry
```
#### Create Company
```bash
POST /hubspot/crm/v3/objects/companies
Content-Type: application/json
{
"properties": {
"name": "Acme Corp",
"domain": "acme.com",
"industry": "COMPUTER_SOFTWARE"
}
}
```
**Note:** The `industry` property requires specific enum values (e.g., `COMPUTER_SOFTWARE`, `FINANCE`, `HEALTHCARE`), not free text like "Technology". Use the List Properties endpoint to get valid values.
#### Update Company
```bash
PATCH /hubspot/crm/v3/objects/companies/{companyId}
Content-Type: application/json
{
"properties": {
"industry": "COMPUTER_SOFTWARE",
"numberofemployees": "50"
}
}
```
#### Delete Company
```bash
DELETE /hubspot/crm/v3/objects/companies/{companyId}
```
#### Search Companies
```bash
POST /hubspot/crm/v3/objects/companies/search
Content-Type: application/json
{
"filterGroups": [{
"filters": [{
"propertyName": "domain",
"operator": "CONTAINS_TOKEN",
"value": "*"
}]
}],
"properties": ["name", "domain"],
"limit": 10
}
```
### Deals
#### List Deals
```bash
GET /hubspot/crm/v3/objects/deals?limit=100&properties=dealname,amount,dealstage
```
#### Get Deal
```bash
GET /hubspot/crm/v3/objects/deals/{dealId}?properties=dealname,amount,dealstage
```
#### Create Deal
```bash
POST /hubspot/crm/v3/objects/deals
Content-Type: application/json
{
"properties": {
"dealname": "New Deal",
"amount": "10000",
"dealstage": "appointmentscheduled"
}
}
```
#### Update Deal
```bash
PATCH /hubspot/crm/v3/objects/deals/{dealId}
Content-Type: application/json
{
"properties": {
"amount": "15000",
"dealstage": "qualifiedtobuy"
}
}
```
#### Delete Deal
```bash
DELETE /hubspot/crm/v3/objects/deals/{dealId}
```
#### Search Deals
```bash
POST /hubspot/crm/v3/objects/deals/search
Content-Type: application/json
{
"filterGroups": [{
"filters": [{
"propertyName": "amount",
"operator": "GTE",
"value": "1000"
}]
}],
"properties": ["dealname", "amount", "dealstage"],
"limit": 10
}
```
### Associations (v4 API)
#### Associate Objects
```bash
PUT /hubspot/crm/v4/objects/{fromObjectType}/{fromObjectId}/associations/{toObjectType}/{toObjectId}
Content-Type: application/json
[{"associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 279}]
```
Common association type IDs:
- `279` - Contact to Company
- `3` - Deal to Contact
- `341` - Deal to Company
#### List Associations
```bash
GET /hubspot/crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}
```
### Batch Operations
#### Batch Read
```bash
POST /hubspot/crm/v3/objects/{objectType}/batch/read
Content-Type: application/json
{
"properties": ["email", "firstname"],
"inputs": [{"id": "123"}, {"id": "456"}]
}
```
#### Batch Create
```bash
POST /hubspot/crm/v3/objects/{objectType}/batch/create
Content-Type: application/json
{
"inputs": [
{"properties": {"email": "one@example.com", "firstname": "One"}},
{"properties": {"email": "two@example.com", "firstname": "Two"}}
]
}
```
#### Batch Update
```bash
POST /hubspot/crm/v3/objects/{objectType}/batch/update
Content-Type: application/json
{
"inputs": [
{"id": "123", "properties": {"firstname": "Updated"}},
{"id": "456", "properties": {"firstname": "Also Updated"}}
]
}
```
#### Batch Archive
```bash
POST /hubspot/crm/v3/objects/{objectType}/batch/archive
Content-Type: application/json
{
"inputs": [{"id": "123"}, {"id": "456"}]
}
```
### Properties
#### List Properties
```bash
GET /hubspot/crm/v3/properties/{objectType}
```
## Search Operators
- `EQ` - Equal to
- `NEQ` - Not equal to
- `LT` - Less than
- `LTE` - Less than or equal to
- `GT` - Greater than
- `GTE` - Greater than or equal to
- `CONTAINS_TOKEN` - Contains token
- `NOT_CONTAINS_TOKEN` - Does not contain token
## Pagination
List endpoints return a `paging.next.after` cursor for pagination:
```json
{
"results": [...],
"paging": {
"next": {
"after": "12345",
"link": "https://api.hubapi.com/..."
}
}
}
```
Use the `after` query parameter to fetch the next page:
```bash
GET /hubspot/crm/v3/objects/contacts?limit=100&after=12345
```
## Notes
- Authentication is automatic - the router injects the OAuth token
- The `industry` property on companies requires specific enum values
- Batch operations support up to 100 records per request
- Archive/Delete is a soft delete - records can be restored within 90 days
- Delete endpoints return HTTP 204 (No Content) on success
## Resources
- [API Overview](https://developers.hubspot.com/docs/api/overview)
- [List Contacts](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/get-crm-v3-objects-contacts.md)
- [Get Contact](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/get-crm-v3-objects-contacts-contactId.md)
- [Create Contact](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/post-crm-v3-objects-contacts.md)
- [Update Contact](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/patch-crm-v3-objects-contacts-contactId.md)
- [Archive Contact](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/delete-crm-v3-objects-contacts-contactId.md)
- [Merge Contacts](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/post-crm-v3-objects-contacts-merge.md)
- [GDPR Delete Contact](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/basic/post-crm-v3-objects-contacts-gdpr-delete.md)
- [Search Contacts](https://developers.hubspot.com/docs/api-reference/crm-contacts-v3/search/post-crm-v3-objects-contacts-search.md)
- [List Companies](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/get-crm-v3-objects-companies.md)
- [Get Company](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/get-crm-v3-objects-companies-companyId.md)
- [Create Company](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/post-crm-v3-objects-companies.md)
- [Update Company](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/patch-crm-v3-objects-companies-companyId.md)
- [Archive Company](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/delete-crm-v3-objects-companies-companyId.md)
- [Merge Companies](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/basic/post-crm-v3-objects-companies-merge.md)
- [Search Companies](https://developers.hubspot.com/docs/api-reference/crm-companies-v3/search/post-crm-v3-objects-companies-search.md)
- [List Deals](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/get-crm-v3-objects-0-3.md)
- [Get Deal](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/get-crm-v3-objects-0-3-dealId.md)
- [Create Deal](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/post-crm-v3-objects-0-3.md)
- [Update Deal](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/patch-crm-v3-objects-0-3-dealId.md)
- [Archive Deal](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/delete-crm-v3-objects-0-3-dealId.md)
- [Merge Deals](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/basic/post-crm-v3-objects-0-3-merge.md)
- [Search Deals](https://developers.hubspot.com/docs/api-reference/crm-deals-v3/search/post-crm-v3-objects-0-3-search.md)
- [List Associations](https://developers.hubspot.com/docs/api-reference/crm-associations-v4/basic/get-crm-v4-objects-objectType-objectId-associations-toObjectType.md)
- [Create Association](https://developers.hubspot.com/docs/api-reference/crm-associations-v4/basic/put-crm-v4-objects-objectType-objectId-associations-toObjectType-toObjectId.md)
- [Delete Association](https://developers.hubspot.com/docs/api-reference/crm-associations-v4/basic/delete-crm-v4-objects-objectType-objectId-associations-toObjectType-toObjectId.md)
- [List Properties](https://developers.hubspot.com/docs/api-reference/crm-properties-v3/core/get-crm-v3-properties-objectType.md)
- [Get Property](https://developers.hubspot.com/docs/api-reference/crm-properties-v3/core/get-crm-v3-properties-objectType-propertyName.md)
- [Create Property](https://developers.hubspot.com/docs/api-reference/crm-properties-v3/core/post-crm-v3-properties-objectType.md)
- [Search Reference](https://developers.hubspot.com/docs/api/crm/search)

View File

@@ -0,0 +1,181 @@
# Jira Routing Reference
**App name:** `jira`
**Base URL proxied:** `api.atlassian.com`
## Getting Cloud ID
Jira Cloud requires a cloud ID in the API path. First, get accessible resources:
```bash
GET /jira/oauth/token/accessible-resources
```
Response:
```json
[{
"id": "62909843-b784-4c35-b770-e4e2a26f024b",
"url": "https://yoursite.atlassian.net",
"name": "yoursite",
"scopes": ["read:jira-user", "read:jira-work", "write:jira-work"]
}]
```
## API Path Pattern
```
/jira/ex/jira/{cloudId}/rest/api/3/{endpoint}
```
## Common Endpoints
### List Projects
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/project
```
### Get Project
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/project/{projectKeyOrId}
```
### Search Issues (JQL)
Note: The old `/search` endpoint is deprecated. Use `/search/jql` with a bounded query.
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/search/jql?jql=project%3DKEY%20order%20by%20created%20DESC&maxResults=20&fields=summary,status,assignee,created,priority
```
### Get Issue
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}
```
### Create Issue
```bash
POST /jira/ex/jira/{cloudId}/rest/api/3/issue
Content-Type: application/json
{
"fields": {
"project": {"key": "PROJ"},
"summary": "Issue summary",
"issuetype": {"name": "Task"}
}
}
```
### Update Issue
```bash
PUT /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}
Content-Type: application/json
{
"fields": {
"summary": "Updated summary"
}
}
```
### Delete Issue
```bash
DELETE /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}
```
### Assign Issue
```bash
PUT /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/assignee
Content-Type: application/json
{
"accountId": "712020:5aff718e-6fe0-4548-82f4-f44ec481e5e7"
}
```
### Get Transitions
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions
```
### Transition Issue (change status)
```bash
POST /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions
Content-Type: application/json
{
"transition": {"id": "31"}
}
```
### Add Comment
```bash
POST /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment
Content-Type: application/json
{
"body": {
"type": "doc",
"version": 1,
"content": [{"type": "paragraph", "content": [{"type": "text", "text": "Comment text"}]}]
}
}
```
### Get Comments
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment
```
### Users
#### Get Current User
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/myself
```
#### Search Users
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/user/search?query=john
```
### Metadata
#### List Issue Types
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/issuetype
```
#### List Priorities
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/priority
```
#### List Statuses
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/status
```
#### List Fields
```bash
GET /jira/ex/jira/{cloudId}/rest/api/3/field
```
## Notes
- Always fetch cloud ID first using `/oauth/token/accessible-resources`
- JQL queries must be bounded (e.g., `project=KEY`) - unbounded queries are rejected
- Use URL encoding for JQL query parameters
- Update, Delete, Transition, and Assign endpoints return HTTP 204 (No Content) on success
- Agile API (`/rest/agile/1.0/...`) requires additional OAuth scopes beyond the basic Jira scopes
## Resources
- [API Introduction](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/)
- [Search Issues (JQL)](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-rest-api-3-search-jql-get)
- [Get Issue](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-get)
- [Create Issue](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-post)
- [Update Issue](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-put)
- [Transition Issue](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-transitions-post)
- [Add Comment](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-post)
- [Get Projects](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-rest-api-3-project-get)
- [JQL Reference](https://support.atlassian.com/jira-service-management-cloud/docs/use-advanced-search-with-jira-query-language-jql/)

View File

@@ -0,0 +1,168 @@
# Jobber Routing Reference
**App name:** `jobber`
**Base URL proxied:** `api.getjobber.com/api/`
## API Type
Jobber uses a GraphQL API exclusively. All requests are POST requests to the `/graphql` endpoint.
## API Path Pattern
```
/jobber/graphql
```
All operations use POST with a JSON body containing the `query` field.
## Version Header
The gateway automatically injects the `X-JOBBER-GRAPHQL-VERSION` header (currently `2025-04-16`).
## Common Operations
### Get Account
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ account { id name } }"
}
```
### List Clients
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ clients(first: 20) { nodes { id name emails { address } phones { number } } pageInfo { hasNextPage endCursor } } }"
}
```
### Get Client
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "query($id: EncodedId!) { client(id: $id) { id name emails { address } } }",
"variables": { "id": "CLIENT_ID" }
}
```
### Create Client
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "mutation($input: ClientCreateInput!) { clientCreate(input: $input) { client { id name } userErrors { message path } } }",
"variables": {
"input": {
"firstName": "John",
"lastName": "Doe",
"emails": [{"address": "john@example.com"}]
}
}
}
```
### List Jobs
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ jobs(first: 20) { nodes { id title jobNumber jobStatus client { name } } pageInfo { hasNextPage endCursor } } }"
}
```
### Create Job
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "mutation($input: JobCreateInput!) { jobCreate(input: $input) { job { id jobNumber } userErrors { message path } } }",
"variables": {
"input": {
"clientId": "CLIENT_ID",
"title": "Service Job"
}
}
}
```
### List Invoices
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ invoices(first: 20) { nodes { id invoiceNumber total invoiceStatus } pageInfo { hasNextPage endCursor } } }"
}
```
### List Quotes
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ quotes(first: 20) { nodes { id quoteNumber title quoteStatus } pageInfo { hasNextPage endCursor } } }"
}
```
### List Properties
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ properties(first: 20) { nodes { id address { street city } client { name } } } }"
}
```
### List Users
```bash
POST /jobber/graphql
Content-Type: application/json
{
"query": "{ users(first: 50) { nodes { id name { full } email { raw } } } }"
}
```
## Pagination
Jobber uses Relay-style cursor-based pagination:
```bash
# First page
{
"query": "{ clients(first: 20) { nodes { id name } pageInfo { hasNextPage endCursor } } }"
}
# Next page
{
"query": "{ clients(first: 20, after: \"CURSOR\") { nodes { id name } pageInfo { hasNextPage endCursor } } }"
}
```
## Notes
- Jobber uses GraphQL exclusively (no REST API)
- Gateway injects version header automatically (`2025-04-16`)
- IDs use `EncodedId` type (base64 encoded) - pass as strings
- Field naming: `emails`/`phones` (arrays), `jobStatus`/`invoiceStatus`/`quoteStatus`
- Rate limits: 2,500 requests per 5 minutes, plus query cost limits (max 10,000 points)
- Old API versions supported for 12-18 months
- Available resources: Clients, Jobs, Invoices, Quotes, Requests, Properties, Users, Custom Fields
## Resources
- [Jobber Developer Documentation](https://developer.getjobber.com/docs/)
- [API Changelog](https://developer.getjobber.com/docs/changelog)
- [API Support](mailto:api-support@getjobber.com)

View File

@@ -0,0 +1,190 @@
# JotForm Routing Reference
**App name:** `jotform`
**Base URL proxied:** `api.jotform.com`
## API Path Pattern
```
/jotform/{endpoint}
```
## Common Endpoints
### User
#### Get User Info
```bash
GET /jotform/user
```
#### Get User Forms
```bash
GET /jotform/user/forms?limit=20&offset=0
```
#### Get User Submissions
```bash
GET /jotform/user/submissions?limit=20&offset=0
```
#### Get User Usage
```bash
GET /jotform/user/usage
```
#### Get User History
```bash
GET /jotform/user/history?limit=20
```
### Forms
#### Get Form
```bash
GET /jotform/form/{formId}
```
#### Get Form Questions
```bash
GET /jotform/form/{formId}/questions
```
#### Get Form Properties
```bash
GET /jotform/form/{formId}/properties
```
#### Get Form Submissions
```bash
GET /jotform/form/{formId}/submissions?limit=20&offset=0
```
With filter:
```bash
GET /jotform/form/{formId}/submissions?filter={"created_at:gt":"2024-01-01"}
```
#### Get Form Files
```bash
GET /jotform/form/{formId}/files
```
#### Create Form
```bash
POST /jotform/user/forms
Content-Type: application/json
{
"properties": {
"title": "Contact Form"
},
"questions": {
"1": {
"type": "control_textbox",
"text": "Name",
"name": "name"
},
"2": {
"type": "control_email",
"text": "Email",
"name": "email"
}
}
}
```
#### Delete Form
```bash
DELETE /jotform/form/{formId}
```
### Submissions
#### Get Submission
```bash
GET /jotform/submission/{submissionId}
```
#### Update Submission
```bash
POST /jotform/submission/{submissionId}
Content-Type: application/x-www-form-urlencoded
submission[3][first]=John&submission[3][last]=Doe
```
Note: Use question IDs from the form questions endpoint. The submission field format is `submission[questionId][subfield]=value`.
#### Delete Submission
```bash
DELETE /jotform/submission/{submissionId}
```
### Reports
#### Get Form Reports
```bash
GET /jotform/form/{formId}/reports
```
### Webhooks
#### Get Form Webhooks
```bash
GET /jotform/form/{formId}/webhooks
```
#### Create Webhook
```bash
POST /jotform/form/{formId}/webhooks
Content-Type: application/x-www-form-urlencoded
webhookURL=https://example.com/webhook
```
#### Delete Webhook
```bash
DELETE /jotform/form/{formId}/webhooks/{webhookIndex}
```
## Question Types
- `control_textbox` - Single line text
- `control_textarea` - Multi-line text
- `control_email` - Email
- `control_phone` - Phone number
- `control_dropdown` - Dropdown
- `control_radio` - Radio buttons
- `control_checkbox` - Checkboxes
- `control_datetime` - Date/time picker
- `control_fileupload` - File upload
- `control_signature` - Signature
## Filter Syntax
Filters use JSON format:
- `{"field:gt":"value"}` - Greater than
- `{"field:lt":"value"}` - Less than
- `{"field:eq":"value"}` - Equal to
- `{"field:ne":"value"}` - Not equal to
## Notes
- Authentication is automatic - the router injects the `APIKEY` header
- Form IDs are numeric
- Submissions include all answers as key-value pairs
- Use `orderby` parameter to sort results (e.g., `orderby=created_at`)
- Pagination uses `limit` and `offset` parameters
## Resources
- [API Overview](https://api.jotform.com/docs/)
- [Get User Info](https://api.jotform.com/docs/#user)
- [Get User Forms](https://api.jotform.com/docs/#user-forms)
- [Get User Submissions](https://api.jotform.com/docs/#user-submissions)
- [Get Form Details](https://api.jotform.com/docs/#form-id)
- [Get Form Questions](https://api.jotform.com/docs/#form-id-questions)
- [Get Form Submissions](https://api.jotform.com/docs/#form-id-submissions)
- [Get Submission](https://api.jotform.com/docs/#submission-id)
- [Webhooks](https://api.jotform.com/docs/#form-id-webhooks)

View File

@@ -0,0 +1,190 @@
# Keap Routing Reference
**App name:** `keap`
**Base URL proxied:** `api.infusionsoft.com/crm/rest`
## API Path Pattern
```
/keap/crm/rest/v2/{resource}
```
Note: The `/crm/rest` prefix is required in the path.
## Common Endpoints
### Get Current User
```bash
GET /keap/crm/rest/v2/oauth/connect/userinfo
```
### List Contacts
```bash
GET /keap/crm/rest/v2/contacts
```
Query parameters: `page_size`, `page_token`, `filter`, `order_by`, `fields`
### Get Contact
```bash
GET /keap/crm/rest/v2/contacts/{contact_id}
```
### Create Contact
```bash
POST /keap/crm/rest/v2/contacts
Content-Type: application/json
{
"given_name": "John",
"family_name": "Doe",
"email_addresses": [{"email": "john@example.com", "field": "EMAIL1"}]
}
```
### Update Contact
```bash
PATCH /keap/crm/rest/v2/contacts/{contact_id}
Content-Type: application/json
{
"given_name": "Jane"
}
```
### Delete Contact
```bash
DELETE /keap/crm/rest/v2/contacts/{contact_id}
```
### List Companies
```bash
GET /keap/crm/rest/v2/companies
```
### List Tags
```bash
GET /keap/crm/rest/v2/tags
```
### Apply Tags to Contacts
```bash
POST /keap/crm/rest/v2/tags/{tag_id}/contacts:applyTags
Content-Type: application/json
{
"contact_ids": ["1", "2", "3"]
}
```
### List Tasks
```bash
GET /keap/crm/rest/v2/tasks
```
### Create Task
```bash
POST /keap/crm/rest/v2/tasks
Content-Type: application/json
{
"title": "Follow up call",
"due_date": "2026-02-15T10:00:00Z",
"contact": {"id": "9"}
}
```
### List Opportunities
```bash
GET /keap/crm/rest/v2/opportunities
```
### List Orders
```bash
GET /keap/crm/rest/v2/orders
```
### List Products
```bash
GET /keap/crm/rest/v2/products
```
### List Campaigns
```bash
GET /keap/crm/rest/v2/campaigns
```
### Add Contacts to Campaign Sequence
```bash
POST /keap/crm/rest/v2/campaigns/{campaign_id}/sequences/{sequence_id}:addContacts
Content-Type: application/json
{
"contact_ids": ["1", "2"]
}
```
### List Emails
```bash
GET /keap/crm/rest/v2/emails
```
### Send Email
```bash
POST /keap/crm/rest/v2/emails:send
Content-Type: application/json
{
"contacts": [{"id": "9"}],
"subject": "Hello",
"html_content": "<p>Email body</p>"
}
```
### List Automations
```bash
GET /keap/crm/rest/v2/automations
```
### List Affiliates
```bash
GET /keap/crm/rest/v2/affiliates
```
### List Subscriptions
```bash
GET /keap/crm/rest/v2/subscriptions
```
## Pagination
Uses token-based pagination:
```bash
GET /keap/crm/rest/v2/contacts?page_size=50
GET /keap/crm/rest/v2/contacts?page_size=50&page_token=NEXT_TOKEN
```
Response includes `next_page_token` (empty when no more pages).
## Filtering
Use the `filter` parameter:
```bash
GET /keap/crm/rest/v2/contacts?filter=given_name==John
GET /keap/crm/rest/v2/tasks?filter=completed==false
```
## Notes
- API version is v2 (v1 is deprecated)
- Path must include `/crm/rest` prefix
- IDs are returned as strings
- Maximum `page_size` is 1000
- Timestamps use ISO 8601 format
## Resources
- [Keap Developer Portal](https://developer.infusionsoft.com/)
- [Keap REST API V2 Documentation](https://developer.infusionsoft.com/docs/restv2/)

View File

@@ -0,0 +1,221 @@
# Kit Routing Reference
**App name:** `kit`
**Base URL proxied:** `api.kit.com`
## API Path Pattern
```
/kit/v4/{resource}
```
## Common Endpoints
### List Subscribers
```bash
GET /kit/v4/subscribers
```
Query parameters:
- `per_page` - Results per page (default: 500, max: 1000)
- `after` - Cursor for next page
- `before` - Cursor for previous page
- `status` - Filter by: `active`, `inactive`, `bounced`, `complained`, `cancelled`, or `all`
- `email_address` - Filter by specific email
### Get Subscriber
```bash
GET /kit/v4/subscribers/{id}
```
### Create Subscriber
```bash
POST /kit/v4/subscribers
Content-Type: application/json
{
"email_address": "user@example.com",
"first_name": "John"
}
```
### Update Subscriber
```bash
PUT /kit/v4/subscribers/{id}
Content-Type: application/json
{
"first_name": "Updated Name"
}
```
### List Tags
```bash
GET /kit/v4/tags
```
### Create Tag
```bash
POST /kit/v4/tags
Content-Type: application/json
{
"name": "new-tag"
}
```
### Update Tag
```bash
PUT /kit/v4/tags/{id}
Content-Type: application/json
{
"name": "updated-tag-name"
}
```
### Delete Tag
```bash
DELETE /kit/v4/tags/{id}
```
### Tag a Subscriber
```bash
POST /kit/v4/tags/{tag_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
```
### Remove Tag from Subscriber
```bash
DELETE /kit/v4/tags/{tag_id}/subscribers/{subscriber_id}
```
### List Subscribers with Tag
```bash
GET /kit/v4/tags/{tag_id}/subscribers
```
### List Forms
```bash
GET /kit/v4/forms
```
### Add Subscriber to Form
```bash
POST /kit/v4/forms/{form_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
```
### List Form Subscribers
```bash
GET /kit/v4/forms/{form_id}/subscribers
```
### List Sequences
```bash
GET /kit/v4/sequences
```
### Add Subscriber to Sequence
```bash
POST /kit/v4/sequences/{sequence_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
```
### List Broadcasts
```bash
GET /kit/v4/broadcasts
```
### List Segments
```bash
GET /kit/v4/segments
```
### List Custom Fields
```bash
GET /kit/v4/custom_fields
```
### Create Custom Field
```bash
POST /kit/v4/custom_fields
Content-Type: application/json
{
"label": "Company"
}
```
### Update Custom Field
```bash
PUT /kit/v4/custom_fields/{id}
Content-Type: application/json
{
"label": "Company Name"
}
```
### Delete Custom Field
```bash
DELETE /kit/v4/custom_fields/{id}
```
### List Email Templates
```bash
GET /kit/v4/email_templates
```
### List Purchases
```bash
GET /kit/v4/purchases
```
### List Webhooks
```bash
GET /kit/v4/webhooks
```
### Create Webhook
```bash
POST /kit/v4/webhooks
Content-Type: application/json
{
"target_url": "https://example.com/webhook",
"event": {"name": "subscriber.subscriber_activate"}
}
```
### Delete Webhook
```bash
DELETE /kit/v4/webhooks/{id}
```
## Notes
- Kit API uses V4 (V3 is deprecated)
- Subscriber IDs are integers
- Custom field keys are auto-generated from labels
- Uses cursor-based pagination with `after` and `before` parameters
- Delete operations return 204 No Content
- Bulk operations (>100 items) are processed asynchronously
## Resources
- [Kit API Overview](https://developers.kit.com/api-reference/overview)
- [Kit API Reference](https://developers.kit.com/api-reference)
- [Kit Developer Documentation](https://developers.kit.com)

View File

@@ -0,0 +1,237 @@
# Klaviyo Routing Reference
**App name:** `klaviyo`
**Base URL proxied:** `a.klaviyo.com`
## API Path Pattern
```
/klaviyo/api/{resource}
```
## API Versioning
Include the `revision` header in all requests:
```
revision: 2024-10-15
```
## Common Endpoints
### Get Profiles
```bash
GET /klaviyo/api/profiles
```
Query parameters:
- `filter` - Filter profiles (e.g., `filter=equals(email,"test@example.com")`)
- `fields[profile]` - Comma-separated list of fields to include
- `page[size]` - Number of results per page (max 100)
### Get a Profile
```bash
GET /klaviyo/api/profiles/{profile_id}
```
### Create a Profile
```bash
POST /klaviyo/api/profiles
Content-Type: application/json
{
"data": {
"type": "profile",
"attributes": {
"email": "newuser@example.com",
"first_name": "John",
"last_name": "Doe"
}
}
}
```
### Update a Profile
```bash
PATCH /klaviyo/api/profiles/{profile_id}
Content-Type: application/json
{
"data": {
"type": "profile",
"id": "PROFILE_ID",
"attributes": {
"first_name": "Jane"
}
}
}
```
### Get Lists
```bash
GET /klaviyo/api/lists
```
### Create a List
```bash
POST /klaviyo/api/lists
Content-Type: application/json
{
"data": {
"type": "list",
"attributes": {
"name": "VIP Customers"
}
}
}
```
### Add Profiles to List
```bash
POST /klaviyo/api/lists/{list_id}/relationships/profiles
Content-Type: application/json
{
"data": [
{"type": "profile", "id": "PROFILE_ID"}
]
}
```
### Get Segments
```bash
GET /klaviyo/api/segments
```
### Get Campaigns
```bash
GET /klaviyo/api/campaigns
```
### Create a Campaign
```bash
POST /klaviyo/api/campaigns
Content-Type: application/json
{
"data": {
"type": "campaign",
"attributes": {
"name": "Summer Newsletter",
"audiences": {
"included": ["LIST_ID"]
}
}
}
}
```
### Get Flows
```bash
GET /klaviyo/api/flows
```
### Update Flow Status
```bash
PATCH /klaviyo/api/flows/{flow_id}
Content-Type: application/json
{
"data": {
"type": "flow",
"id": "FLOW_ID",
"attributes": {
"status": "live"
}
}
}
```
### Create an Event
```bash
POST /klaviyo/api/events
Content-Type: application/json
{
"data": {
"type": "event",
"attributes": {
"profile": {
"data": {
"type": "profile",
"attributes": {
"email": "customer@example.com"
}
}
},
"metric": {
"data": {
"type": "metric",
"attributes": {
"name": "Viewed Product"
}
}
},
"properties": {
"product_id": "SKU123",
"product_name": "Blue T-Shirt"
}
}
}
}
```
### Get Metrics
```bash
GET /klaviyo/api/metrics
```
### Get Templates
```bash
GET /klaviyo/api/templates
```
### Create Webhook
```bash
POST /klaviyo/api/webhooks
Content-Type: application/json
{
"data": {
"type": "webhook",
"attributes": {
"name": "Order Placed Webhook",
"endpoint_url": "https://example.com/webhooks/klaviyo",
"enabled": true
},
"relationships": {
"webhook-topics": {
"data": [
{"type": "webhook-topic", "id": "campaign:sent"}
]
}
}
}
}
```
### Delete Webhook
```bash
DELETE /klaviyo/api/webhooks/{webhook_id}
```
## Notes
- All requests use JSON:API specification
- Timestamps are in ISO 8601 RFC 3339 format
- Resource IDs are strings (often base64-encoded)
- Use sparse fieldsets to optimize response size (e.g., `fields[profile]=email,first_name`)
- Include `revision` header for API versioning
- Use cursor-based pagination with `page[cursor]` parameter
## Resources
- [Klaviyo API Documentation](https://developers.klaviyo.com)
- [API Reference](https://developers.klaviyo.com/en/reference/api_overview)
- [Klaviyo Developer Portal](https://developers.klaviyo.com/en)

View File

@@ -0,0 +1,203 @@
# Linear Routing Reference
**App name:** `linear`
**Base URL proxied:** `api.linear.app`
## API Type
Linear uses a GraphQL API exclusively. All requests are POST requests to the `/graphql` endpoint.
## API Path Pattern
```
/linear/graphql
```
All operations use POST with a JSON body containing the `query` field.
## Common Operations
### Get Current User (Viewer)
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ viewer { id name email } }"
}
```
### Get Organization
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ organization { id name urlKey } }"
}
```
### List Teams
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ teams { nodes { id name key } } }"
}
```
### List Issues
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ issues(first: 20) { nodes { id identifier title state { name } priority } pageInfo { hasNextPage endCursor } } }"
}
```
### Get Issue by Identifier
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ issue(id: \"MTN-527\") { id identifier title description state { name } priority assignee { name } team { key } createdAt } }"
}
```
### Filter Issues by State
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ issues(first: 20, filter: { state: { type: { eq: \"started\" } } }) { nodes { id identifier title state { name } } } }"
}
```
### Search Issues
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ searchIssues(first: 20, term: \"search term\") { nodes { id identifier title } } }"
}
```
### Create Issue
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "mutation { issueCreate(input: { teamId: \"TEAM_ID\", title: \"Issue title\", description: \"Description\" }) { success issue { id identifier title } } }"
}
```
### Update Issue
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "mutation { issueUpdate(id: \"ISSUE_ID\", input: { title: \"Updated title\", priority: 2 }) { success issue { id identifier title priority } } }"
}
```
### Create Comment
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "mutation { commentCreate(input: { issueId: \"ISSUE_ID\", body: \"Comment text\" }) { success comment { id body } } }"
}
```
### List Projects
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ projects(first: 20) { nodes { id name state createdAt } } }"
}
```
### List Labels
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ issueLabels(first: 50) { nodes { id name color } } }"
}
```
### List Workflow States
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ workflowStates(first: 50) { nodes { id name type team { key } } } }"
}
```
### List Users
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ users(first: 50) { nodes { id name email active } } }"
}
```
### List Cycles
```bash
POST /linear/graphql
Content-Type: application/json
{
"query": "{ cycles(first: 20) { nodes { id name number startsAt endsAt } } }"
}
```
## Pagination
Linear uses Relay-style cursor-based pagination:
```bash
# First page
POST /linear/graphql
{
"query": "{ issues(first: 20) { nodes { id identifier title } pageInfo { hasNextPage endCursor } } }"
}
# Next page
POST /linear/graphql
{
"query": "{ issues(first: 20, after: \"CURSOR_VALUE\") { nodes { id identifier title } pageInfo { hasNextPage endCursor } } }"
}
```
## Notes
- Linear uses GraphQL exclusively (no REST API)
- Issue identifiers (e.g., `MTN-527`) can be used in place of UUIDs for the `id` parameter
- Priority values: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low
- Workflow state types: `backlog`, `unstarted`, `started`, `completed`, `canceled`
- Some mutations (delete, create labels/projects) may require additional OAuth scopes
- Use `searchIssues(term: "...")` for full-text search
- Filter operators: `eq`, `neq`, `in`, `nin`, `containsIgnoreCase`, etc.
## Resources
- [Linear API Overview](https://linear.app/developers)
- [Linear GraphQL Getting Started](https://linear.app/developers/graphql)
- [Linear GraphQL Schema (Apollo Studio)](https://studio.apollographql.com/public/Linear-API/schema/reference?variant=current)
- [Linear API and Webhooks](https://linear.app/docs/api-and-webhooks)

View File

@@ -0,0 +1,278 @@
# LinkedIn Routing Reference
**App name:** `linkedin`
**Base URL proxied:** `api.linkedin.com`
## API Path Pattern
```
/linkedin/v2/{resource}
```
## Required Headers
```
X-Restli-Protocol-Version: 2.0.0
```
## Common Endpoints
### Get User Info (OpenID Connect)
```bash
GET /linkedin/v2/userinfo
```
### Get Current User Profile
```bash
GET /linkedin/v2/me
```
With projection:
```bash
GET /linkedin/v2/me?projection=(id,firstName,lastName)
```
### Create Text Post
```bash
POST /linkedin/v2/ugcPosts
Content-Type: application/json
X-Restli-Protocol-Version: 2.0.0
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {"text": "Hello LinkedIn!"},
"shareMediaCategory": "NONE"
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
}
}
```
### Create Article/URL Share
```bash
POST /linkedin/v2/ugcPosts
Content-Type: application/json
X-Restli-Protocol-Version: 2.0.0
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {"text": "Check this out!"},
"shareMediaCategory": "ARTICLE",
"media": [{
"status": "READY",
"originalUrl": "https://example.com",
"title": {"text": "Title"},
"description": {"text": "Description"}
}]
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
}
}
```
### Register Image Upload
```bash
POST /linkedin/v2/assets?action=registerUpload
Content-Type: application/json
X-Restli-Protocol-Version: 2.0.0
{
"registerUploadRequest": {
"recipes": ["urn:li:digitalmediaRecipe:feedshare-image"],
"owner": "urn:li:person:{personId}",
"serviceRelationships": [{
"relationshipType": "OWNER",
"identifier": "urn:li:userGeneratedContent"
}]
}
}
```
### Ad Library - Search Ads
```bash
GET /linkedin/rest/adLibrary?q=criteria&keyword=linkedin
```
Required headers:
- `LinkedIn-Version: 202502`
### Job Library - Search Jobs
```bash
GET /linkedin/rest/jobLibrary?q=criteria&keyword=software
```
Required headers:
- `LinkedIn-Version: 202506`
## Marketing API (Advertising)
Required headers for all Marketing API calls:
```
X-Restli-Protocol-Version: 2.0.0
LinkedIn-Version: 202502
```
### List Ad Accounts
```bash
GET /linkedin/rest/adAccounts?q=search
```
### Get Ad Account
```bash
GET /linkedin/rest/adAccounts/{adAccountId}
```
### Create Ad Account
```bash
POST /linkedin/rest/adAccounts
Content-Type: application/json
{
"name": "Ad Account Name",
"currency": "USD",
"reference": "urn:li:organization:{orgId}",
"type": "BUSINESS"
}
```
### List Campaign Groups
```bash
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups
```
### Create Campaign Group
```bash
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups
Content-Type: application/json
{
"name": "Campaign Group Name",
"status": "DRAFT"
}
```
### Get Campaign Group
```bash
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups/{campaignGroupId}
```
### List Campaigns
```bash
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaigns
```
### Create Campaign
```bash
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaigns
Content-Type: application/json
{
"campaignGroup": "urn:li:sponsoredCampaignGroup:{groupId}",
"name": "Campaign Name",
"status": "DRAFT",
"objectiveType": "BRAND_AWARENESS"
}
```
### Get Campaign
```bash
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaigns/{campaignId}
```
### List Organization ACLs
```bash
GET /linkedin/v2/organizationAcls?q=roleAssignee
```
### Lookup Organization by Vanity Name
```bash
GET /linkedin/rest/organizations?q=vanityName&vanityName=microsoft
```
### Get Organization Share Statistics
```bash
GET /linkedin/rest/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:12345
```
### Get Organization Posts
```bash
GET /linkedin/rest/posts?q=author&author=urn:li:organization:12345
```
## Media Upload (REST API)
Required headers:
- `LinkedIn-Version: 202502`
### Initialize Image Upload
```bash
POST /linkedin/rest/images?action=initializeUpload
Content-Type: application/json
{"initializeUploadRequest": {"owner": "urn:li:person:{personId}"}}
```
### Initialize Video Upload
```bash
POST /linkedin/rest/videos?action=initializeUpload
Content-Type: application/json
{"initializeUploadRequest": {"owner": "urn:li:person:{personId}", "fileSizeBytes": 10000000}}
```
### Initialize Document Upload
```bash
POST /linkedin/rest/documents?action=initializeUpload
Content-Type: application/json
{"initializeUploadRequest": {"owner": "urn:li:person:{personId}"}}
```
## Ad Targeting
### Get Targeting Facets
```bash
GET /linkedin/rest/adTargetingFacets
```
Returns 31 targeting facets (skills, industries, titles, locations, etc.)
## Notes
- Authentication is automatic - the router injects the OAuth token
- Include `X-Restli-Protocol-Version: 2.0.0` header for all v2 API calls
- Author URN format: `urn:li:person:{personId}`
- Get person ID from `/v2/me` endpoint
- Image uploads are 3-step: register, upload binary, create post
- Rate limits: 150 requests/day per member, 100K/day per app
## Visibility Options
- `PUBLIC` - Viewable by anyone
- `CONNECTIONS` - 1st-degree connections only
## Share Media Categories
- `NONE` - Text only
- `ARTICLE` - URL share
- `IMAGE` - Image post
- `VIDEO` - Video post
## Resources
- [LinkedIn API Overview](https://learn.microsoft.com/en-us/linkedin/)
- [Share on LinkedIn](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin)
- [Profile API](https://learn.microsoft.com/en-us/linkedin/shared/integrations/people/profile-api)
- [Marketing API](https://learn.microsoft.com/en-us/linkedin/marketing/)
- [Ad Accounts](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads/account-structure/create-and-manage-accounts)
- [Campaigns](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads/account-structure/create-and-manage-campaigns)

View File

@@ -0,0 +1,213 @@
# Mailchimp Routing Reference
**App name:** `mailchimp`
**Base URL proxied:** `{dc}.api.mailchimp.com`
## API Path Pattern
```
/mailchimp/3.0/{resource}
```
## Common Endpoints
### Get All Lists (Audiences)
```bash
GET /mailchimp/3.0/lists
```
Query parameters:
- `count` - Number of records to return (default 10, max 1000)
- `offset` - Number of records to skip (for pagination)
### Get a List
```bash
GET /mailchimp/3.0/lists/{list_id}
```
### Create a List
```bash
POST /mailchimp/3.0/lists
Content-Type: application/json
{
"name": "Newsletter",
"contact": {
"company": "Acme Corp",
"address1": "123 Main St",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"permission_reminder": "You signed up for our newsletter",
"campaign_defaults": {
"from_name": "Acme Corp",
"from_email": "newsletter@acme.com",
"subject": "",
"language": "en"
},
"email_type_option": true
}
```
### Get List Members
```bash
GET /mailchimp/3.0/lists/{list_id}/members?status=subscribed&count=50
```
### Add a Member
```bash
POST /mailchimp/3.0/lists/{list_id}/members
Content-Type: application/json
{
"email_address": "newuser@example.com",
"status": "subscribed",
"merge_fields": {
"FNAME": "Jane",
"LNAME": "Smith"
}
}
```
### Update a Member
```bash
PATCH /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}
Content-Type: application/json
{
"merge_fields": {
"FNAME": "Jane",
"LNAME": "Doe"
}
}
```
### Add or Update a Member (Upsert)
```bash
PUT /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}
Content-Type: application/json
{
"email_address": "user@example.com",
"status_if_new": "subscribed",
"merge_fields": {
"FNAME": "Jane",
"LNAME": "Smith"
}
}
```
### Delete a Member
```bash
DELETE /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}
```
### Add or Remove Tags
```bash
POST /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}/tags
Content-Type: application/json
{
"tags": [
{"name": "VIP", "status": "active"},
{"name": "Old Tag", "status": "inactive"}
]
}
```
### Get Segments
```bash
GET /mailchimp/3.0/lists/{list_id}/segments
```
### Get All Campaigns
```bash
GET /mailchimp/3.0/campaigns?status=sent&count=20
```
### Create a Campaign
```bash
POST /mailchimp/3.0/campaigns
Content-Type: application/json
{
"type": "regular",
"recipients": {
"list_id": "LIST_ID"
},
"settings": {
"subject_line": "Your Monthly Update",
"from_name": "Acme Corp",
"reply_to": "hello@acme.com"
}
}
```
### Set Campaign Content
```bash
PUT /mailchimp/3.0/campaigns/{campaign_id}/content
Content-Type: application/json
{
"html": "<html><body><h1>Hello!</h1><p>Newsletter content here.</p></body></html>",
"plain_text": "Hello! Newsletter content here."
}
```
### Send a Campaign
```bash
POST /mailchimp/3.0/campaigns/{campaign_id}/actions/send
```
### Schedule a Campaign
```bash
POST /mailchimp/3.0/campaigns/{campaign_id}/actions/schedule
Content-Type: application/json
{
"schedule_time": "2025-03-01T10:00:00+00:00"
}
```
### Get All Templates
```bash
GET /mailchimp/3.0/templates?type=user
```
### Get All Automations
```bash
GET /mailchimp/3.0/automations
```
### Start an Automation
```bash
POST /mailchimp/3.0/automations/{workflow_id}/actions/start-all-emails
```
### Get Campaign Reports
```bash
GET /mailchimp/3.0/reports?count=20
```
### Get Campaign Report
```bash
GET /mailchimp/3.0/reports/{campaign_id}
```
## Notes
- List IDs are 10-character alphanumeric strings
- Subscriber hashes are MD5 hashes of lowercase email addresses
- Timestamps are in ISO 8601 format
- Maximum 1000 records per request for list endpoints
- "Audience" and "list" are used interchangeably (app vs API terminology)
- "Contact" and "member" are used interchangeably (app vs API terminology)
- Use offset-based pagination with `count` and `offset` parameters
## Resources
- [Mailchimp Marketing API Documentation](https://mailchimp.com/developer/marketing/)
- [API Reference](https://mailchimp.com/developer/marketing/api/)
- [Quick Start Guide](https://mailchimp.com/developer/marketing/guides/quick-start/)

View File

@@ -0,0 +1,238 @@
# MailerLite Routing Reference
**App name:** `mailerlite`
**Base URL proxied:** `connect.mailerlite.com`
## API Path Pattern
```
/mailerlite/api/{resource}
```
## Common Endpoints
### Subscribers
#### List Subscribers
```bash
GET /mailerlite/api/subscribers
```
Query parameters: `filter[status]`, `limit`, `cursor`, `include`
#### Get Subscriber
```bash
GET /mailerlite/api/subscribers/{subscriber_id_or_email}
```
#### Create/Upsert Subscriber
```bash
POST /mailerlite/api/subscribers
Content-Type: application/json
{
"email": "subscriber@example.com",
"fields": {"name": "John Doe"},
"groups": ["12345678901234567"],
"status": "active"
}
```
#### Update Subscriber
```bash
PUT /mailerlite/api/subscribers/{subscriber_id}
Content-Type: application/json
{
"fields": {"name": "Jane Doe"}
}
```
#### Delete Subscriber
```bash
DELETE /mailerlite/api/subscribers/{subscriber_id}
```
### Groups
#### List Groups
```bash
GET /mailerlite/api/groups
```
Query parameters: `limit`, `page`, `filter[name]`, `sort`
#### Create Group
```bash
POST /mailerlite/api/groups
Content-Type: application/json
{
"name": "Newsletter Subscribers"
}
```
#### Update Group
```bash
PUT /mailerlite/api/groups/{group_id}
Content-Type: application/json
{
"name": "Updated Group Name"
}
```
#### Delete Group
```bash
DELETE /mailerlite/api/groups/{group_id}
```
#### Get Group Subscribers
```bash
GET /mailerlite/api/groups/{group_id}/subscribers
```
### Campaigns
#### List Campaigns
```bash
GET /mailerlite/api/campaigns
```
Query parameters: `filter[status]`, `filter[type]`, `limit`, `page`
#### Get Campaign
```bash
GET /mailerlite/api/campaigns/{campaign_id}
```
#### Create Campaign
```bash
POST /mailerlite/api/campaigns
Content-Type: application/json
{
"name": "My Newsletter",
"type": "regular",
"emails": [
{
"subject": "Weekly Update",
"from_name": "Newsletter",
"from": "newsletter@example.com"
}
],
"groups": ["12345678901234567"]
}
```
#### Schedule Campaign
```bash
POST /mailerlite/api/campaigns/{campaign_id}/schedule
Content-Type: application/json
{
"delivery": "instant"
}
```
#### Delete Campaign
```bash
DELETE /mailerlite/api/campaigns/{campaign_id}
```
### Automations
#### List Automations
```bash
GET /mailerlite/api/automations
```
Query parameters: `filter[enabled]`, `filter[name]`, `page`, `limit`
#### Get Automation
```bash
GET /mailerlite/api/automations/{automation_id}
```
#### Delete Automation
```bash
DELETE /mailerlite/api/automations/{automation_id}
```
### Fields
#### List Fields
```bash
GET /mailerlite/api/fields
```
#### Create Field
```bash
POST /mailerlite/api/fields
Content-Type: application/json
{
"name": "Company",
"type": "text"
}
```
### Segments
#### List Segments
```bash
GET /mailerlite/api/segments
```
#### Get Segment Subscribers
```bash
GET /mailerlite/api/segments/{segment_id}/subscribers
```
### Forms
#### List Forms
```bash
GET /mailerlite/api/forms/{type}
```
Path parameters: `type` - `popup`, `embedded`, or `promotion`
#### Get Form Subscribers
```bash
GET /mailerlite/api/forms/{form_id}/subscribers
```
### Webhooks
#### List Webhooks
```bash
GET /mailerlite/api/webhooks
```
#### Create Webhook
```bash
POST /mailerlite/api/webhooks
Content-Type: application/json
{
"name": "Subscriber Updates",
"events": ["subscriber.created", "subscriber.updated"],
"url": "https://example.com/webhook"
}
```
## Notes
- Rate limit: 120 requests per minute
- Subscriber emails serve as unique identifiers (POST creates or updates existing)
- Only draft campaigns can be updated
- Pagination: cursor-based for subscribers, page-based for groups/campaigns
- API versioning can be overridden via `X-Version: YYYY-MM-DD` header
## Resources
- [MailerLite API Documentation](https://developers.mailerlite.com/docs/)
- [MailerLite Subscribers API](https://developers.mailerlite.com/docs/subscribers.html)
- [MailerLite Groups API](https://developers.mailerlite.com/docs/groups.html)
- [MailerLite Campaigns API](https://developers.mailerlite.com/docs/campaigns.html)

View File

@@ -0,0 +1,212 @@
# ManyChat Routing Reference
**App name:** `manychat`
**Base URL proxied:** `api.manychat.com`
## API Path Pattern
```
/manychat/fb/{category}/{action}
```
## Common Endpoints
### Page Operations
#### Get Page Info
```bash
GET /manychat/fb/page/getInfo
```
#### List Tags
```bash
GET /manychat/fb/page/getTags
```
#### Create Tag
```bash
POST /manychat/fb/page/createTag
Content-Type: application/json
{
"name": "New Tag"
}
```
#### Remove Tag
```bash
POST /manychat/fb/page/removeTag
Content-Type: application/json
{
"tag_id": 123
}
```
#### List Custom Fields
```bash
GET /manychat/fb/page/getCustomFields
```
#### Create Custom Field
```bash
POST /manychat/fb/page/createCustomField
Content-Type: application/json
{
"caption": "Phone Number",
"type": "text",
"description": "Customer phone number"
}
```
#### List Bot Fields
```bash
GET /manychat/fb/page/getBotFields
```
#### Set Bot Field
```bash
POST /manychat/fb/page/setBotField
Content-Type: application/json
{
"field_id": 123,
"field_value": 42
}
```
#### List Flows
```bash
GET /manychat/fb/page/getFlows
```
#### List Growth Tools
```bash
GET /manychat/fb/page/getGrowthTools
```
#### List OTN Topics
```bash
GET /manychat/fb/page/getOtnTopics
```
### Subscriber Operations
#### Get Subscriber Info
```bash
GET /manychat/fb/subscriber/getInfo?subscriber_id=123456789
```
#### Find Subscriber by Name
```bash
GET /manychat/fb/subscriber/findByName?name=John%20Doe
```
#### Find Subscriber by Email/Phone
```bash
GET /manychat/fb/subscriber/findBySystemField?email=john@example.com
```
#### Create Subscriber
```bash
POST /manychat/fb/subscriber/createSubscriber
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"phone": "+1234567890",
"email": "john@example.com"
}
```
#### Update Subscriber
```bash
POST /manychat/fb/subscriber/updateSubscriber
Content-Type: application/json
{
"subscriber_id": 123456789,
"first_name": "John",
"last_name": "Smith"
}
```
#### Add Tag to Subscriber
```bash
POST /manychat/fb/subscriber/addTag
Content-Type: application/json
{
"subscriber_id": 123456789,
"tag_id": 1
}
```
#### Set Custom Field
```bash
POST /manychat/fb/subscriber/setCustomField
Content-Type: application/json
{
"subscriber_id": 123456789,
"field_id": 1,
"field_value": "value"
}
```
### Sending Operations
#### Send Content
```bash
POST /manychat/fb/sending/sendContent
Content-Type: application/json
{
"subscriber_id": 123456789,
"data": {
"version": "v2",
"content": {
"messages": [
{"type": "text", "text": "Hello!"}
]
}
}
}
```
#### Send Flow
```bash
POST /manychat/fb/sending/sendFlow
Content-Type: application/json
{
"subscriber_id": 123456789,
"flow_ns": "content123456"
}
```
## Rate Limits
| Endpoint Category | Rate Limit |
|------------------|------------|
| Page GET endpoints | 100 queries/second |
| Page POST endpoints | 10 queries/second |
| Subscriber operations | 10-50 queries/second |
| Sending content | 25 queries/second |
| Sending flows | 20 queries/second |
## Notes
- Subscriber IDs are integers unique within a page
- Flow namespaces (flow_ns) identify automation flows
- Message tags are required for sending outside the 24-hour window
- All responses include `{"status": "success"}` or `{"status": "error"}`
- Custom field types: `text`, `number`, `date`, `datetime`, `boolean`
## Resources
- [ManyChat API Documentation](https://api.manychat.com/swagger)
- [ManyChat API Key Generation](https://help.manychat.com/hc/en-us/articles/14959510331420)
- [ManyChat Dev Program](https://help.manychat.com/hc/en-us/articles/14281269835548)

View File

@@ -0,0 +1,174 @@
# Microsoft Excel Routing Reference
**App name:** `microsoft-excel`
**Base URL proxied:** `graph.microsoft.com`
## API Path Pattern
```
/microsoft-excel/v1.0/me/drive/items/{file-id}/workbook/{resource}
/microsoft-excel/v1.0/me/drive/root:/{path}:/workbook/{resource}
```
## Common Endpoints
### Drive Operations
#### Get Drive Info
```bash
GET /microsoft-excel/v1.0/me/drive
```
#### List Root Files
```bash
GET /microsoft-excel/v1.0/me/drive/root/children
```
#### Search Files
```bash
GET /microsoft-excel/v1.0/me/drive/root/search(q='.xlsx')
```
### Session Management
#### Create Session
```bash
POST /microsoft-excel/v1.0/me/drive/root:/{path}:/workbook/createSession
Content-Type: application/json
{
"persistChanges": true
}
```
### Worksheet Operations
#### List Worksheets
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets
```
#### Create Worksheet
```bash
POST /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets
Content-Type: application/json
{
"name": "NewSheet"
}
```
#### Delete Worksheet
```bash
DELETE /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('{id}')
```
### Range Operations
#### Get Range
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/range(address='A1:B2')
```
#### Update Range
```bash
PATCH /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/range(address='A1:B2')
Content-Type: application/json
{
"values": [
["Value1", "Value2"],
[100, 200]
]
}
```
#### Get Used Range
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/usedRange
```
### Table Operations
#### List Tables
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/tables
```
#### Create Table
```bash
POST /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/tables/add
Content-Type: application/json
{
"address": "A1:C4",
"hasHeaders": true
}
```
#### Get Table Rows
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/tables('Table1')/rows
```
#### Add Table Row
```bash
POST /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/tables('Table1')/rows
Content-Type: application/json
{
"values": [["Data1", "Data2", "Data3"]]
}
```
#### Delete Table Row
```bash
DELETE /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/tables('Table1')/rows/itemAt(index=0)
```
#### Get Table Columns
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/tables('Table1')/columns
```
### Named Items
#### List Named Items
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/names
```
### Charts
#### List Charts
```bash
GET /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/charts
```
#### Add Chart
```bash
POST /microsoft-excel/v1.0/me/drive/root:/workbook.xlsx:/workbook/worksheets('Sheet1')/charts/add
Content-Type: application/json
{
"type": "ColumnClustered",
"sourceData": "A1:C4",
"seriesBy": "Auto"
}
```
## Notes
- Only `.xlsx` files are supported (not legacy `.xls`)
- Use path-based access (`/drive/root:/{path}:`) or ID-based access (`/drive/items/{id}`)
- Table/worksheet IDs with `{` and `}` must be URL-encoded
- Sessions improve performance for multiple operations
- Sessions expire after ~5 minutes (persistent) or ~7 minutes (non-persistent)
- Range addresses use A1 notation
## Resources
- [Microsoft Graph Excel API](https://learn.microsoft.com/en-us/graph/api/resources/excel)
- [Excel Workbook Resource](https://learn.microsoft.com/en-us/graph/api/resources/workbook)
- [Excel Worksheet Resource](https://learn.microsoft.com/en-us/graph/api/resources/worksheet)
- [Excel Range Resource](https://learn.microsoft.com/en-us/graph/api/resources/range)

View File

@@ -0,0 +1,166 @@
# Microsoft To Do Routing Reference
**App name:** `microsoft-to-do`
**Base URL proxied:** `graph.microsoft.com`
## API Path Pattern
```
/microsoft-to-do/v1.0/me/todo/{resource}
```
All Microsoft To Do endpoints use the Microsoft Graph API under the `/me/todo/` path.
## Common Endpoints
### Task Lists
#### List All Task Lists
```bash
GET /microsoft-to-do/v1.0/me/todo/lists
```
#### Get Task List
```bash
GET /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}
```
#### Create Task List
```bash
POST /microsoft-to-do/v1.0/me/todo/lists
Content-Type: application/json
{
"displayName": "My New List"
}
```
#### Update Task List
```bash
PATCH /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}
Content-Type: application/json
{
"displayName": "Updated List Name"
}
```
#### Delete Task List
```bash
DELETE /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}
```
### Tasks
#### List Tasks
```bash
GET /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks
```
#### Get Task
```bash
GET /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}
```
#### Create Task
```bash
POST /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks
Content-Type: application/json
{
"title": "New Task",
"importance": "high",
"status": "notStarted",
"dueDateTime": {
"dateTime": "2024-12-31T17:00:00",
"timeZone": "UTC"
}
}
```
#### Update Task
```bash
PATCH /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}
Content-Type: application/json
{
"status": "completed"
}
```
#### Delete Task
```bash
DELETE /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}
```
### Checklist Items
#### List Checklist Items
```bash
GET /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/checklistItems
```
#### Create Checklist Item
```bash
POST /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/checklistItems
Content-Type: application/json
{
"displayName": "Subtask name"
}
```
#### Update Checklist Item
```bash
PATCH /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/checklistItems/{checklistItemId}
Content-Type: application/json
{
"isChecked": true
}
```
#### Delete Checklist Item
```bash
DELETE /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/checklistItems/{checklistItemId}
```
### Linked Resources
#### List Linked Resources
```bash
GET /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/linkedResources
```
#### Create Linked Resource
```bash
POST /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/linkedResources
Content-Type: application/json
{
"webUrl": "https://example.com/item",
"applicationName": "MyApp",
"displayName": "Related Item"
}
```
#### Delete Linked Resource
```bash
DELETE /microsoft-to-do/v1.0/me/todo/lists/{todoTaskListId}/tasks/{taskId}/linkedResources/{linkedResourceId}
```
## Notes
- Task list IDs and task IDs are opaque base64-encoded strings
- Timestamps use ISO 8601 format in UTC by default
- The `dateTimeTimeZone` type requires both `dateTime` and `timeZone` fields
- Task `status` values: `notStarted`, `inProgress`, `completed`, `waitingOnOthers`, `deferred`
- Task `importance` values: `low`, `normal`, `high`
- Supports OData query parameters: `$select`, `$filter`, `$orderby`, `$top`, `$skip`
- Pagination uses `@odata.nextLink` for continuation
## Resources
- [Microsoft To Do API Overview](https://learn.microsoft.com/en-us/graph/api/resources/todo-overview)
- [todoTaskList Resource](https://learn.microsoft.com/en-us/graph/api/resources/todotasklist)
- [todoTask Resource](https://learn.microsoft.com/en-us/graph/api/resources/todotask)

View File

@@ -0,0 +1,207 @@
# Monday.com Routing Reference
**App name:** `monday`
**Base URL proxied:** `api.monday.com`
## API Type
Monday.com uses a GraphQL API exclusively. All requests are POST requests to the `/v2` endpoint.
## API Path Pattern
```
/monday/v2
```
All operations use POST with a JSON body containing the `query` field.
## Common Operations
### Get Current User
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ me { id name email } }"
}
```
### List Workspaces
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ workspaces(limit: 20) { id name kind } }"
}
```
### List Boards
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ boards(limit: 20) { id name state board_kind workspace { id name } } }"
}
```
### Get Board with Items
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ boards(ids: [BOARD_ID]) { id name columns { id title type } groups { id title } items_page(limit: 50) { cursor items { id name state column_values { id text } } } } }"
}
```
### Create Board
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { create_board(board_name: \"New Board\", board_kind: public) { id name } }"
}
```
### Update Board
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { update_board(board_id: BOARD_ID, board_attribute: description, new_value: \"Description\") }"
}
```
### Delete Board
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { delete_board(board_id: BOARD_ID) { id } }"
}
```
### Get Items by ID
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ items(ids: [ITEM_ID]) { id name created_at state board { id name } group { id title } column_values { id text value } } }"
}
```
### Create Item
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { create_item(board_id: BOARD_ID, group_id: \"GROUP_ID\", item_name: \"New item\") { id name } }"
}
```
### Create Item with Column Values
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { create_item(board_id: BOARD_ID, group_id: \"GROUP_ID\", item_name: \"Task\", column_values: \"{\\\"status\\\": {\\\"label\\\": \\\"Working on it\\\"}}\") { id name } }"
}
```
### Update Item
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { change_simple_column_value(board_id: BOARD_ID, item_id: ITEM_ID, column_id: \"name\", value: \"Updated name\") { id name } }"
}
```
### Delete Item
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { delete_item(item_id: ITEM_ID) { id } }"
}
```
### Create Column
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { create_column(board_id: BOARD_ID, title: \"Status\", column_type: status) { id title type } }"
}
```
### Create Group
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "mutation { create_group(board_id: BOARD_ID, group_name: \"New Group\") { id title } }"
}
```
### List Users
```bash
POST /monday/v2
Content-Type: application/json
{
"query": "{ users(limit: 50) { id name email } }"
}
```
## Pagination
Monday.com uses cursor-based pagination for items:
```bash
# First page
POST /monday/v2
{
"query": "{ boards(ids: [BOARD_ID]) { items_page(limit: 50) { cursor items { id name } } } }"
}
# Next page
POST /monday/v2
{
"query": "{ next_items_page(cursor: \"CURSOR_VALUE\", limit: 50) { cursor items { id name } } }"
}
```
## Notes
- Monday.com uses GraphQL exclusively (no REST API)
- Board IDs, item IDs, and user IDs are numeric strings
- Column IDs are alphanumeric (e.g., `color_mm09e48w`)
- Group IDs are alphanumeric (e.g., `group_mm0939df`, `topics`)
- Column values must be passed as JSON strings
- Board kinds: `public`, `private`, `share`
- Board states: `active`, `archived`, `deleted`, `all`
- Column types: `status`, `text`, `numbers`, `date`, `people`, `dropdown`, `checkbox`, `email`, `phone`, `link`, `timeline`, `tags`, `rating`
- Default limit is 25, maximum is 100
- Cursors are valid for 60 minutes
## Resources
- [Monday.com API Basics](https://developer.monday.com/api-reference/docs/basics)
- [GraphQL Overview](https://developer.monday.com/api-reference/docs/introduction-to-graphql)
- [Boards Reference](https://developer.monday.com/api-reference/reference/boards)
- [Items Reference](https://developer.monday.com/api-reference/reference/items)
- [Columns Reference](https://developer.monday.com/api-reference/reference/columns)

View File

@@ -0,0 +1,345 @@
# Notion Routing Reference
**App name:** `notion`
**Base URL proxied:** `api.notion.com`
## Required Headers
All Notion API requests require:
```
Notion-Version: 2025-09-03
```
## API Path Pattern
```
/notion/v1/{endpoint}
```
## Key Concept: Databases vs Data Sources
In API version 2025-09-03, databases and data sources are separate concepts:
| Concept | Description | Use For |
|---------|-------------|---------|
| **Database** | Container that can hold multiple data sources | Creating databases, getting data_source IDs |
| **Data Source** | Schema and data within a database | Querying, updating schema, updating properties |
Most existing databases have one data source. Use `GET /databases/{id}` to get the `data_source_id`, then use `/data_sources/` endpoints for all operations.
## Common Endpoints
### Search
Search for pages:
```bash
POST /notion/v1/search
Content-Type: application/json
Notion-Version: 2025-09-03
{
"query": "meeting notes",
"filter": {"property": "object", "value": "page"}
}
```
Search for data sources:
```bash
POST /notion/v1/search
Content-Type: application/json
Notion-Version: 2025-09-03
{
"filter": {"property": "object", "value": "data_source"}
}
```
With pagination:
```bash
POST /notion/v1/search
Content-Type: application/json
Notion-Version: 2025-09-03
{
"page_size": 10,
"start_cursor": "CURSOR_FROM_PREVIOUS_RESPONSE"
}
```
### Data Sources
Use data source endpoints for querying, getting schema, and updates.
#### Get Data Source
```bash
GET /notion/v1/data_sources/{dataSourceId}
Notion-Version: 2025-09-03
```
Returns full schema with `properties` field.
#### Query Data Source
```bash
POST /notion/v1/data_sources/{dataSourceId}/query
Content-Type: application/json
Notion-Version: 2025-09-03
{
"filter": {
"property": "Status",
"select": {"equals": "Active"}
},
"sorts": [
{"property": "Created", "direction": "descending"}
],
"page_size": 100
}
```
#### Update Data Source (title, schema, properties)
```bash
PATCH /notion/v1/data_sources/{dataSourceId}
Content-Type: application/json
Notion-Version: 2025-09-03
{
"title": [{"type": "text", "text": {"content": "Updated Title"}}],
"properties": {
"NewColumn": {"rich_text": {}}
}
}
```
### Databases
Database endpoints are only needed for **creating** databases and **discovering** data source IDs.
#### Get Database (to find data_source_id)
```bash
GET /notion/v1/databases/{databaseId}
Notion-Version: 2025-09-03
```
Response includes `data_sources` array:
```json
{
"id": "database-id",
"object": "database",
"data_sources": [{"id": "data-source-id", "name": "Database Name"}]
}
```
**Note:** This endpoint returns `properties: null`. Use `GET /data_sources/{id}` to get the schema.
#### Create Database
```bash
POST /notion/v1/databases
Content-Type: application/json
Notion-Version: 2025-09-03
{
"parent": {"type": "page_id", "page_id": "PARENT_PAGE_ID"},
"title": [{"type": "text", "text": {"content": "New Database"}}],
"properties": {
"Name": {"title": {}},
"Status": {"select": {"options": [{"name": "Active"}, {"name": "Done"}]}}
}
}
```
**Important:** Cannot create databases via `/data_sources` endpoint.
### Pages
#### Get Page
```bash
GET /notion/v1/pages/{pageId}
Notion-Version: 2025-09-03
```
#### Create Page in Data Source
Use `data_source_id` (not `database_id`) as parent:
```bash
POST /notion/v1/pages
Content-Type: application/json
Notion-Version: 2025-09-03
{
"parent": {"data_source_id": "DATA_SOURCE_ID"},
"properties": {
"Name": {"title": [{"text": {"content": "New Page"}}]},
"Status": {"select": {"name": "Active"}}
}
}
```
#### Create Child Page (under another page)
```bash
POST /notion/v1/pages
Content-Type: application/json
Notion-Version: 2025-09-03
{
"parent": {"page_id": "PARENT_PAGE_ID"},
"properties": {
"title": {"title": [{"text": {"content": "Child Page"}}]}
}
}
```
#### Update Page Properties
```bash
PATCH /notion/v1/pages/{pageId}
Content-Type: application/json
Notion-Version: 2025-09-03
{
"properties": {
"Status": {"select": {"name": "Done"}}
}
}
```
#### Archive Page
```bash
PATCH /notion/v1/pages/{pageId}
Content-Type: application/json
Notion-Version: 2025-09-03
{
"archived": true
}
```
### Blocks
#### Get Block
```bash
GET /notion/v1/blocks/{blockId}
Notion-Version: 2025-09-03
```
#### Get Block Children
```bash
GET /notion/v1/blocks/{blockId}/children
Notion-Version: 2025-09-03
```
#### Append Block Children
```bash
PATCH /notion/v1/blocks/{blockId}/children
Content-Type: application/json
Notion-Version: 2025-09-03
{
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "New paragraph"}}]
}
},
{
"object": "block",
"type": "heading_2",
"heading_2": {
"rich_text": [{"type": "text", "text": {"content": "Heading"}}]
}
}
]
}
```
#### Update Block
```bash
PATCH /notion/v1/blocks/{blockId}
Content-Type: application/json
Notion-Version: 2025-09-03
{
"paragraph": {
"rich_text": [{"text": {"content": "Updated text"}}]
}
}
```
#### Delete Block
```bash
DELETE /notion/v1/blocks/{blockId}
Notion-Version: 2025-09-03
```
### Users
#### List Users
```bash
GET /notion/v1/users
Notion-Version: 2025-09-03
```
#### Get User by ID
```bash
GET /notion/v1/users/{userId}
Notion-Version: 2025-09-03
```
#### Get Current User (Bot)
```bash
GET /notion/v1/users/me
Notion-Version: 2025-09-03
```
## Filter Operators
- `equals`, `does_not_equal`
- `contains`, `does_not_contain`
- `starts_with`, `ends_with`
- `is_empty`, `is_not_empty`
- `greater_than`, `less_than`, `greater_than_or_equal_to`, `less_than_or_equal_to`
## Block Types
Common block types for appending:
- `paragraph` - Text paragraph
- `heading_1`, `heading_2`, `heading_3` - Headings
- `bulleted_list_item`, `numbered_list_item` - List items
- `to_do` - Checkbox item
- `code` - Code block
- `quote` - Quote block
- `divider` - Horizontal divider
## Migration from Older API Versions
| Old (2022-06-28) | New (2025-09-03) |
|------------------|------------------|
| `POST /databases/{id}/query` | `POST /data_sources/{id}/query` |
| `GET /databases/{id}` for schema | `GET /data_sources/{id}` for schema |
| `PATCH /databases/{id}` for schema | `PATCH /data_sources/{id}` for schema |
| Parent: `{"database_id": "..."}` | Parent: `{"data_source_id": "..."}` |
| Search filter: `"database"` | Search filter: `"data_source"` |
## Notes
- Use `GET /databases/{id}` to discover `data_source_id`, then use `/data_sources/` for all operations
- Creating databases still requires `POST /databases` endpoint
- Parent objects for create database require `type` field: `{"type": "page_id", "page_id": "..."}`
- All IDs are UUIDs (with or without hyphens)
- Delete blocks returns the block with `archived: true`
## Resources
- [API Introduction](https://developers.notion.com/reference/intro)
- [Search](https://developers.notion.com/reference/post-search.md)
- [Query Database](https://developers.notion.com/reference/post-database-query.md)
- [Get Database](https://developers.notion.com/reference/retrieve-a-database.md)
- [Create Database](https://developers.notion.com/reference/create-a-database.md)
- [Get Page](https://developers.notion.com/reference/retrieve-a-page.md)
- [Create Page](https://developers.notion.com/reference/post-page.md)
- [Update Page](https://developers.notion.com/reference/patch-page.md)
- [Get Block Children](https://developers.notion.com/reference/get-block-children.md)
- [Append Block Children](https://developers.notion.com/reference/patch-block-children.md)
- [List Users](https://developers.notion.com/reference/get-users.md)
- [Filter Reference](https://developers.notion.com/reference/post-database-query-filter.md)
- [LLM Reference](https://developers.notion.com/llms.txt)
- [Version Reference](https://developers.notion.com/guides/get-started/upgrade-guide-2025-09-03)

View File

@@ -0,0 +1,118 @@
# OneDrive Routing Reference
**App name:** `one-drive`
**Base URL proxied:** `graph.microsoft.com`
## API Path Pattern
```
/one-drive/v1.0/me/drive/{resource}
```
## Common Endpoints
### Get User's Drive
```bash
GET /one-drive/v1.0/me/drive
```
### List Drives
```bash
GET /one-drive/v1.0/me/drives
```
### Get Drive Root
```bash
GET /one-drive/v1.0/me/drive/root
```
### List Root Children
```bash
GET /one-drive/v1.0/me/drive/root/children
```
### Get Item by ID
```bash
GET /one-drive/v1.0/me/drive/items/{item-id}
```
### Get Item by Path
```bash
GET /one-drive/v1.0/me/drive/root:/Documents/file.txt
```
### List Folder Children by Path
```bash
GET /one-drive/v1.0/me/drive/root:/Documents:/children
```
### Create Folder
```bash
POST /one-drive/v1.0/me/drive/root/children
Content-Type: application/json
{
"name": "New Folder",
"folder": {}
}
```
### Upload File (Simple - up to 4MB)
```bash
PUT /one-drive/v1.0/me/drive/root:/filename.txt:/content
Content-Type: text/plain
{file content}
```
### Delete Item
```bash
DELETE /one-drive/v1.0/me/drive/items/{item-id}
```
### Create Sharing Link
```bash
POST /one-drive/v1.0/me/drive/items/{item-id}/createLink
Content-Type: application/json
{
"type": "view",
"scope": "anonymous"
}
```
### Search Files
```bash
GET /one-drive/v1.0/me/drive/root/search(q='query')
```
### Special Folders
```bash
GET /one-drive/v1.0/me/drive/special/documents
GET /one-drive/v1.0/me/drive/special/photos
```
### Recent Files
```bash
GET /one-drive/v1.0/me/drive/recent
```
### Shared With Me
```bash
GET /one-drive/v1.0/me/drive/sharedWithMe
```
## Notes
- Authentication is automatic - the router injects the OAuth token
- Uses Microsoft Graph API (`graph.microsoft.com`)
- Use colon (`:`) syntax for path-based addressing
- Simple uploads limited to 4MB; use resumable upload for larger files
- Download URLs in `@microsoft.graph.downloadUrl` are pre-authenticated
- Supports OData query parameters: `$select`, `$expand`, `$filter`, `$orderby`, `$top`
## Resources
- [OneDrive Developer Documentation](https://learn.microsoft.com/en-us/onedrive/developer/)
- [Microsoft Graph API Reference](https://learn.microsoft.com/en-us/graph/api/overview)
- [DriveItem Resource](https://learn.microsoft.com/en-us/graph/api/resources/driveitem)

View File

@@ -0,0 +1,238 @@
# Outlook Routing Reference
**App name:** `outlook`
**Base URL proxied:** `graph.microsoft.com`
## API Path Pattern
```
/outlook/v1.0/me/{resource}
```
## Common Endpoints
### User Profile
```bash
GET /outlook/v1.0/me
```
### Mail Folders
#### List Mail Folders
```bash
GET /outlook/v1.0/me/mailFolders
```
Well-known folder names: `Inbox`, `Drafts`, `SentItems`, `DeletedItems`, `Archive`, `JunkEmail`
#### Get Mail Folder
```bash
GET /outlook/v1.0/me/mailFolders/{folderId}
```
#### Create Mail Folder
```bash
POST /outlook/v1.0/me/mailFolders
Content-Type: application/json
{
"displayName": "My Folder"
}
```
### Messages
#### List Messages
```bash
GET /outlook/v1.0/me/messages
```
From specific folder:
```bash
GET /outlook/v1.0/me/mailFolders/Inbox/messages
```
With filter:
```bash
GET /outlook/v1.0/me/messages?$filter=isRead eq false&$top=10
```
#### Get Message
```bash
GET /outlook/v1.0/me/messages/{messageId}
```
#### Send Message
```bash
POST /outlook/v1.0/me/sendMail
Content-Type: application/json
{
"message": {
"subject": "Hello",
"body": {
"contentType": "Text",
"content": "This is the email body."
},
"toRecipients": [
{
"emailAddress": {
"address": "recipient@example.com"
}
}
]
},
"saveToSentItems": true
}
```
#### Create Draft
```bash
POST /outlook/v1.0/me/messages
Content-Type: application/json
{
"subject": "Hello",
"body": {
"contentType": "Text",
"content": "This is the email body."
},
"toRecipients": [
{
"emailAddress": {
"address": "recipient@example.com"
}
}
]
}
```
#### Send Existing Draft
```bash
POST /outlook/v1.0/me/messages/{messageId}/send
```
#### Update Message (Mark as Read)
```bash
PATCH /outlook/v1.0/me/messages/{messageId}
Content-Type: application/json
{
"isRead": true
}
```
#### Delete Message
```bash
DELETE /outlook/v1.0/me/messages/{messageId}
```
#### Move Message
```bash
POST /outlook/v1.0/me/messages/{messageId}/move
Content-Type: application/json
{
"destinationId": "{folderId}"
}
```
### Calendar
#### List Calendars
```bash
GET /outlook/v1.0/me/calendars
```
#### List Events
```bash
GET /outlook/v1.0/me/calendar/events
```
With filter:
```bash
GET /outlook/v1.0/me/calendar/events?$filter=start/dateTime ge '2024-01-01'&$top=10
```
#### Create Event
```bash
POST /outlook/v1.0/me/calendar/events
Content-Type: application/json
{
"subject": "Meeting",
"start": {
"dateTime": "2024-01-15T10:00:00",
"timeZone": "UTC"
},
"end": {
"dateTime": "2024-01-15T11:00:00",
"timeZone": "UTC"
},
"attendees": [
{
"emailAddress": {
"address": "attendee@example.com"
},
"type": "required"
}
]
}
```
#### Delete Event
```bash
DELETE /outlook/v1.0/me/events/{eventId}
```
### Contacts
#### List Contacts
```bash
GET /outlook/v1.0/me/contacts
```
#### Create Contact
```bash
POST /outlook/v1.0/me/contacts
Content-Type: application/json
{
"givenName": "John",
"surname": "Doe",
"emailAddresses": [
{
"address": "john.doe@example.com"
}
]
}
```
#### Delete Contact
```bash
DELETE /outlook/v1.0/me/contacts/{contactId}
```
## OData Query Parameters
- `$top=10` - Limit results
- `$skip=20` - Skip results (pagination)
- `$select=subject,from` - Select specific fields
- `$filter=isRead eq false` - Filter results
- `$orderby=receivedDateTime desc` - Sort results
- `$search="keyword"` - Search content
## Notes
- Use `me` as the user identifier for the authenticated user
- Message body content types: `Text` or `HTML`
- Well-known folder names work as folder IDs: `Inbox`, `Drafts`, `SentItems`, etc.
- Calendar events use ISO 8601 datetime format
## Resources
- [Microsoft Graph API Overview](https://learn.microsoft.com/en-us/graph/api/overview)
- [Mail API](https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview)
- [Calendar API](https://learn.microsoft.com/en-us/graph/api/resources/calendar)
- [Contacts API](https://learn.microsoft.com/en-us/graph/api/resources/contact)
- [Query Parameters](https://learn.microsoft.com/en-us/graph/query-parameters)

View File

@@ -0,0 +1,161 @@
# Pipedrive Routing Reference
**App name:** `pipedrive`
**Base URL proxied:** `api.pipedrive.com`
## API Path Pattern
```
/pipedrive/api/v1/{resource}
```
## Common Endpoints
### List Deals
```bash
GET /pipedrive/api/v1/deals?status=open&limit=50
```
### Get Deal
```bash
GET /pipedrive/api/v1/deals/{id}
```
### Create Deal
```bash
POST /pipedrive/api/v1/deals
Content-Type: application/json
{
"title": "New Enterprise Deal",
"value": 50000,
"currency": "USD",
"person_id": 123,
"org_id": 456,
"stage_id": 1,
"expected_close_date": "2025-06-30"
}
```
### Update Deal
```bash
PUT /pipedrive/api/v1/deals/{id}
Content-Type: application/json
{
"title": "Updated Deal Title",
"value": 75000,
"status": "won"
}
```
### Delete Deal
```bash
DELETE /pipedrive/api/v1/deals/{id}
```
### Search Deals
```bash
GET /pipedrive/api/v1/deals/search?term=enterprise
```
### List Persons
```bash
GET /pipedrive/api/v1/persons
```
### Create Person
```bash
POST /pipedrive/api/v1/persons
Content-Type: application/json
{
"name": "John Doe",
"email": ["john@example.com"],
"phone": ["+1234567890"],
"org_id": 456
}
```
### List Organizations
```bash
GET /pipedrive/api/v1/organizations
```
### Create Organization
```bash
POST /pipedrive/api/v1/organizations
Content-Type: application/json
{
"name": "Acme Corporation",
"address": "123 Main St, City, Country"
}
```
### List Activities
```bash
GET /pipedrive/api/v1/activities?type=call&done=0
```
### Create Activity
```bash
POST /pipedrive/api/v1/activities
Content-Type: application/json
{
"subject": "Follow-up call",
"type": "call",
"due_date": "2025-03-15",
"due_time": "14:00",
"deal_id": 789,
"person_id": 123
}
```
### List Pipelines
```bash
GET /pipedrive/api/v1/pipelines
```
### List Stages
```bash
GET /pipedrive/api/v1/stages?pipeline_id=1
```
### Create Note
```bash
POST /pipedrive/api/v1/notes
Content-Type: application/json
{
"content": "Meeting notes: Discussed pricing and timeline",
"deal_id": 789,
"pinned_to_deal_flag": 1
}
```
### Get Current User
```bash
GET /pipedrive/api/v1/users/me
```
## Notes
- IDs are integers
- Email and phone fields accept arrays for multiple values
- `visible_to` values: 1 (owner only), 3 (entire company), 5 (owner's visibility group), 7 (entire company and visibility group)
- Deal status: `open`, `won`, `lost`, `deleted`
- Use `start` and `limit` for pagination
- Custom fields are supported via their API key (e.g., `abc123_custom_field`)
## Resources
- [Pipedrive API Overview](https://developers.pipedrive.com/docs/api/v1)
- [Deals](https://developers.pipedrive.com/docs/api/v1/Deals)
- [Persons](https://developers.pipedrive.com/docs/api/v1/Persons)
- [Organizations](https://developers.pipedrive.com/docs/api/v1/Organizations)
- [Activities](https://developers.pipedrive.com/docs/api/v1/Activities)
- [Pipelines](https://developers.pipedrive.com/docs/api/v1/Pipelines)
- [Stages](https://developers.pipedrive.com/docs/api/v1/Stages)
- [Notes](https://developers.pipedrive.com/docs/api/v1/Notes)

View File

@@ -0,0 +1,384 @@
# QuickBooks Routing Reference
**App name:** `quickbooks`
**Base URL proxied:** `quickbooks.api.intuit.com`
## Special Handling
Use `:realmId` in the path and it will be automatically replaced with the connected company's realm ID.
## API Path Pattern
```
/quickbooks/v3/company/:realmId/{endpoint}
```
## Common Endpoints
### Company Info
#### Get Company Info
```bash
GET /quickbooks/v3/company/:realmId/companyinfo/:realmId
```
#### Get Preferences
```bash
GET /quickbooks/v3/company/:realmId/preferences
```
### Customers
#### Query Customers
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Customer%20MAXRESULTS%20100
```
With filter:
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Customer%20WHERE%20Active%3Dtrue
```
#### Get Customer
```bash
GET /quickbooks/v3/company/:realmId/customer/{customerId}
```
#### Create Customer
```bash
POST /quickbooks/v3/company/:realmId/customer
Content-Type: application/json
{
"DisplayName": "John Doe",
"PrimaryEmailAddr": {"Address": "john@example.com"},
"PrimaryPhone": {"FreeFormNumber": "555-1234"}
}
```
#### Update Customer
Requires `Id` and `SyncToken` from previous GET:
```bash
POST /quickbooks/v3/company/:realmId/customer
Content-Type: application/json
{
"Id": "123",
"SyncToken": "0",
"DisplayName": "John Doe Updated",
"PrimaryPhone": {"FreeFormNumber": "555-9999"}
}
```
#### Deactivate Customer (Soft Delete)
```bash
POST /quickbooks/v3/company/:realmId/customer
Content-Type: application/json
{
"Id": "123",
"SyncToken": "1",
"DisplayName": "John Doe",
"Active": false
}
```
### Vendors
#### Query Vendors
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Vendor%20MAXRESULTS%20100
```
#### Get Vendor
```bash
GET /quickbooks/v3/company/:realmId/vendor/{vendorId}
```
#### Create Vendor
```bash
POST /quickbooks/v3/company/:realmId/vendor
Content-Type: application/json
{
"DisplayName": "Acme Supplies",
"PrimaryEmailAddr": {"Address": "vendor@example.com"}
}
```
### Items (Products/Services)
#### Query Items
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Item%20MAXRESULTS%20100
```
#### Get Item
```bash
GET /quickbooks/v3/company/:realmId/item/{itemId}
```
#### Create Item
```bash
POST /quickbooks/v3/company/:realmId/item
Content-Type: application/json
{
"Name": "Consulting Services",
"Type": "Service",
"IncomeAccountRef": {"value": "1"}
}
```
### Invoices
#### Query Invoices
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Invoice%20MAXRESULTS%20100
```
#### Get Invoice
```bash
GET /quickbooks/v3/company/:realmId/invoice/{invoiceId}
```
#### Create Invoice
```bash
POST /quickbooks/v3/company/:realmId/invoice
Content-Type: application/json
{
"CustomerRef": {"value": "123"},
"Line": [
{
"Amount": 100.00,
"DetailType": "SalesItemLineDetail",
"SalesItemLineDetail": {
"ItemRef": {"value": "1"},
"Qty": 1
}
}
]
}
```
#### Void Invoice
```bash
POST /quickbooks/v3/company/:realmId/invoice?operation=void
Content-Type: application/json
{
"Id": "123",
"SyncToken": "0"
}
```
#### Delete Invoice
```bash
POST /quickbooks/v3/company/:realmId/invoice?operation=delete
Content-Type: application/json
{
"Id": "123",
"SyncToken": "0"
}
```
### Payments
#### Query Payments
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Payment%20MAXRESULTS%20100
```
#### Create Payment
Simple payment:
```bash
POST /quickbooks/v3/company/:realmId/payment
Content-Type: application/json
{
"CustomerRef": {"value": "123"},
"TotalAmt": 100.00
}
```
Payment linked to invoice:
```bash
POST /quickbooks/v3/company/:realmId/payment
Content-Type: application/json
{
"CustomerRef": {"value": "123"},
"TotalAmt": 100.00,
"Line": [
{
"Amount": 100.00,
"LinkedTxn": [{"TxnId": "456", "TxnType": "Invoice"}]
}
]
}
```
### Bills
#### Query Bills
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Bill%20MAXRESULTS%20100
```
#### Create Bill
```bash
POST /quickbooks/v3/company/:realmId/bill
Content-Type: application/json
{
"VendorRef": {"value": "123"},
"Line": [
{
"DetailType": "AccountBasedExpenseLineDetail",
"Amount": 250.00,
"AccountBasedExpenseLineDetail": {
"AccountRef": {"value": "1"}
}
}
]
}
```
### Bill Payments
#### Create Bill Payment
```bash
POST /quickbooks/v3/company/:realmId/billpayment
Content-Type: application/json
{
"VendorRef": {"value": "123"},
"TotalAmt": 250.00,
"PayType": "Check",
"CheckPayment": {
"BankAccountRef": {"value": "23"}
},
"Line": [
{
"Amount": 250.00,
"LinkedTxn": [{"TxnId": "456", "TxnType": "Bill"}]
}
]
}
```
**Note:** Use a Bank account (AccountType: "Bank") for `BankAccountRef`.
### Accounts
#### Query Accounts
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Account
```
Filter by type:
```bash
GET /quickbooks/v3/company/:realmId/query?query=SELECT%20*%20FROM%20Account%20WHERE%20AccountType%20%3D%20%27Bank%27
```
### Reports
#### Profit and Loss
```bash
GET /quickbooks/v3/company/:realmId/reports/ProfitAndLoss?start_date=2024-01-01&end_date=2024-12-31
```
#### Balance Sheet
```bash
GET /quickbooks/v3/company/:realmId/reports/BalanceSheet?date=2024-12-31
```
### Batch Operations
Execute multiple queries in a single request:
```bash
POST /quickbooks/v3/company/:realmId/batch
Content-Type: application/json
{
"BatchItemRequest": [
{"bId": "1", "Query": "SELECT * FROM Customer MAXRESULTS 2"},
{"bId": "2", "Query": "SELECT * FROM Vendor MAXRESULTS 2"}
]
}
```
## Query Language
QuickBooks uses a SQL-like query language:
```sql
SELECT * FROM Customer WHERE DisplayName LIKE 'John%' MAXRESULTS 100
```
Operators: `=`, `LIKE`, `<`, `>`, `<=`, `>=`, `IN`
## SyncToken for Updates
All update operations require the current `SyncToken` from the entity. The SyncToken is incremented after each successful update.
1. GET the entity to retrieve current `SyncToken`
2. Include `Id` and `SyncToken` in the POST body
3. If the SyncToken doesn't match, the update fails (optimistic locking)
## Void vs Delete
- **Void**: Sets transaction amount to 0, adds "Voided" note, keeps record. Use for audit trail.
- **Delete**: Permanently removes the transaction. Use `?operation=delete` query parameter.
Both require `Id` and `SyncToken` in the request body.
## Notes
- `:realmId` is automatically replaced by the router
- All queries must be URL-encoded
- Use `MAXRESULTS` to limit query results (default varies by entity)
- Include `SyncToken` when updating entities (for optimistic locking)
- Dates are in `YYYY-MM-DD` format
- Soft delete entities (Customer, Vendor, Item) by setting `Active: false`
- Transactions (Invoice, Payment, Bill) can be voided or deleted
## Resources
- [API Overview](https://developer.intuit.com/app/developer/qbo/docs/get-started)
- [Query Customers](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/customer#query-a-customer)
- [Get Customer](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/customer#read-a-customer)
- [Create Customer](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/customer#create-a-customer)
- [Update Customer](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/customer#full-update-a-customer)
- [Query Invoices](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#query-an-invoice)
- [Get Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#read-an-invoice)
- [Create Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#create-an-invoice)
- [Update Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#full-update-an-invoice)
- [Delete Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#delete-an-invoice)
- [Send Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/invoice#send-an-invoice)
- [Query Items](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/item#query-an-item)
- [Get Item](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/item#read-an-item)
- [Create Item](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/item#create-an-item)
- [Update Item](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/item#full-update-an-item)
- [Query Accounts](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/account#query-an-account)
- [Get Account](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/account#read-an-account)
- [Create Account](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/account#create-an-account)
- [Update Account](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/account#full-update-an-account)
- [Query Payments](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment#query-a-payment)
- [Get Payment](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment#read-a-payment)
- [Create Payment](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment#create-a-payment)
- [Update Payment](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment#full-update-a-payment)
- [Delete Payment](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/payment#delete-a-payment)
- [Query Vendors](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/vendor#query-a-vendor)
- [Get Vendor](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/vendor#read-a-vendor)
- [Create Vendor](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/vendor#create-a-vendor)
- [Update Vendor](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/vendor#full-update-a-vendor)
- [Query Bills](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/bill#query-a-bill)
- [Get Bill](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/bill#read-a-bill)
- [Create Bill](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/bill#create-a-bill)
- [Update Bill](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/bill#full-update-a-bill)
- [Delete Bill](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/bill#delete-a-bill)
- [Profit and Loss Report](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/report-entities/profitandloss)
- [Balance Sheet Report](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/report-entities/balancesheet)
- [Query Reference](https://developer.intuit.com/app/developer/qbdesktop/docs/develop/exploring-the-quickbooks-desktop-sdk/query-requests-and-responses)

View File

@@ -0,0 +1,188 @@
# Quo Routing Reference
**App name:** `quo`
**Base URL proxied:** `api.openphone.com`
## API Path Pattern
```
/quo/v1/{resource}
```
## Common Endpoints
### Phone Numbers
#### List Phone Numbers
```bash
GET /quo/v1/phone-numbers
```
### Users
#### List Users
```bash
GET /quo/v1/users?maxResults=50
```
#### Get User
```bash
GET /quo/v1/users/{userId}
```
### Messages
#### Send Text Message
```bash
POST /quo/v1/messages
Content-Type: application/json
{
"content": "Hello, world!",
"from": "PN123abc",
"to": ["+15555555555"]
}
```
#### List Messages
```bash
GET /quo/v1/messages?phoneNumberId=PN123abc&participants[]=+15555555555&maxResults=100
```
#### Get Message
```bash
GET /quo/v1/messages/{messageId}
```
### Calls
#### List Calls
```bash
GET /quo/v1/calls?phoneNumberId=PN123abc&participants[]=+15555555555&maxResults=100
```
#### Get Call
```bash
GET /quo/v1/calls/{callId}
```
#### Get Call Recordings
```bash
GET /quo/v1/call-recordings/{callId}
```
#### Get Call Summary
```bash
GET /quo/v1/call-summaries/{callId}
```
#### Get Call Transcript
```bash
GET /quo/v1/call-transcripts/{callId}
```
#### Get Call Voicemail
```bash
GET /quo/v1/call-voicemails/{callId}
```
### Contacts
#### List Contacts
```bash
GET /quo/v1/contacts?maxResults=50
```
#### Get Contact
```bash
GET /quo/v1/contacts/{contactId}
```
#### Create Contact
```bash
POST /quo/v1/contacts
Content-Type: application/json
{
"defaultFields": {
"firstName": "Jane",
"lastName": "Doe",
"phoneNumbers": [{"name": "mobile", "value": "+15555555555"}]
}
}
```
#### Update Contact
```bash
PATCH /quo/v1/contacts/{contactId}
Content-Type: application/json
{
"defaultFields": {
"company": "New Company"
}
}
```
#### Delete Contact
```bash
DELETE /quo/v1/contacts/{contactId}
```
#### Get Contact Custom Fields
```bash
GET /quo/v1/contact-custom-fields
```
### Conversations
#### List Conversations
```bash
GET /quo/v1/conversations?maxResults=100
```
### Webhooks
#### List Webhooks
```bash
GET /quo/v1/webhooks
```
#### Get Webhook
```bash
GET /quo/v1/webhooks/{webhookId}
```
#### Create Webhook
```bash
POST /quo/v1/webhooks
Content-Type: application/json
{
"url": "https://your-webhook-url.com/calls",
"resourceType": "call"
}
```
Resource types: `call`, `message`, `callSummary`, `callTranscript`
#### Delete Webhook
```bash
DELETE /quo/v1/webhooks/{webhookId}
```
## Notes
- Phone number IDs start with `PN`
- User IDs start with `US`
- Call/Message IDs start with `AC`
- Phone numbers must be in E.164 format (e.g., `+15555555555`)
- Uses token-based pagination with `pageToken` parameter
- Maximum 1600 characters per SMS message
- List calls requires exactly 1 participant (1:1 conversations only)
## Resources
- [Quo API Introduction](https://www.quo.com/docs/mdx/api-reference/introduction)
- [Quo API Authentication](https://www.quo.com/docs/mdx/api-reference/authentication)
- [Quo Support Center](https://support.quo.com/core-concepts/integrations/api)

View File

@@ -0,0 +1,193 @@
# Salesforce Routing Reference
**App name:** `salesforce`
**Base URL proxied:** `{instance}.salesforce.com`
The router automatically determines the instance URL from your OAuth credentials (`instance_url` from the token response).
## API Path Pattern
```
/salesforce/services/data/v59.0/{endpoint}
```
## Common Endpoints
### SOQL Query
```bash
GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10
```
Complex query:
```bash
GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name,Email+FROM+Contact+WHERE+Email+LIKE+'%example.com'+ORDER+BY+CreatedDate+DESC
```
### Get Object
```bash
GET /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
```
Example:
```bash
GET /salesforce/services/data/v59.0/sobjects/Contact/003XXXXXXXXXXXXXXX
```
### Create Object
```bash
POST /salesforce/services/data/v59.0/sobjects/{objectType}
Content-Type: application/json
{
"FirstName": "John",
"LastName": "Doe",
"Email": "john@example.com"
}
```
### Update Object
```bash
PATCH /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
Content-Type: application/json
{
"Phone": "+1234567890"
}
```
### Delete Object
```bash
DELETE /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId}
```
### Describe Object (get schema)
```bash
GET /salesforce/services/data/v59.0/sobjects/{objectType}/describe
```
### List Objects
```bash
GET /salesforce/services/data/v59.0/sobjects
```
### Search (SOSL)
```bash
GET /salesforce/services/data/v59.0/search?q=FIND+{searchTerm}+IN+ALL+FIELDS+RETURNING+Contact(Id,Name)
```
### Composite Request (batch multiple operations)
```bash
POST /salesforce/services/data/v59.0/composite
Content-Type: application/json
{
"compositeRequest": [
{
"method": "GET",
"url": "/services/data/v59.0/sobjects/Contact/003XXXXXXX",
"referenceId": "contact1"
},
{
"method": "GET",
"url": "/services/data/v59.0/sobjects/Account/001XXXXXXX",
"referenceId": "account1"
}
]
}
```
### Composite Batch Request
```bash
POST /salesforce/services/data/v59.0/composite/batch
Content-Type: application/json
{
"batchRequests": [
{"method": "GET", "url": "v59.0/sobjects/Contact/003XXXXXXX"},
{"method": "GET", "url": "v59.0/sobjects/Account/001XXXXXXX"}
]
}
```
### sObject Collections Create (batch create)
```bash
POST /salesforce/services/data/v59.0/composite/sobjects
Content-Type: application/json
{
"allOrNone": true,
"records": [
{"attributes": {"type": "Contact"}, "FirstName": "John", "LastName": "Doe"},
{"attributes": {"type": "Contact"}, "FirstName": "Jane", "LastName": "Smith"}
]
}
```
### sObject Collections Delete (batch delete)
```bash
DELETE /salesforce/services/data/v59.0/composite/sobjects?ids=003XXXXX,003YYYYY&allOrNone=true
```
### Get Updated Records
```bash
GET /salesforce/services/data/v59.0/sobjects/{objectType}/updated/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z
```
### Get Deleted Records
```bash
GET /salesforce/services/data/v59.0/sobjects/{objectType}/deleted/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z
```
### Get API Limits
```bash
GET /salesforce/services/data/v59.0/limits
```
### List API Versions
```bash
GET /salesforce/services/data/
```
## Common Objects
- `Account` - Companies/Organizations
- `Contact` - People associated with accounts
- `Lead` - Potential customers
- `Opportunity` - Sales deals
- `Case` - Support cases
- `Task` - To-do items
- `Event` - Calendar events
## Notes
- Use URL encoding for SOQL queries (spaces become `+`)
- Record IDs are 15 or 18 character alphanumeric strings
- API version (v59.0) can be adjusted; latest is v65.0
- Update and Delete operations return HTTP 204 (no content) on success
- Dates for updated/deleted queries use ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`
- Use `allOrNone: true` in batch operations for atomic transactions
## Resources
- [REST API Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm)
- [List sObjects](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_describeGlobal.htm)
- [Describe sObject](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_describe.htm)
- [Get Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_retrieve_get.htm)
- [Get Record by External ID](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_upsert_get.htm)
- [Create Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_create.htm)
- [Update Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_update_fields.htm)
- [Delete Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_delete_record.htm)
- [Upsert Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_upsert.htm)
- [Query Records (SOQL)](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_query.htm)
- [Get Updated Records](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_getupdated.htm)
- [Get Deleted Records](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_getdeleted.htm)
- [Composite Request](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_composite_post.htm)
- [Composite Batch Request](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/requests_composite_batch.htm)
- [Composite Batch Response](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/responses_composite_batch.htm)
- [Composite Graph](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_graph.htm)
- [sObject Collections Create](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_sobjects_collections_create.htm)
- [sObject Collections Update](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_sobjects_collections_update.htm)
- [sObject Collections Delete](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_sobjects_collections_delete.htm)
- [SOQL Reference](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm)
- [SOSL Reference](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl.htm)
- [API Resources List](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_list.htm)

View File

@@ -0,0 +1,96 @@
# SignNow Routing Reference
**App name:** `signnow`
**Base URL proxied:** `api.signnow.com`
## API Path Pattern
```
/signnow/{resource}
```
## Common Endpoints
### User
```bash
GET /signnow/user
GET /signnow/user/documents
```
### Documents
```bash
# Upload document (multipart form data)
POST /signnow/document
# Get document
GET /signnow/document/{document_id}
# Update document
PUT /signnow/document/{document_id}
# Download document
GET /signnow/document/{document_id}/download?type=collapsed
# Get document history
GET /signnow/document/{document_id}/historyfull
# Move document to folder
POST /signnow/document/{document_id}/move
# Merge documents (returns PDF)
POST /signnow/document/merge
# Delete document
DELETE /signnow/document/{document_id}
```
### Templates
```bash
# Create template from document
POST /signnow/template
# Create document from template
POST /signnow/template/{template_id}/copy
```
### Invites
```bash
# Send freeform invite
POST /signnow/document/{document_id}/invite
# Create signing link (requires document fields)
POST /signnow/link
```
### Folders
```bash
GET /signnow/folder
GET /signnow/folder/{folder_id}
```
### Webhooks (Event Subscriptions)
```bash
GET /signnow/event_subscription
POST /signnow/event_subscription
DELETE /signnow/event_subscription/{subscription_id}
```
## Notes
- Documents must be uploaded as multipart form data with PDF file
- Supported file types: PDF, DOC, DOCX, ODT, RTF, PNG, JPG
- System folders cannot be renamed or deleted
- Creating signing links requires documents to have signature fields
- Custom invite subject/message requires paid subscription
- Rate limit in development mode: 500 requests/hour per application
## Resources
- [SignNow API Reference](https://docs.signnow.com/docs/signnow/reference)
- [SignNow Developer Portal](https://www.signnow.com/developers)

View File

@@ -0,0 +1,178 @@
# Slack Routing Reference
**App name:** `slack`
**Base URL proxied:** `slack.com`
## API Path Pattern
```
/slack/api/{method}
```
## Common Endpoints
### Post Message
```bash
POST /slack/api/chat.postMessage
Content-Type: application/json
{
"channel": "C0123456789",
"text": "Hello, world!"
}
```
With blocks:
```bash
POST /slack/api/chat.postMessage
Content-Type: application/json
{
"channel": "C0123456789",
"blocks": [
{"type": "section", "text": {"type": "mrkdwn", "text": "*Bold* and _italic_"}}
]
}
```
### List Channels
```bash
GET /slack/api/conversations.list?types=public_channel,private_channel
```
### Get Channel Info
```bash
GET /slack/api/conversations.info?channel=C0123456789
```
### List Messages in Channel
```bash
GET /slack/api/conversations.history?channel=C0123456789&limit=100
```
### Get Thread Replies
```bash
GET /slack/api/conversations.replies?channel=C0123456789&ts=1234567890.123456
```
### List Users
```bash
GET /slack/api/users.list
```
### Get User Info
```bash
GET /slack/api/users.info?user=U0123456789
```
### Search Messages
```bash
GET /slack/api/search.messages?query=keyword
```
### Upload File
```bash
POST /slack/api/files.upload
Content-Type: multipart/form-data
channels=C0123456789
content=file content here
filename=example.txt
```
### Add Reaction
```bash
POST /slack/api/reactions.add
Content-Type: application/json
{
"channel": "C0123456789",
"name": "thumbsup",
"timestamp": "1234567890.123456"
}
```
### Update Message
```bash
POST /slack/api/chat.update
Content-Type: application/json
{
"channel": "C0123456789",
"ts": "1234567890.123456",
"text": "Updated message"
}
```
### Delete Message
```bash
POST /slack/api/chat.delete
Content-Type: application/json
{
"channel": "C0123456789",
"ts": "1234567890.123456"
}
```
### Post Thread Reply
```bash
POST /slack/api/chat.postMessage
Content-Type: application/json
{
"channel": "C0123456789",
"thread_ts": "1234567890.123456",
"text": "This is a reply in a thread"
}
```
### Get Channel Members
```bash
GET /slack/api/conversations.members?channel=C0123456789&limit=100
```
### Open DM Conversation
```bash
POST /slack/api/conversations.open
Content-Type: application/json
{
"users": "U0123456789"
}
```
### Auth Test (get current user/team)
```bash
GET /slack/api/auth.test
```
## Notes
- Authentication is automatic - the router uses the user's OAuth access token
- Channel IDs start with `C` (public), `G` (private/group), or `D` (DM)
- User IDs start with `U`, Team IDs start with `T`
- Message timestamps (`ts`) are used as unique identifiers
- Use `mrkdwn` type for Slack-flavored markdown formatting
- Thread replies use `thread_ts` to reference the parent message
## Resources
- [API Overview](https://api.slack.com/apis)
- [Post Message](https://api.slack.com/methods/chat.postMessage)
- [Update Message](https://api.slack.com/methods/chat.update)
- [Delete Message](https://api.slack.com/methods/chat.delete)
- [List Channels](https://api.slack.com/methods/conversations.list)
- [Get Channel Info](https://api.slack.com/methods/conversations.info)
- [Get Channel Members](https://api.slack.com/methods/conversations.members)
- [Open Conversation](https://api.slack.com/methods/conversations.open)
- [Channel History](https://api.slack.com/methods/conversations.history)
- [Thread Replies](https://api.slack.com/methods/conversations.replies)
- [List Users](https://api.slack.com/methods/users.list)
- [Get User Info](https://api.slack.com/methods/users.info)
- [Auth Test](https://api.slack.com/methods/auth.test)
- [Search Messages](https://api.slack.com/methods/search.messages)
- [Upload File](https://api.slack.com/methods/files.upload)
- [Add Reaction](https://api.slack.com/methods/reactions.add)
- [Block Kit Reference](https://api.slack.com/reference/block-kit)
- [LLM Reference](https://docs.slack.dev/llms.txt)

View File

@@ -0,0 +1,262 @@
# Square Routing Reference
**App name:** `squareup`
**Base URL proxied:** `connect.squareup.com`
## API Path Pattern
```
/squareup/v2/{resource}
```
## Common Endpoints
### Locations
#### List Locations
```bash
GET /squareup/v2/locations
```
#### Get Location
```bash
GET /squareup/v2/locations/{location_id}
```
#### Create Location
```bash
POST /squareup/v2/locations
Content-Type: application/json
{
"location": {
"name": "New Location",
"address": {...}
}
}
```
### Merchants
#### Get Current Merchant
```bash
GET /squareup/v2/merchants/me
```
### Payments
#### List Payments
```bash
GET /squareup/v2/payments
GET /squareup/v2/payments?location_id={location_id}&begin_time=2026-01-01T00:00:00Z
```
#### Get Payment
```bash
GET /squareup/v2/payments/{payment_id}
```
#### Create Payment
```bash
POST /squareup/v2/payments
Content-Type: application/json
{
"source_id": "cnon:card-nonce-ok",
"idempotency_key": "unique-key",
"amount_money": {"amount": 1000, "currency": "USD"},
"location_id": "{location_id}"
}
```
#### Complete Payment
```bash
POST /squareup/v2/payments/{payment_id}/complete
```
#### Cancel Payment
```bash
POST /squareup/v2/payments/{payment_id}/cancel
```
### Refunds
#### List Refunds
```bash
GET /squareup/v2/refunds
```
#### Create Refund
```bash
POST /squareup/v2/refunds
Content-Type: application/json
{
"idempotency_key": "unique-key",
"payment_id": "{payment_id}",
"amount_money": {"amount": 500, "currency": "USD"}
}
```
### Customers
#### List Customers
```bash
GET /squareup/v2/customers
```
#### Get Customer
```bash
GET /squareup/v2/customers/{customer_id}
```
#### Create Customer
```bash
POST /squareup/v2/customers
Content-Type: application/json
{
"given_name": "John",
"family_name": "Doe",
"email_address": "john@example.com"
}
```
#### Search Customers
```bash
POST /squareup/v2/customers/search
Content-Type: application/json
{
"query": {"filter": {"email_address": {"exact": "john@example.com"}}}
}
```
### Orders
#### Create Order
```bash
POST /squareup/v2/orders
Content-Type: application/json
{
"order": {
"location_id": "{location_id}",
"line_items": [{"name": "Item", "quantity": "1", "base_price_money": {"amount": 1000, "currency": "USD"}}]
},
"idempotency_key": "unique-key"
}
```
#### Search Orders
```bash
POST /squareup/v2/orders/search
Content-Type: application/json
{
"location_ids": ["{location_id}"]
}
```
### Catalog
#### List Catalog
```bash
GET /squareup/v2/catalog/list
GET /squareup/v2/catalog/list?types=ITEM,CATEGORY
```
#### Get Catalog Object
```bash
GET /squareup/v2/catalog/object/{object_id}
```
#### Upsert Catalog Object
```bash
POST /squareup/v2/catalog/object
Content-Type: application/json
{
"idempotency_key": "unique-key",
"object": {"type": "ITEM", "id": "#new-item", "item_data": {"name": "Coffee"}}
}
```
#### Search Catalog
```bash
POST /squareup/v2/catalog/search
Content-Type: application/json
{
"object_types": ["ITEM"],
"query": {"text_query": {"keywords": ["coffee"]}}
}
```
### Inventory
#### Get Inventory Count
```bash
GET /squareup/v2/inventory/{catalog_object_id}
```
#### Batch Change Inventory
```bash
POST /squareup/v2/inventory/changes/batch-create
Content-Type: application/json
{
"idempotency_key": "unique-key",
"changes": [...]
}
```
### Invoices
#### List Invoices
```bash
GET /squareup/v2/invoices?location_id={location_id}
```
#### Create Invoice
```bash
POST /squareup/v2/invoices
Content-Type: application/json
{
"invoice": {
"location_id": "{location_id}",
"order_id": "{order_id}",
"primary_recipient": {"customer_id": "{customer_id}"},
"payment_requests": [{"request_type": "BALANCE", "due_date": "2026-02-15"}]
},
"idempotency_key": "unique-key"
}
```
#### Publish Invoice
```bash
POST /squareup/v2/invoices/{invoice_id}/publish
Content-Type: application/json
{"version": 1, "idempotency_key": "unique-key"}
```
## Notes
- All amounts are in smallest currency unit (cents for USD: 1000 = $10.00)
- Most write operations require an `idempotency_key`
- Cursor-based pagination: use `cursor` parameter with value from response
- Timestamps are ISO 8601 format
- Some endpoints require specific OAuth scopes (CUSTOMERS_READ, ORDERS_READ, ITEMS_READ, INVOICES_READ, etc.)
## Resources
- [Square API Overview](https://developer.squareup.com/docs)
- [Square API Reference](https://developer.squareup.com/reference/square)
- [Payments API](https://developer.squareup.com/reference/square/payments-api)
- [Customers API](https://developer.squareup.com/reference/square/customers-api)
- [Orders API](https://developer.squareup.com/reference/square/orders-api)
- [Catalog API](https://developer.squareup.com/reference/square/catalog-api)
- [Inventory API](https://developer.squareup.com/reference/square/inventory-api)
- [Invoices API](https://developer.squareup.com/reference/square/invoices-api)

View File

@@ -0,0 +1,208 @@
# Stripe Routing Reference
**App name:** `stripe`
**Base URL proxied:** `api.stripe.com`
## API Path Pattern
```
/stripe/v1/{endpoint}
```
## Common Endpoints
### Customers
#### List Customers
```bash
GET /stripe/v1/customers?limit=10
```
#### Get Customer
```bash
GET /stripe/v1/customers/{customerId}
```
#### Create Customer
```bash
POST /stripe/v1/customers
Content-Type: application/x-www-form-urlencoded
email=customer@example.com&name=John%20Doe&description=New%20customer
```
#### Update Customer
```bash
POST /stripe/v1/customers/{customerId}
Content-Type: application/x-www-form-urlencoded
email=newemail@example.com
```
### Products
#### List Products
```bash
GET /stripe/v1/products?limit=10&active=true
```
#### Create Product
```bash
POST /stripe/v1/products
Content-Type: application/x-www-form-urlencoded
name=Premium%20Plan&description=Monthly%20subscription
```
### Prices
#### List Prices
```bash
GET /stripe/v1/prices?limit=10&active=true
```
#### Create Price
```bash
POST /stripe/v1/prices
Content-Type: application/x-www-form-urlencoded
unit_amount=1999&currency=usd&product=prod_XXX&recurring[interval]=month
```
### Subscriptions
#### List Subscriptions
```bash
GET /stripe/v1/subscriptions?limit=10&status=active
```
#### Get Subscription
```bash
GET /stripe/v1/subscriptions/{subscriptionId}
```
#### Create Subscription
```bash
POST /stripe/v1/subscriptions
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX&items[0][price]=price_XXX
```
#### Cancel Subscription
```bash
DELETE /stripe/v1/subscriptions/{subscriptionId}
```
### Invoices
#### List Invoices
```bash
GET /stripe/v1/invoices?limit=10&customer=cus_XXX
```
#### Get Invoice
```bash
GET /stripe/v1/invoices/{invoiceId}
```
### Charges
#### List Charges
```bash
GET /stripe/v1/charges?limit=10
```
### Payment Intents
#### Create Payment Intent
```bash
POST /stripe/v1/payment_intents
Content-Type: application/x-www-form-urlencoded
amount=1999&currency=usd&customer=cus_XXX
```
### Balance
#### Get Balance
```bash
GET /stripe/v1/balance
```
### Events
#### List Events
```bash
GET /stripe/v1/events?limit=10&type=customer.created
```
## Notes
- Stripe API uses form-urlencoded data for POST requests
- IDs are prefixed: `cus_` (customer), `sub_` (subscription), `prod_` (product), `price_` (price), `in_` (invoice), `pi_` (payment intent)
- Amounts are in cents (1999 = $19.99)
- Use `expand[]` parameter to include related objects; for list endpoints use `expand[]=data.{field}` (e.g., `expand[]=data.customer`)
- List endpoints support pagination with `starting_after` and `ending_before`
- Delete returns `{id, deleted: true}` on success
- Products with prices cannot be deleted, only archived (`active=false`)
## Resources
- [API Overview](https://docs.stripe.com/api)
- [List Customers](https://docs.stripe.com/api/customers/list.md)
- [Get Customer](https://docs.stripe.com/api/customers/retrieve.md)
- [Create Customer](https://docs.stripe.com/api/customers/create.md)
- [Update Customer](https://docs.stripe.com/api/customers/update.md)
- [Delete Customer](https://docs.stripe.com/api/customers/delete.md)
- [Search Customers](https://docs.stripe.com/api/customers/search.md)
- [List Products](https://docs.stripe.com/api/products/list.md)
- [Get Product](https://docs.stripe.com/api/products/retrieve.md)
- [Create Product](https://docs.stripe.com/api/products/create.md)
- [Update Product](https://docs.stripe.com/api/products/update.md)
- [Delete Product](https://docs.stripe.com/api/products/delete.md)
- [Search Products](https://docs.stripe.com/api/products/search.md)
- [List Prices](https://docs.stripe.com/api/prices/list.md)
- [Get Price](https://docs.stripe.com/api/prices/retrieve.md)
- [Create Price](https://docs.stripe.com/api/prices/create.md)
- [Update Price](https://docs.stripe.com/api/prices/update.md)
- [Search Prices](https://docs.stripe.com/api/prices/search.md)
- [List Subscriptions](https://docs.stripe.com/api/subscriptions/list.md)
- [Get Subscription](https://docs.stripe.com/api/subscriptions/retrieve.md)
- [Create Subscription](https://docs.stripe.com/api/subscriptions/create.md)
- [Update Subscription](https://docs.stripe.com/api/subscriptions/update.md)
- [Cancel Subscription](https://docs.stripe.com/api/subscriptions/cancel.md)
- [Resume Subscription](https://docs.stripe.com/api/subscriptions/resume.md)
- [Search Subscriptions](https://docs.stripe.com/api/subscriptions/search.md)
- [List Invoices](https://docs.stripe.com/api/invoices/list.md)
- [Get Invoice](https://docs.stripe.com/api/invoices/retrieve.md)
- [Create Invoice](https://docs.stripe.com/api/invoices/create.md)
- [Update Invoice](https://docs.stripe.com/api/invoices/update.md)
- [Delete Invoice](https://docs.stripe.com/api/invoices/delete.md)
- [Finalize Invoice](https://docs.stripe.com/api/invoices/finalize.md)
- [Pay Invoice](https://docs.stripe.com/api/invoices/pay.md)
- [Send Invoice](https://docs.stripe.com/api/invoices/send.md)
- [Void Invoice](https://docs.stripe.com/api/invoices/void.md)
- [Search Invoices](https://docs.stripe.com/api/invoices/search.md)
- [List Charges](https://docs.stripe.com/api/charges/list.md)
- [Get Charge](https://docs.stripe.com/api/charges/retrieve.md)
- [Create Charge](https://docs.stripe.com/api/charges/create.md)
- [Update Charge](https://docs.stripe.com/api/charges/update.md)
- [Capture Charge](https://docs.stripe.com/api/charges/capture.md)
- [Search Charges](https://docs.stripe.com/api/charges/search.md)
- [List Payment Intents](https://docs.stripe.com/api/payment_intents/list.md)
- [Get Payment Intent](https://docs.stripe.com/api/payment_intents/retrieve.md)
- [Create Payment Intent](https://docs.stripe.com/api/payment_intents/create.md)
- [Update Payment Intent](https://docs.stripe.com/api/payment_intents/update.md)
- [Confirm Payment Intent](https://docs.stripe.com/api/payment_intents/confirm.md)
- [Capture Payment Intent](https://docs.stripe.com/api/payment_intents/capture.md)
- [Cancel Payment Intent](https://docs.stripe.com/api/payment_intents/cancel.md)
- [Search Payment Intents](https://docs.stripe.com/api/payment_intents/search.md)
- [Get Balance](https://docs.stripe.com/api/balance/balance_retrieve.md)
- [List Balance Transactions](https://docs.stripe.com/api/balance_transactions/list.md)
- [Get Balance Transaction](https://docs.stripe.com/api/balance_transactions/retrieve.md)
- [List Events](https://docs.stripe.com/api/events/list.md)
- [Get Event](https://docs.stripe.com/api/events/retrieve.md)
- [Pagination](https://docs.stripe.com/api/pagination.md)
- [Expanding Responses](https://docs.stripe.com/api/expanding_objects.md)
- [LLM Reference](https://docs.stripe.com/llms.txt)

View File

@@ -0,0 +1,214 @@
# Systeme.io Routing Reference
**App name:** `systeme`
**Base URL proxied:** `api.systeme.io`
## API Path Pattern
```
/systeme/api/{resource}
```
## Common Endpoints
### List Contacts
```bash
GET /systeme/api/contacts
```
Query parameters:
- `limit` - Results per page (10-100)
- `startingAfter` - ID of last item for pagination
- `order` - Sort order: `asc` or `desc` (default: `desc`)
### Get Contact
```bash
GET /systeme/api/contacts/{id}
```
### Create Contact
```bash
POST /systeme/api/contacts
Content-Type: application/json
{
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe"
}
```
### Update Contact
```bash
PATCH /systeme/api/contacts/{id}
Content-Type: application/merge-patch+json
{
"firstName": "Jane"
}
```
### Delete Contact
```bash
DELETE /systeme/api/contacts/{id}
```
### List Tags
```bash
GET /systeme/api/tags
```
### Create Tag
```bash
POST /systeme/api/tags
Content-Type: application/json
{
"name": "VIP Customer"
}
```
### Update Tag
```bash
PUT /systeme/api/tags/{id}
Content-Type: application/json
{
"name": "Premium Customer"
}
```
### Delete Tag
```bash
DELETE /systeme/api/tags/{id}
```
### Assign Tag to Contact
```bash
POST /systeme/api/contacts/{id}/tags
Content-Type: application/json
{
"tagId": 12345
}
```
### Remove Tag from Contact
```bash
DELETE /systeme/api/contacts/{id}/tags/{tagId}
```
### List Contact Fields
```bash
GET /systeme/api/contact_fields
```
### List Courses
```bash
GET /systeme/api/school/courses
```
### Create Enrollment
```bash
POST /systeme/api/school/courses/{courseId}/enrollments
Content-Type: application/json
{
"contactId": 12345
}
```
### List Enrollments
```bash
GET /systeme/api/school/enrollments
```
### Delete Enrollment
```bash
DELETE /systeme/api/school/enrollments/{id}
```
### List Communities
```bash
GET /systeme/api/community/communities
```
### Create Membership
```bash
POST /systeme/api/community/communities/{communityId}/memberships
Content-Type: application/json
{
"contactId": 12345
}
```
### List Memberships
```bash
GET /systeme/api/community/memberships
```
### Delete Membership
```bash
DELETE /systeme/api/community/memberships/{id}
```
### List Subscriptions
```bash
GET /systeme/api/payment/subscriptions
```
### Cancel Subscription
```bash
POST /systeme/api/payment/subscriptions/{id}/cancel
```
### List Webhooks
```bash
GET /systeme/api/webhooks
```
### Create Webhook
```bash
POST /systeme/api/webhooks
Content-Type: application/json
{
"name": "My Webhook",
"url": "https://example.com/webhook",
"secret": "my-secret-key",
"subscriptions": ["CONTACT_CREATED"]
}
```
Available events: `CONTACT_CREATED`, `CONTACT_TAG_ADDED`, `CONTACT_TAG_REMOVED`, `CONTACT_OPT_IN`, `SALE_NEW`, `SALE_CANCELED`
### Update Webhook
```bash
PATCH /systeme/api/webhooks/{id}
Content-Type: application/merge-patch+json
{
"name": "Updated Webhook Name"
}
```
### Delete Webhook
```bash
DELETE /systeme/api/webhooks/{id}
```
## Notes
- Contact, tag, course, and enrollment IDs are numeric integers
- Webhook IDs are UUIDs
- Uses cursor-based pagination with `startingAfter` parameter
- PATCH requests require `Content-Type: application/merge-patch+json`
- Delete operations return 204 No Content
- Email addresses are validated for real MX records
- Payment/subscription endpoints may return 404 if not configured
## Resources
- [Systeme.io API Reference](https://developer.systeme.io/reference)
- [Systeme.io Developer Documentation](https://developer.systeme.io/)

View File

@@ -0,0 +1,174 @@
# Tally Routing Reference
**App name:** `tally`
**Base URL proxied:** `api.tally.so`
## API Path Pattern
```
/tally/{resource}
```
Tally's API does not use version prefixes in paths.
## Required Headers
THe `User-Agent` header is required to avoid Cloudflare blocks:
```
User-Agent: Maton/1.0
```
## Common Endpoints
### Get Current User
```bash
GET /tally/users/me
```
### List Forms
```bash
GET /tally/forms
```
**Query Parameters:**
- `page` - Page number (default: 1)
- `limit` - Items per page (default: 50)
### Get Form
```bash
GET /tally/forms/{formId}
```
### Create Form
```bash
POST /tally/forms
Content-Type: application/json
{
"status": "DRAFT",
"blocks": [
{
"type": "FORM_TITLE",
"uuid": "11111111-1111-1111-1111-111111111111",
"groupUuid": "22222222-2222-2222-2222-222222222222",
"groupType": "FORM_TITLE",
"title": "My Form",
"payload": {}
},
{
"type": "INPUT_TEXT",
"uuid": "33333333-3333-3333-3333-333333333333",
"groupUuid": "44444444-4444-4444-4444-444444444444",
"groupType": "INPUT_TEXT",
"title": "Your name",
"payload": {}
}
]
}
```
### Update Form
```bash
PATCH /tally/forms/{formId}
Content-Type: application/json
{
"name": "Updated Form Name",
"status": "PUBLISHED"
}
```
### Delete Form
```bash
DELETE /tally/forms/{formId}
```
### List Form Questions
```bash
GET /tally/forms/{formId}/questions
```
### List Form Submissions
```bash
GET /tally/forms/{formId}/submissions
```
**Query Parameters:**
- `page` - Page number
- `limit` - Items per page
- `startDate` - Filter by start date (ISO 8601)
- `endDate` - Filter by end date (ISO 8601)
- `afterId` - Cursor for pagination
### Get Submission
```bash
GET /tally/forms/{formId}/submissions/{submissionId}
```
### Delete Submission
```bash
DELETE /tally/forms/{formId}/submissions/{submissionId}
```
### List Workspaces
```bash
GET /tally/workspaces
```
### Get Workspace
```bash
GET /tally/workspaces/{workspaceId}
```
### Create Workspace
```bash
POST /tally/workspaces
Content-Type: application/json
{
"name": "New Workspace"
}
```
### List Organization Users
```bash
GET /tally/organizations/{organizationId}/users
```
### List Organization Invites
```bash
GET /tally/organizations/{organizationId}/invites
```
### List Webhooks
```bash
GET /tally/webhooks
```
### Create Webhook
```bash
POST /tally/webhooks
Content-Type: application/json
{
"formId": "GxdRaQ",
"url": "https://your-endpoint.com/webhook",
"eventTypes": ["FORM_RESPONSE"]
}
```
## Notes
- Form and workspace IDs are short alphanumeric strings (e.g., `GxdRaQ`, `3jW9Q1`)
- Block `uuid` and `groupUuid` fields must be valid UUIDs (GUIDs)
- Page-based pagination with `page` and `limit` parameters
- Rate limit: 100 requests per minute
- API is in public beta and subject to changes
- Creating workspaces requires a Pro subscription
## Resources
- [Tally API Introduction](https://developers.tally.so/api-reference/introduction)
- [Tally API Reference](https://developers.tally.so/llms.txt)
- [Tally Help Center](https://help.tally.so/)

View File

@@ -0,0 +1,195 @@
# Telegram Routing Reference
**App name:** `telegram`
**Base URL proxied:** `api.telegram.org`
## API Path Pattern
```
/telegram/:token/{method}
```
The `:token` placeholder is automatically replaced with the bot token from the connection configuration.
## Common Endpoints
### Get Bot Info
```bash
GET /telegram/:token/getMe
```
### Get Updates
```bash
POST /telegram/:token/getUpdates
Content-Type: application/json
{
"limit": 100,
"timeout": 30
}
```
### Send Message
```bash
POST /telegram/:token/sendMessage
Content-Type: application/json
{
"chat_id": 123456789,
"text": "Hello!",
"parse_mode": "HTML"
}
```
### Send Photo
```bash
POST /telegram/:token/sendPhoto
Content-Type: application/json
{
"chat_id": 123456789,
"photo": "https://example.com/image.jpg",
"caption": "Photo caption"
}
```
### Send Document
```bash
POST /telegram/:token/sendDocument
Content-Type: application/json
{
"chat_id": 123456789,
"document": "https://example.com/file.pdf"
}
```
### Send Location
```bash
POST /telegram/:token/sendLocation
Content-Type: application/json
{
"chat_id": 123456789,
"latitude": 37.7749,
"longitude": -122.4194
}
```
### Send Poll
```bash
POST /telegram/:token/sendPoll
Content-Type: application/json
{
"chat_id": 123456789,
"question": "What is your favorite?",
"options": [{"text": "Option 1"}, {"text": "Option 2"}]
}
```
### Edit Message
```bash
POST /telegram/:token/editMessageText
Content-Type: application/json
{
"chat_id": 123456789,
"message_id": 123,
"text": "Updated text"
}
```
### Delete Message
```bash
POST /telegram/:token/deleteMessage
Content-Type: application/json
{
"chat_id": 123456789,
"message_id": 123
}
```
### Forward Message
```bash
POST /telegram/:token/forwardMessage
Content-Type: application/json
{
"chat_id": 123456789,
"from_chat_id": 123456789,
"message_id": 123
}
```
### Get Chat
```bash
POST /telegram/:token/getChat
Content-Type: application/json
{
"chat_id": 123456789
}
```
### Set Bot Commands
```bash
POST /telegram/:token/setMyCommands
Content-Type: application/json
{
"commands": [
{"command": "start", "description": "Start the bot"},
{"command": "help", "description": "Get help"}
]
}
```
### Get File
```bash
POST /telegram/:token/getFile
Content-Type: application/json
{
"file_id": "AgACAgQAAxkDAAM..."
}
```
### Set Webhook
```bash
POST /telegram/:token/setWebhook
Content-Type: application/json
{
"url": "https://example.com/webhook",
"allowed_updates": ["message", "callback_query"]
}
```
### Answer Callback Query
```bash
POST /telegram/:token/answerCallbackQuery
Content-Type: application/json
{
"callback_query_id": "12345678901234567",
"text": "Button clicked!"
}
```
## Notes
- The `:token` placeholder is automatically replaced with the bot token
- Chat IDs are positive integers for private chats, negative for groups
- All methods support both GET and POST, but POST is recommended
- Text messages have a 4096 character limit
- Captions have a 1024 character limit
- Polls support 2-10 options
- Files can be sent via URL or file_id from previously uploaded files
## Resources
- [Telegram Bot API Documentation](https://core.telegram.org/bots/api)
- [Available Methods](https://core.telegram.org/bots/api#available-methods)
- [Formatting Options](https://core.telegram.org/bots/api#formatting-options)

View File

@@ -0,0 +1,117 @@
# TickTick Routing Reference
**App name:** `ticktick`
**Base URL proxied:** `api.ticktick.com`
## API Path Pattern
```
/ticktick/open/v1/{resource}
```
## Common Endpoints
### List Projects
```bash
GET /ticktick/open/v1/project
```
### Get Project with Tasks
```bash
GET /ticktick/open/v1/project/{projectId}/data
```
Returns project details along with tasks and columns.
### Create Project
```bash
POST /ticktick/open/v1/project
Content-Type: application/json
{
"name": "My Project",
"viewMode": "list"
}
```
**viewMode options:** `list`, `kanban`, `timeline`
### Delete Project
```bash
DELETE /ticktick/open/v1/project/{projectId}
```
### Get Task
```bash
GET /ticktick/open/v1/project/{projectId}/task/{taskId}
```
### Create Task
```bash
POST /ticktick/open/v1/task
Content-Type: application/json
{
"title": "New task",
"projectId": "PROJECT_ID",
"content": "Task description",
"priority": 0,
"dueDate": "2026-02-15T10:00:00+0000",
"isAllDay": false
}
```
**Priority values:** 0=None, 1=Low, 3=Medium, 5=High
### Update Task
```bash
POST /ticktick/open/v1/task/{taskId}
Content-Type: application/json
{
"id": "TASK_ID",
"projectId": "PROJECT_ID",
"title": "Updated title",
"priority": 1
}
```
### Complete Task
```bash
POST /ticktick/open/v1/project/{projectId}/task/{taskId}/complete
```
### Delete Task
```bash
DELETE /ticktick/open/v1/project/{projectId}/task/{taskId}
```
## Task Fields
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Task ID |
| `projectId` | string | Parent project ID |
| `title` | string | Task title |
| `content` | string | Task description (Markdown) |
| `priority` | integer | 0=None, 1=Low, 3=Medium, 5=High |
| `status` | integer | 0=Active, 2=Completed |
| `dueDate` | string | ISO 8601 format |
| `startDate` | string | ISO 8601 format |
| `isAllDay` | boolean | All-day task flag |
| `timeZone` | string | e.g., "America/Los_Angeles" |
| `tags` | array | List of tag names |
| `columnId` | string | Kanban column ID |
## Notes
- The Open API provides access to tasks and projects only
- Habits, focus/pomodoro, and tags endpoints are not available through the Open API
- Task `status` values: 0 = Active, 2 = Completed
- Dates use ISO 8601 format with timezone offset (e.g., `2026-02-15T10:00:00+0000`)
- The `columns` field in project data is used for Kanban board columns
## Resources
- [TickTick Developer Portal](https://developer.ticktick.com/)
- [TickTick Help Center](https://help.ticktick.com/)

View File

@@ -0,0 +1,176 @@
# Todoist Routing Reference
**App name:** `todoist`
**Base URL proxied:** `api.todoist.com`
## API Path Pattern
```
/todoist/rest/v2/{resource}
```
## Common Endpoints
### List Projects
```bash
GET /todoist/rest/v2/projects
```
### Get Project
```bash
GET /todoist/rest/v2/projects/{id}
```
### Create Project
```bash
POST /todoist/rest/v2/projects
Content-Type: application/json
{
"name": "My Project",
"color": "blue"
}
```
### Update Project
```bash
POST /todoist/rest/v2/projects/{id}
Content-Type: application/json
{
"name": "Updated Name"
}
```
### Delete Project
```bash
DELETE /todoist/rest/v2/projects/{id}
```
### List Tasks
```bash
GET /todoist/rest/v2/tasks
GET /todoist/rest/v2/tasks?project_id={project_id}
GET /todoist/rest/v2/tasks?filter={filter}
```
### Get Task
```bash
GET /todoist/rest/v2/tasks/{id}
```
### Create Task
```bash
POST /todoist/rest/v2/tasks
Content-Type: application/json
{
"content": "Buy groceries",
"priority": 2,
"due_string": "tomorrow"
}
```
### Update Task
```bash
POST /todoist/rest/v2/tasks/{id}
Content-Type: application/json
{
"content": "Updated content",
"priority": 4
}
```
### Close Task (Complete)
```bash
POST /todoist/rest/v2/tasks/{id}/close
```
### Reopen Task
```bash
POST /todoist/rest/v2/tasks/{id}/reopen
```
### Delete Task
```bash
DELETE /todoist/rest/v2/tasks/{id}
```
### List Sections
```bash
GET /todoist/rest/v2/sections
GET /todoist/rest/v2/sections?project_id={project_id}
```
### Create Section
```bash
POST /todoist/rest/v2/sections
Content-Type: application/json
{
"name": "In Progress",
"project_id": "123456"
}
```
### Delete Section
```bash
DELETE /todoist/rest/v2/sections/{id}
```
### List Labels
```bash
GET /todoist/rest/v2/labels
```
### Create Label
```bash
POST /todoist/rest/v2/labels
Content-Type: application/json
{
"name": "urgent",
"color": "red"
}
```
### Delete Label
```bash
DELETE /todoist/rest/v2/labels/{id}
```
### List Comments
```bash
GET /todoist/rest/v2/comments?task_id={task_id}
GET /todoist/rest/v2/comments?project_id={project_id}
```
### Create Comment
```bash
POST /todoist/rest/v2/comments
Content-Type: application/json
{
"task_id": "123456",
"content": "This is a comment"
}
```
### Delete Comment
```bash
DELETE /todoist/rest/v2/comments/{id}
```
## Notes
- Task and Project IDs are strings
- Priority values: 1 (normal) to 4 (urgent)
- Use only one due date format per request: `due_string`, `due_date`, or `due_datetime`
- Comments require either `task_id` or `project_id`
- Close/reopen/delete operations return 204 No Content
## Resources
- [Todoist REST API v2 Documentation](https://developer.todoist.com/rest/v2)
- [Todoist Filter Syntax](https://todoist.com/help/articles/introduction-to-filters)

View File

@@ -0,0 +1,192 @@
# Trello Routing Reference
**App name:** `trello`
**Base URL proxied:** `api.trello.com`
## API Path Pattern
```
/trello/1/{resource}
```
## Common Endpoints
### Get Current Member
```bash
GET /trello/1/members/me
```
### Get Member's Boards
```bash
GET /trello/1/members/me/boards?filter=open
```
### Get Board
```bash
GET /trello/1/boards/{id}?lists=open&cards=open
```
### Create Board
```bash
POST /trello/1/boards
Content-Type: application/json
{
"name": "Project Alpha",
"desc": "Main project board",
"defaultLists": false,
"prefs_permissionLevel": "private"
}
```
### Get Board Lists
```bash
GET /trello/1/boards/{id}/lists?filter=open
```
### Get Board Cards
```bash
GET /trello/1/boards/{id}/cards
```
### Create List
```bash
POST /trello/1/lists
Content-Type: application/json
{
"name": "To Do",
"idBoard": "BOARD_ID",
"pos": "top"
}
```
### Get Cards in List
```bash
GET /trello/1/lists/{id}/cards
```
### Get Card
```bash
GET /trello/1/cards/{id}?members=true&checklists=all
```
### Create Card
```bash
POST /trello/1/cards
Content-Type: application/json
{
"name": "Implement feature X",
"desc": "Description of the task",
"idList": "LIST_ID",
"pos": "bottom",
"due": "2025-03-30T12:00:00.000Z",
"idMembers": ["MEMBER_ID"],
"idLabels": ["LABEL_ID"]
}
```
### Update Card
```bash
PUT /trello/1/cards/{id}
Content-Type: application/json
{
"name": "Updated card name",
"desc": "Updated description",
"due": "2025-04-15T12:00:00.000Z"
}
```
### Move Card to List
```bash
PUT /trello/1/cards/{id}
Content-Type: application/json
{
"idList": "NEW_LIST_ID",
"pos": "top"
}
```
### Delete Card
```bash
DELETE /trello/1/cards/{id}
```
### Add Comment to Card
```bash
POST /trello/1/cards/{id}/actions/comments
Content-Type: application/json
{
"text": "This is a comment"
}
```
### Create Checklist
```bash
POST /trello/1/checklists
Content-Type: application/json
{
"idCard": "CARD_ID",
"name": "Task Checklist"
}
```
### Create Checklist Item
```bash
POST /trello/1/checklists/{id}/checkItems
Content-Type: application/json
{
"name": "Subtask 1",
"pos": "bottom",
"checked": false
}
```
### Get Board Labels
```bash
GET /trello/1/boards/{id}/labels
```
### Create Label
```bash
POST /trello/1/labels
Content-Type: application/json
{
"name": "High Priority",
"color": "red",
"idBoard": "BOARD_ID"
}
```
### Search
```bash
GET /trello/1/search?query=keyword&modelTypes=cards,boards
```
## Notes
- IDs are 24-character alphanumeric strings
- Use `me` to reference the authenticated user
- Dates are in ISO 8601 format
- `pos` can be `top`, `bottom`, or a positive number
- Label colors: `yellow`, `purple`, `blue`, `red`, `green`, `orange`, `black`, `sky`, `pink`, `lime`, `null`
- Use `fields` parameter to limit returned data and improve performance
- Archived items can be retrieved with `filter=closed`
## Resources
- [Trello API Overview](https://developer.atlassian.com/cloud/trello/rest/api-group-actions/)
- [Boards](https://developer.atlassian.com/cloud/trello/rest/api-group-boards/)
- [Lists](https://developer.atlassian.com/cloud/trello/rest/api-group-lists/)
- [Cards](https://developer.atlassian.com/cloud/trello/rest/api-group-cards/)
- [Checklists](https://developer.atlassian.com/cloud/trello/rest/api-group-checklists/)
- [Labels](https://developer.atlassian.com/cloud/trello/rest/api-group-labels/)
- [Members](https://developer.atlassian.com/cloud/trello/rest/api-group-members/)
- [Search](https://developer.atlassian.com/cloud/trello/rest/api-group-search/)

View File

@@ -0,0 +1,170 @@
# Twilio Routing Reference
**App name:** `twilio`
**Base URL proxied:** `api.twilio.com`
## API Path Pattern
```
/twilio/2010-04-01/Accounts/{AccountSid}/{resource}.json
```
**Important:** Most Twilio endpoints require your Account SID in the path. Get it from `/Accounts.json`.
## Common Endpoints
### Accounts
#### List Accounts
```bash
GET /twilio/2010-04-01/Accounts.json
```
#### Get Account
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}.json
```
### Messages (SMS/MMS)
#### List Messages
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json
```
#### Send Message
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json
Content-Type: application/x-www-form-urlencoded
To=+15559876543&From=+15551234567&Body=Hello%20from%20Twilio!
```
#### Get Message
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages/{MessageSid}.json
```
#### Delete Message
```bash
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Messages/{MessageSid}.json
```
### Calls (Voice)
#### List Calls
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Calls.json
```
#### Make Call
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/Calls.json
Content-Type: application/x-www-form-urlencoded
To=+15559876543&From=+15551234567&Url=https://example.com/twiml
```
#### Get Call
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Calls/{CallSid}.json
```
#### End Call
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/Calls/{CallSid}.json
Content-Type: application/x-www-form-urlencoded
Status=completed
```
### Phone Numbers
#### List Incoming Phone Numbers
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers.json
```
#### Get Phone Number
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers/{PhoneNumberSid}.json
```
#### Update Phone Number
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers/{PhoneNumberSid}.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Updated%20Name
```
### Applications
#### List Applications
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Applications.json
```
#### Create Application
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/Applications.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=My%20App&VoiceUrl=https://example.com/voice
```
#### Delete Application
```bash
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Applications/{ApplicationSid}.json
```
### Queues
#### List Queues
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Queues.json
```
#### Create Queue
```bash
POST /twilio/2010-04-01/Accounts/{AccountSid}/Queues.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Support%20Queue&MaxSize=100
```
### Usage Records
#### List Usage Records
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Usage/Records.json
```
## Pagination
Uses page-based pagination:
```bash
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json?PageSize=50&Page=0
```
**Parameters:**
- `PageSize` - Results per page (default: 50)
- `Page` - Page number (0-indexed)
Response includes `next_page_uri` for fetching next page.
## Notes
- All endpoints require `/2010-04-01/` API version prefix
- Request bodies use `application/x-www-form-urlencoded` (not JSON)
- Phone numbers must be in E.164 format (+15551234567)
- SID prefixes: AC (account), SM/MM (messages), CA (calls), PN (phone numbers), AP (applications), QU (queues)
- POST is used for both creating and updating resources
- DELETE returns 204 No Content on success
## Resources
- [Twilio API Overview](https://www.twilio.com/docs/usage/api)
- [Messages API](https://www.twilio.com/docs/messaging/api/message-resource)
- [Calls API](https://www.twilio.com/docs/voice/api/call-resource)

View File

@@ -0,0 +1,186 @@
# Typeform Routing Reference
**App name:** `typeform`
**Base URL proxied:** `api.typeform.com`
## API Path Pattern
```
/typeform/{endpoint}
```
## Common Endpoints
### User
#### Get Current User
```bash
GET /typeform/me
```
### Forms
#### List Forms
```bash
GET /typeform/forms?page_size=10
```
#### Get Form
```bash
GET /typeform/forms/{formId}
```
#### Create Form
```bash
POST /typeform/forms
Content-Type: application/json
{
"title": "Customer Survey",
"fields": [
{
"type": "short_text",
"title": "What is your name?"
},
{
"type": "email",
"title": "What is your email?"
}
]
}
```
#### Update Form (Full Replace)
```bash
PUT /typeform/forms/{formId}
Content-Type: application/json
{
"title": "Updated Survey Title",
"fields": [...]
}
```
#### Update Form (Partial - PATCH)
```bash
PATCH /typeform/forms/{formId}
Content-Type: application/json
[
{"op": "replace", "path": "/title", "value": "New Title"}
]
```
#### Delete Form
```bash
DELETE /typeform/forms/{formId}
```
### Responses
#### List Responses
```bash
GET /typeform/forms/{formId}/responses?page_size=25
```
With filters:
```bash
GET /typeform/forms/{formId}/responses?since=2024-01-01T00:00:00Z&until=2024-12-31T23:59:59Z
```
Completed only:
```bash
GET /typeform/forms/{formId}/responses?completed=true
```
#### Delete Response
```bash
DELETE /typeform/forms/{formId}/responses?included_response_ids={responseId}
```
### Insights
#### Get Form Insights
```bash
GET /typeform/insights/{formId}/summary
```
### Workspaces
#### List Workspaces
```bash
GET /typeform/workspaces
```
#### Get Workspace
```bash
GET /typeform/workspaces/{workspaceId}
```
### Themes
#### List Themes
```bash
GET /typeform/themes
```
### Images
#### List Images
```bash
GET /typeform/images
```
## Field Types
- `short_text` - Single line text
- `long_text` - Multi-line text
- `email` - Email address
- `number` - Numeric input
- `rating` - Star rating
- `opinion_scale` - 0-10 scale
- `multiple_choice` - Single or multiple selection
- `yes_no` - Boolean
- `date` - Date picker
- `file_upload` - File attachment
- `dropdown` - Dropdown selection
## Notes
- Form IDs are alphanumeric strings (e.g., `JiLEvIgv`)
- Response pagination uses `before` token for cursor-based pagination
- Timestamps are in ISO 8601 format (e.g., `2026-01-01T00:00:00Z`)
- Responses include `answers` array with field references
- DELETE operations return HTTP 204 (no content) on success
- PATCH uses JSON Patch format (array of operations with `op`, `path`, `value`)
## Resources
- [API Overview](https://www.typeform.com/developers/get-started)
- [List Forms](https://www.typeform.com/developers/create/reference/retrieve-forms)
- [Get Form](https://www.typeform.com/developers/create/reference/retrieve-form)
- [Create Form](https://www.typeform.com/developers/create/reference/create-form)
- [Update Form](https://www.typeform.com/developers/create/reference/update-form)
- [Update Form Patch](https://www.typeform.com/developers/create/reference/update-form-patch)
- [Delete Form](https://www.typeform.com/developers/create/reference/delete-form)
- [Get Form Messages](https://www.typeform.com/developers/create/reference/retrieve-custom-form-messages)
- [Update Form Messages](https://www.typeform.com/developers/create/reference/update-custom-messages)
- [List Responses](https://www.typeform.com/developers/responses/reference/retrieve-responses)
- [Delete Responses](https://www.typeform.com/developers/responses/reference/delete-responses)
- [List Workspaces](https://www.typeform.com/developers/create/reference/retrieve-workspaces)
- [Get Workspace](https://www.typeform.com/developers/create/reference/retrieve-workspace)
- [Create Workspace](https://www.typeform.com/developers/create/reference/create-workspace)
- [Update Workspace](https://www.typeform.com/developers/create/reference/update-workspace)
- [Delete Workspace](https://www.typeform.com/developers/create/reference/delete-workspace)
- [List Themes](https://www.typeform.com/developers/create/reference/retrieve-themes)
- [Get Theme](https://www.typeform.com/developers/create/reference/retrieve-theme)
- [Create Theme](https://www.typeform.com/developers/create/reference/create-theme)
- [Update Theme](https://www.typeform.com/developers/create/reference/update-theme-partial-update)
- [Delete Theme](https://www.typeform.com/developers/create/reference/delete-theme)
- [Get Image](https://www.typeform.com/developers/create/reference/retrieve-image)
- [Get Image By Size](https://www.typeform.com/developers/create/reference/retrieve-image-by-size)
- [Create Image](https://www.typeform.com/developers/create/reference/create-image)
- [Delete Image](https://www.typeform.com/developers/create/reference/delete-image)
- [Create Or Update Webhook](https://www.typeform.com/developers/webhooks/reference/create-or-update-webhook)
- [Get Webhook](https://www.typeform.com/developers/webhooks/reference/retrieve-single-webhook)
- [Delete Webhook](https://www.typeform.com/developers/webhooks/reference/delete-webhook)

View File

@@ -0,0 +1,123 @@
# Vimeo Routing Reference
**App name:** `vimeo`
**Base URL proxied:** `api.vimeo.com`
## API Path Pattern
```
/vimeo/{resource}
```
## Common Endpoints
### User
```bash
GET /vimeo/me
GET /vimeo/users/{user_id}
GET /vimeo/me/feed
```
### Videos
```bash
# List user videos
GET /vimeo/me/videos
# Search videos
GET /vimeo/videos?query=nature
# Get video
GET /vimeo/videos/{video_id}
# Update video
PATCH /vimeo/videos/{video_id}
# Delete video
DELETE /vimeo/videos/{video_id}
```
### Folders (Projects)
```bash
GET /vimeo/me/folders
POST /vimeo/me/folders
PATCH /vimeo/me/projects/{project_id}
DELETE /vimeo/me/projects/{project_id}
# Folder videos
GET /vimeo/me/projects/{project_id}/videos
PUT /vimeo/me/projects/{project_id}/videos/{video_id}
DELETE /vimeo/me/projects/{project_id}/videos/{video_id}
```
### Albums (Showcases)
```bash
GET /vimeo/me/albums
POST /vimeo/me/albums
PATCH /vimeo/me/albums/{album_id}
DELETE /vimeo/me/albums/{album_id}
# Album videos
GET /vimeo/me/albums/{album_id}/videos
PUT /vimeo/me/albums/{album_id}/videos/{video_id}
DELETE /vimeo/me/albums/{album_id}/videos/{video_id}
```
### Comments
```bash
GET /vimeo/videos/{video_id}/comments
POST /vimeo/videos/{video_id}/comments
DELETE /vimeo/videos/{video_id}/comments/{comment_id}
```
### Likes
```bash
GET /vimeo/me/likes
PUT /vimeo/me/likes/{video_id}
DELETE /vimeo/me/likes/{video_id}
```
### Watch Later
```bash
GET /vimeo/me/watchlater
PUT /vimeo/me/watchlater/{video_id}
DELETE /vimeo/me/watchlater/{video_id}
```
### Following
```bash
GET /vimeo/me/followers
GET /vimeo/me/following
PUT /vimeo/me/following/{user_id}
DELETE /vimeo/me/following/{user_id}
```
### Channels and Categories
```bash
GET /vimeo/channels
GET /vimeo/channels/{channel_id}
GET /vimeo/categories
GET /vimeo/categories/{category}/videos
```
## Notes
- Video and user IDs are numeric
- Folders are called "projects" in API paths
- Albums are "Showcases" in the Vimeo UI
- DELETE and PUT operations return 204 No Content
- Video uploads require TUS protocol
- Page-based pagination with `page` and `per_page` parameters
## Resources
- [Vimeo API Reference](https://developer.vimeo.com/api/reference)
- [Vimeo Developer Portal](https://developer.vimeo.com)

View File

@@ -0,0 +1,212 @@
# WhatsApp Business Routing Reference
**App name:** `whatsapp-business`
**Base URL proxied:** `graph.facebook.com`
## API Path Pattern
```
/whatsapp-business/v21.0/{resource}
```
## Common Endpoints
### Send Text Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "text",
"text": {"body": "Hello from WhatsApp!"}
}
```
### Send Template Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "template",
"template": {
"name": "hello_world",
"language": {"code": "en_US"},
"components": [
{
"type": "body",
"parameters": [{"type": "text", "text": "John"}]
}
]
}
}
```
### Send Image Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "image",
"image": {
"link": "https://example.com/image.jpg",
"caption": "Check out this image!"
}
}
```
### Send Document Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "document",
"document": {
"link": "https://example.com/document.pdf",
"filename": "report.pdf"
}
}
```
### Send Interactive Button Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "interactive",
"interactive": {
"type": "button",
"body": {"text": "Would you like to proceed?"},
"action": {
"buttons": [
{"type": "reply", "reply": {"id": "yes", "title": "Yes"}},
{"type": "reply", "reply": {"id": "no", "title": "No"}}
]
}
}
}
```
### Send Interactive List Message
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "interactive",
"interactive": {
"type": "list",
"body": {"text": "Choose from the list below"},
"action": {
"button": "View Options",
"sections": [
{
"title": "Products",
"rows": [
{"id": "prod1", "title": "Product 1"},
{"id": "prod2", "title": "Product 2"}
]
}
]
}
}
}
```
### Mark Message as Read
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/messages
Content-Type: application/json
{
"messaging_product": "whatsapp",
"status": "read",
"message_id": "wamid.xxxxx"
}
```
### Upload Media
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/media
Content-Type: multipart/form-data
file=@/path/to/file.jpg
type=image/jpeg
messaging_product=whatsapp
```
### Get Media URL
```bash
GET /whatsapp-business/v21.0/{media_id}
```
### List Message Templates
```bash
GET /whatsapp-business/v21.0/{whatsapp_business_account_id}/message_templates
```
### Create Message Template
```bash
POST /whatsapp-business/v21.0/{whatsapp_business_account_id}/message_templates
Content-Type: application/json
{
"name": "order_confirmation",
"language": "en_US",
"category": "UTILITY",
"components": [
{"type": "BODY", "text": "Hi {{1}}, your order #{{2}} has been confirmed!"}
]
}
```
### Get Business Profile
```bash
GET /whatsapp-business/v21.0/{phone_number_id}/whatsapp_business_profile?fields=about,address,description,email,websites
```
### Update Business Profile
```bash
POST /whatsapp-business/v21.0/{phone_number_id}/whatsapp_business_profile
Content-Type: application/json
{
"messaging_product": "whatsapp",
"about": "Your trusted partner",
"description": "We provide excellent services"
}
```
## Notes
- Phone numbers must be in international format without `+` (e.g., `1234567890`)
- `messaging_product` must always be set to `whatsapp`
- Template messages are required for initiating conversations (24-hour messaging window)
- Media files must be publicly accessible URLs or uploaded via the Media API
- Interactive messages support up to 3 buttons or 10 list items
- Template categories: `AUTHENTICATION`, `MARKETING`, `UTILITY`
## Resources
- [WhatsApp Business API Overview](https://developers.facebook.com/docs/whatsapp/cloud-api/overview)
- [Send Messages](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-messages)
- [Message Templates](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-message-templates)
- [Media](https://developers.facebook.com/docs/whatsapp/cloud-api/reference/media)
- [Business Profiles](https://developers.facebook.com/docs/whatsapp/cloud-api/reference/business-profiles)
- [Webhooks](https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks)
- [Error Codes](https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes)

View File

@@ -0,0 +1,277 @@
# WooCommerce Routing Reference
**App name:** `woocommerce`
**Base URL proxied:** `{store-url}/wp-json/wc/v3`
## API Path Pattern
```
/woocommerce/wp-json/wc/v3/{endpoint}
```
## Common Endpoints
### Products
#### List Products
```bash
GET /woocommerce/wp-json/wc/v3/products?per_page=20&status=publish
```
#### Get Product
```bash
GET /woocommerce/wp-json/wc/v3/products/{id}
```
#### Create Product
```bash
POST /woocommerce/wp-json/wc/v3/products
Content-Type: application/json
{"name": "Premium Widget", "type": "simple", "regular_price": "19.99", "sku": "WDG-001"}
```
#### Update Product
```bash
PUT /woocommerce/wp-json/wc/v3/products/{id}
Content-Type: application/json
{"regular_price": "24.99", "sale_price": "19.99"}
```
#### Delete Product
```bash
DELETE /woocommerce/wp-json/wc/v3/products/{id}?force=true
```
### Product Variations
#### List Variations
```bash
GET /woocommerce/wp-json/wc/v3/products/{product_id}/variations
```
#### Create Variation
```bash
POST /woocommerce/wp-json/wc/v3/products/{product_id}/variations
Content-Type: application/json
{"regular_price": "29.99", "sku": "TSH-001-RED-M", "attributes": [{"id": 1, "option": "Red"}]}
```
### Product Categories
#### List Categories
```bash
GET /woocommerce/wp-json/wc/v3/products/categories
```
#### Create Category
```bash
POST /woocommerce/wp-json/wc/v3/products/categories
Content-Type: application/json
{"name": "Electronics", "description": "Electronic products"}
```
### Orders
#### List Orders
```bash
GET /woocommerce/wp-json/wc/v3/orders?status=processing&per_page=50
```
#### Get Order
```bash
GET /woocommerce/wp-json/wc/v3/orders/{id}
```
#### Create Order
```bash
POST /woocommerce/wp-json/wc/v3/orders
Content-Type: application/json
{"payment_method": "stripe", "set_paid": true, "billing": {"first_name": "John", "last_name": "Doe", "email": "john@example.com"}, "line_items": [{"product_id": 123, "quantity": 2}]}
```
#### Update Order Status
```bash
PUT /woocommerce/wp-json/wc/v3/orders/{id}
Content-Type: application/json
{"status": "completed"}
```
### Order Notes
#### List Order Notes
```bash
GET /woocommerce/wp-json/wc/v3/orders/{order_id}/notes
```
#### Create Order Note
```bash
POST /woocommerce/wp-json/wc/v3/orders/{order_id}/notes
Content-Type: application/json
{"note": "Order shipped via FedEx", "customer_note": true}
```
### Order Refunds
#### Create Refund
```bash
POST /woocommerce/wp-json/wc/v3/orders/{order_id}/refunds
Content-Type: application/json
{"amount": "25.00", "reason": "Product damaged", "api_refund": true}
```
### Customers
#### List Customers
```bash
GET /woocommerce/wp-json/wc/v3/customers?per_page=25
```
#### Get Customer
```bash
GET /woocommerce/wp-json/wc/v3/customers/{id}
```
#### Create Customer
```bash
POST /woocommerce/wp-json/wc/v3/customers
Content-Type: application/json
{"email": "jane@example.com", "first_name": "Jane", "last_name": "Smith", "username": "janesmith"}
```
### Coupons
#### List Coupons
```bash
GET /woocommerce/wp-json/wc/v3/coupons
```
#### Create Coupon
```bash
POST /woocommerce/wp-json/wc/v3/coupons
Content-Type: application/json
{"code": "SUMMER2024", "discount_type": "percent", "amount": "15", "usage_limit": 100}
```
### Taxes
#### List Tax Rates
```bash
GET /woocommerce/wp-json/wc/v3/taxes
```
#### Create Tax Rate
```bash
POST /woocommerce/wp-json/wc/v3/taxes
Content-Type: application/json
{"country": "US", "state": "CA", "rate": "7.25", "name": "CA State Tax"}
```
### Shipping
#### List Shipping Zones
```bash
GET /woocommerce/wp-json/wc/v3/shipping/zones
```
#### List Shipping Zone Methods
```bash
GET /woocommerce/wp-json/wc/v3/shipping/zones/{zone_id}/methods
```
### Webhooks
#### List Webhooks
```bash
GET /woocommerce/wp-json/wc/v3/webhooks
```
#### Create Webhook
```bash
POST /woocommerce/wp-json/wc/v3/webhooks
Content-Type: application/json
{"name": "Order Created", "topic": "order.created", "delivery_url": "https://example.com/webhook", "status": "active"}
```
### Reports
#### Sales Report
```bash
GET /woocommerce/wp-json/wc/v3/reports/sales?period=month
```
#### Top Sellers
```bash
GET /woocommerce/wp-json/wc/v3/reports/top_sellers
```
#### Orders Totals
```bash
GET /woocommerce/wp-json/wc/v3/reports/orders/totals
```
### Settings
#### List Settings Groups
```bash
GET /woocommerce/wp-json/wc/v3/settings
```
#### Get Settings in Group
```bash
GET /woocommerce/wp-json/wc/v3/settings/{group}
```
### System Status
#### Get System Status
```bash
GET /woocommerce/wp-json/wc/v3/system_status
```
## Notes
- All monetary amounts are returned as strings with two decimal places
- Dates are in ISO8601 format: `YYYY-MM-DDTHH:MM:SS`
- Resource IDs are integers
- Pagination uses `page` and `per_page` parameters (max 100 per page)
- Response headers include `X-WP-Total` and `X-WP-TotalPages`
- Order statuses: `pending`, `processing`, `on-hold`, `completed`, `cancelled`, `refunded`, `failed`
- Discount types: `percent`, `fixed_cart`, `fixed_product`
- Use `force=true` query parameter to permanently delete (otherwise moves to trash)
- Batch operations supported via `POST /{resource}/batch` with `create`, `update`, `delete` arrays
## Resources
- [WooCommerce REST API Documentation](https://woocommerce.github.io/woocommerce-rest-api-docs/)
- [Products](https://woocommerce.github.io/woocommerce-rest-api-docs/#products)
- [Product Variations](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variations)
- [Product Attributes](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-attributes)
- [Product Categories](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-categories)
- [Product Tags](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-tags)
- [Product Reviews](https://woocommerce.github.io/woocommerce-rest-api-docs/#product-reviews)
- [Orders](https://woocommerce.github.io/woocommerce-rest-api-docs/#orders)
- [Order Notes](https://woocommerce.github.io/woocommerce-rest-api-docs/#order-notes)
- [Refunds](https://woocommerce.github.io/woocommerce-rest-api-docs/#refunds)
- [Customers](https://woocommerce.github.io/woocommerce-rest-api-docs/#customers)
- [Coupons](https://woocommerce.github.io/woocommerce-rest-api-docs/#coupons)
- [Tax Rates](https://woocommerce.github.io/woocommerce-rest-api-docs/#tax-rates)
- [Tax Classes](https://woocommerce.github.io/woocommerce-rest-api-docs/#tax-classes)
- [Shipping Zones](https://woocommerce.github.io/woocommerce-rest-api-docs/#shipping-zones)
- [Shipping Methods](https://woocommerce.github.io/woocommerce-rest-api-docs/#shipping-methods)
- [Payment Gateways](https://woocommerce.github.io/woocommerce-rest-api-docs/#payment-gateways)
- [Settings](https://woocommerce.github.io/woocommerce-rest-api-docs/#settings)
- [Webhooks](https://woocommerce.github.io/woocommerce-rest-api-docs/#webhooks)
- [Reports](https://woocommerce.github.io/woocommerce-rest-api-docs/#reports)
- [System Status](https://woocommerce.github.io/woocommerce-rest-api-docs/#system-status)

View File

@@ -0,0 +1,168 @@
# WordPress.com Routing Reference
**App name:** `wordpress`
**Base URL proxied:** `public-api.wordpress.com`
## API Path Pattern
```
/wordpress/rest/v1.1/{endpoint}
```
**Important:** WordPress.com uses REST API v1.1. Site-specific endpoints use `/sites/{site_id_or_domain}/{resource}`.
## Site Identifiers
Sites can be identified by:
- Numeric site ID (e.g., `252505333`)
- Domain name (e.g., `myblog.wordpress.com`)
## Common Endpoints
### Sites
#### Get Site Information
```bash
GET /wordpress/rest/v1.1/sites/{site}
```
### Posts
#### List Posts
```bash
GET /wordpress/rest/v1.1/sites/{site}/posts
```
Query parameters: `number`, `offset`, `page_handle`, `status`, `search`, `category`, `tag`, `author`
#### Get Post
```bash
GET /wordpress/rest/v1.1/sites/{site}/posts/{post_id}
```
#### Create Post
```bash
POST /wordpress/rest/v1.1/sites/{site}/posts/new
Content-Type: application/json
{
"title": "Post Title",
"content": "<p>Post content...</p>",
"status": "draft",
"categories": "news",
"tags": "featured"
}
```
#### Update Post
```bash
POST /wordpress/rest/v1.1/sites/{site}/posts/{post_id}
Content-Type: application/json
{
"title": "Updated Title",
"content": "<p>Updated content...</p>"
}
```
#### Delete Post
```bash
POST /wordpress/rest/v1.1/sites/{site}/posts/{post_id}/delete
```
### Pages
#### List Pages
```bash
GET /wordpress/rest/v1.1/sites/{site}/posts?type=page
```
#### Create Page
```bash
POST /wordpress/rest/v1.1/sites/{site}/posts/new?type=page
Content-Type: application/json
{
"title": "Page Title",
"content": "<p>Page content...</p>",
"status": "publish"
}
```
### Post Likes
#### Get Post Likes
```bash
GET /wordpress/rest/v1.1/sites/{site}/posts/{post_id}/likes
```
#### Like Post
```bash
POST /wordpress/rest/v1.1/sites/{site}/posts/{post_id}/likes/new
```
### Users
#### List Site Users
```bash
GET /wordpress/rest/v1.1/sites/{site}/users
```
### User Settings
#### Get My Settings
```bash
GET /wordpress/rest/v1.1/me/settings
```
#### Update My Settings
```bash
POST /wordpress/rest/v1.1/me/settings/
Content-Type: application/json
{
"enable_translator": false
}
```
### Post Types
#### List Post Types
```bash
GET /wordpress/rest/v1.1/sites/{site}/post-types
```
### Post Counts
#### Get Post Counts
```bash
GET /wordpress/rest/v1.1/sites/{site}/post-counts/{post_type}
```
## Pagination
WordPress.com uses cursor-based pagination with `page_handle`:
```bash
GET /wordpress/rest/v1.1/sites/{site}/posts?number=20
# Response includes "meta": {"next_page": "..."}
GET /wordpress/rest/v1.1/sites/{site}/posts?number=20&page_handle={next_page}
```
Alternatively, use `offset` for simple pagination.
## Notes
- API version is v1.1 (not v2)
- POST is used for updates (not PUT/PATCH)
- POST to `/delete` endpoint is used for deletes (not HTTP DELETE)
- Categories and tags are created automatically when referenced in posts
- Content is HTML-formatted
- Date/time values are in ISO 8601 format
## Resources
- [WordPress.com REST API Overview](https://developer.wordpress.com/docs/api/)
- [Getting Started Guide](https://developer.wordpress.com/docs/api/getting-started/)
- [API Reference](https://developer.wordpress.com/docs/api/rest-api-reference/)

View File

@@ -0,0 +1,203 @@
# Xero Routing Reference
**App name:** `xero`
**Base URL proxied:** `api.xero.com`
## Automatic Tenant ID Injection
The router automatically injects the `Xero-Tenant-Id` header from your connection config. You do not need to provide it manually.
## API Path Pattern
```
/xero/api.xro/2.0/{endpoint}
```
## Common Endpoints
### Contacts
#### List Contacts
```bash
GET /xero/api.xro/2.0/Contacts
```
#### Get Contact
```bash
GET /xero/api.xro/2.0/Contacts/{contactId}
```
#### Create Contact
```bash
POST /xero/api.xro/2.0/Contacts
Content-Type: application/json
{
"Contacts": [{
"Name": "John Doe",
"EmailAddress": "john@example.com",
"Phones": [{"PhoneType": "DEFAULT", "PhoneNumber": "555-1234"}]
}]
}
```
### Invoices
#### List Invoices
```bash
GET /xero/api.xro/2.0/Invoices
```
#### Get Invoice
```bash
GET /xero/api.xro/2.0/Invoices/{invoiceId}
```
#### Create Invoice
```bash
POST /xero/api.xro/2.0/Invoices
Content-Type: application/json
{
"Invoices": [{
"Type": "ACCREC",
"Contact": {"ContactID": "xxx"},
"LineItems": [{
"Description": "Service",
"Quantity": 1,
"UnitAmount": 100.00,
"AccountCode": "200"
}]
}]
}
```
### Accounts
#### List Accounts
```bash
GET /xero/api.xro/2.0/Accounts
```
### Items
#### List Items
```bash
GET /xero/api.xro/2.0/Items
```
### Payments
#### List Payments
```bash
GET /xero/api.xro/2.0/Payments
```
### Bank Transactions
#### List Bank Transactions
```bash
GET /xero/api.xro/2.0/BankTransactions
```
### Reports
#### Profit and Loss
```bash
GET /xero/api.xro/2.0/Reports/ProfitAndLoss?fromDate=2024-01-01&toDate=2024-12-31
```
#### Balance Sheet
```bash
GET /xero/api.xro/2.0/Reports/BalanceSheet?date=2024-12-31
```
#### Trial Balance
```bash
GET /xero/api.xro/2.0/Reports/TrialBalance?date=2024-12-31
```
### Currencies
#### List Currencies
```bash
GET /xero/api.xro/2.0/Currencies
```
### Tax Rates
#### List Tax Rates
```bash
GET /xero/api.xro/2.0/TaxRates
```
### Credit Notes
#### List Credit Notes
```bash
GET /xero/api.xro/2.0/CreditNotes
```
### Purchase Orders
#### List Purchase Orders
```bash
GET /xero/api.xro/2.0/PurchaseOrders
```
### Organisation
#### Get Organisation
```bash
GET /xero/api.xro/2.0/Organisation
```
## Invoice Types
- `ACCREC` - Accounts Receivable (sales invoice)
- `ACCPAY` - Accounts Payable (bill)
## Notes
- `Xero-Tenant-Id` header is automatically injected by the router
- Dates are in `YYYY-MM-DD` format
- Multiple records can be created in a single request using arrays
- Updates use POST method with the record ID in the URL
- Draft invoices can be deleted by setting `Status` to `DELETED`
- Use `where` query parameter for filtering (e.g., `where=Status=="VOIDED"`)
## Resources
- [API Overview](https://developer.xero.com/documentation/api/accounting/overview)
- [List Contacts](https://developer.xero.com/documentation/api/accounting/contacts#get-contacts)
- [Get Contact](https://developer.xero.com/documentation/api/accounting/contacts#get-contacts)
- [Create Contact](https://developer.xero.com/documentation/api/accounting/contacts#put-contacts)
- [Update Contact](https://developer.xero.com/documentation/api/accounting/contacts#post-contacts)
- [List Invoices](https://developer.xero.com/documentation/api/accounting/invoices#get-invoices)
- [Get Invoice](https://developer.xero.com/documentation/api/accounting/invoices#get-invoices)
- [Create Invoice](https://developer.xero.com/documentation/api/accounting/invoices#put-invoices)
- [Update Invoice](https://developer.xero.com/documentation/api/accounting/invoices#post-invoices)
- [Email Invoice](https://developer.xero.com/documentation/api/accounting/invoices#emailing-an-invoice)
- [List Accounts](https://developer.xero.com/documentation/api/accounting/accounts#get-accounts)
- [Get Account](https://developer.xero.com/documentation/api/accounting/accounts#get-accounts)
- [Create Account](https://developer.xero.com/documentation/api/accounting/accounts#put-accounts)
- [Update Account](https://developer.xero.com/documentation/api/accounting/accounts#post-accounts)
- [Delete Account](https://developer.xero.com/documentation/api/accounting/accounts#delete-accounts)
- [List Items](https://developer.xero.com/documentation/api/accounting/items#get-items)
- [Get Item](https://developer.xero.com/documentation/api/accounting/items#get-items)
- [Create Item](https://developer.xero.com/documentation/api/accounting/items#put-items)
- [Update Item](https://developer.xero.com/documentation/api/accounting/items#post-items)
- [Delete Item](https://developer.xero.com/documentation/api/accounting/items#delete-items)
- [List Payments](https://developer.xero.com/documentation/api/accounting/payments#get-payments)
- [Get Payment](https://developer.xero.com/documentation/api/accounting/payments#get-payments)
- [Create Payment](https://developer.xero.com/documentation/api/accounting/payments#put-payments)
- [Update Payment](https://developer.xero.com/documentation/api/accounting/payments#post-payments)
- [List Bank Transactions](https://developer.xero.com/documentation/api/accounting/banktransactions#get-banktransactions)
- [Get Bank Transaction](https://developer.xero.com/documentation/api/accounting/banktransactions#get-banktransactions)
- [Create Bank Transaction](https://developer.xero.com/documentation/api/accounting/banktransactions#put-banktransactions)
- [Update Bank Transaction](https://developer.xero.com/documentation/api/accounting/banktransactions#post-banktransactions)
- [Profit and Loss Report](https://developer.xero.com/documentation/api/accounting/reports#profitandloss)
- [Balance Sheet Report](https://developer.xero.com/documentation/api/accounting/reports#balancesheet)
- [Trial Balance Report](https://developer.xero.com/documentation/api/accounting/reports#trialbalance)
- [Bank Summary Report](https://developer.xero.com/documentation/api/accounting/reports#banksummary)
- [Get Organisation](https://developer.xero.com/documentation/api/accounting/organisation#get-organisation)

View File

@@ -0,0 +1,167 @@
# YouTube Routing Reference
**App name:** `youtube`
**Base URL proxied:** `www.googleapis.com`
## API Path Pattern
```
/youtube/youtube/v3/{resource}
```
## Common Endpoints
### Search Videos
```bash
GET /youtube/youtube/v3/search?part=snippet&q=coding+tutorial&type=video&maxResults=10
```
Query parameters:
- `part` - Required: `snippet`
- `q` - Search query
- `type` - Filter: `video`, `channel`, `playlist`
- `maxResults` - Results per page (1-50)
- `order` - Sort: `date`, `rating`, `relevance`, `title`, `viewCount`
- `videoDuration` - `short` (<4min), `medium` (4-20min), `long` (>20min)
### Get Video Details
```bash
GET /youtube/youtube/v3/videos?part=snippet,statistics,contentDetails&id={videoId}
```
Parts available: `snippet`, `statistics`, `contentDetails`, `status`, `player`
### Get Trending Videos
```bash
GET /youtube/youtube/v3/videos?part=snippet,statistics&chart=mostPopular&regionCode=US&maxResults=10
```
### Rate Video
```bash
POST /youtube/youtube/v3/videos/rate?id={videoId}&rating=like
```
Rating values: `like`, `dislike`, `none`
### Get My Channel
```bash
GET /youtube/youtube/v3/channels?part=snippet,statistics,contentDetails&mine=true
```
### Get Channel Details
```bash
GET /youtube/youtube/v3/channels?part=snippet,statistics&id={channelId}
```
### List My Playlists
```bash
GET /youtube/youtube/v3/playlists?part=snippet,contentDetails&mine=true&maxResults=25
```
### Create Playlist
```bash
POST /youtube/youtube/v3/playlists?part=snippet,status
Content-Type: application/json
{
"snippet": {
"title": "My New Playlist",
"description": "A collection of videos"
},
"status": {
"privacyStatus": "private"
}
}
```
Privacy values: `public`, `private`, `unlisted`
### Delete Playlist
```bash
DELETE /youtube/youtube/v3/playlists?id={playlistId}
```
### List Playlist Items
```bash
GET /youtube/youtube/v3/playlistItems?part=snippet,contentDetails&playlistId={playlistId}&maxResults=50
```
### Add Video to Playlist
```bash
POST /youtube/youtube/v3/playlistItems?part=snippet
Content-Type: application/json
{
"snippet": {
"playlistId": "PLxyz123",
"resourceId": {
"kind": "youtube#video",
"videoId": "abc123xyz"
},
"position": 0
}
}
```
### List My Subscriptions
```bash
GET /youtube/youtube/v3/subscriptions?part=snippet&mine=true&maxResults=50
```
### Subscribe to Channel
```bash
POST /youtube/youtube/v3/subscriptions?part=snippet
Content-Type: application/json
{
"snippet": {
"resourceId": {
"kind": "youtube#channel",
"channelId": "UCxyz123"
}
}
}
```
### List Video Comments
```bash
GET /youtube/youtube/v3/commentThreads?part=snippet,replies&videoId={videoId}&maxResults=100
```
### Add Comment to Video
```bash
POST /youtube/youtube/v3/commentThreads?part=snippet
Content-Type: application/json
{
"snippet": {
"videoId": "abc123xyz",
"topLevelComment": {
"snippet": {
"textOriginal": "Great video!"
}
}
}
}
```
## Notes
- Video IDs are 11 characters (e.g., `dQw4w9WgXcQ`)
- Channel IDs start with `UC` (e.g., `UCxyz123`)
- Playlist IDs start with `PL` (user) or `UU` (uploads)
- Use `pageToken` for pagination through large result sets
- The `part` parameter is required and determines what data is returned
- Quota costs vary by endpoint - search is expensive (100 units), reads are cheap (1 unit)
## Resources
- [YouTube Data API Overview](https://developers.google.com/youtube/v3)
- [Search](https://developers.google.com/youtube/v3/docs/search/list)
- [Videos](https://developers.google.com/youtube/v3/docs/videos)
- [Channels](https://developers.google.com/youtube/v3/docs/channels)
- [Playlists](https://developers.google.com/youtube/v3/docs/playlists)
- [PlaylistItems](https://developers.google.com/youtube/v3/docs/playlistItems)
- [Subscriptions](https://developers.google.com/youtube/v3/docs/subscriptions)
- [Comments](https://developers.google.com/youtube/v3/docs/comments)
- [Quota Calculator](https://developers.google.com/youtube/v3/determine_quota_cost)

View File

@@ -0,0 +1,104 @@
# Zoho Bigin Routing Reference
**App name:** `zoho-bigin`
**Base URL proxied:** `www.zohoapis.com`
## API Path Pattern
```
/zoho-bigin/bigin/v2/{resource}
```
## Common Endpoints
### List Contacts
```bash
GET /zoho-bigin/bigin/v2/Contacts?fields=First_Name,Last_Name,Email
```
### Get Contact
```bash
GET /zoho-bigin/bigin/v2/Contacts/{id}
```
### Create Contact
```bash
POST /zoho-bigin/bigin/v2/Contacts
Content-Type: application/json
{
"data": [{
"Last_Name": "Smith",
"First_Name": "John",
"Email": "john@example.com"
}]
}
```
### Update Contact
```bash
PUT /zoho-bigin/bigin/v2/Contacts
Content-Type: application/json
{
"data": [{
"id": "{record_id}",
"Phone": "+1-555-1234"
}]
}
```
### Delete Contact
```bash
DELETE /zoho-bigin/bigin/v2/Contacts?ids={id1},{id2}
```
### Search Contacts
```bash
GET /zoho-bigin/bigin/v2/Contacts/search?email=john@example.com
GET /zoho-bigin/bigin/v2/Contacts/search?criteria=(Last_Name:equals:Smith)
```
### List Companies (Accounts)
```bash
GET /zoho-bigin/bigin/v2/Accounts?fields=Account_Name,Website
```
### Get Users
```bash
GET /zoho-bigin/bigin/v2/users?type=ActiveUsers
```
### Get Modules
```bash
GET /zoho-bigin/bigin/v2/settings/modules
```
## Available Modules
| Module | API Name | Description |
|--------|----------|-------------|
| Contacts | `Contacts` | Individual people |
| Companies | `Accounts` | Organizations/businesses |
| Pipelines | `Pipelines` | Sales opportunities/deals |
| Products | `Products` | Items you sell |
| Tasks | `Tasks` | To-do items |
| Events | `Events` | Calendar appointments |
| Calls | `Calls` | Phone call logs |
| Notes | `Notes` | Notes attached to records |
## Notes
- The `fields` query parameter is **required** for list operations
- Module API names are case-sensitive (e.g., `Contacts`, not `contacts`)
- Companies are accessed via the `Accounts` module
- Sales opportunities are in the `Pipelines` module (not `Deals`)
- Record IDs are numeric strings (e.g., `7255024000000596045`)
- Maximum 200 records per page, 100 per create/update/delete
- Some modules (Tasks, Events, Calls, Notes) require additional OAuth scopes
## Resources
- [Bigin API Overview](https://www.bigin.com/developer/docs/apis/v2/)
- [Bigin REST API Documentation](https://www.bigin.com/developer/docs/apis/)
- [Modules API](https://www.bigin.com/developer/docs/apis/modules-api.html)

View File

@@ -0,0 +1,151 @@
# Zoho Books Routing Reference
**App name:** `zoho-books`
**Base URL proxied:** `www.zohoapis.com`
## API Path Pattern
```
/zoho-books/books/v3/{resource}
```
## Common Endpoints
### Contacts
```bash
# List contacts
GET /zoho-books/books/v3/contacts
# Get contact
GET /zoho-books/books/v3/contacts/{contact_id}
# Create contact
POST /zoho-books/books/v3/contacts
Content-Type: application/json
{
"contact_name": "Customer Name",
"contact_type": "customer"
}
# Update contact
PUT /zoho-books/books/v3/contacts/{contact_id}
# Delete contact
DELETE /zoho-books/books/v3/contacts/{contact_id}
```
### Invoices
```bash
# List invoices
GET /zoho-books/books/v3/invoices
# Get invoice
GET /zoho-books/books/v3/invoices/{invoice_id}
# Create invoice
POST /zoho-books/books/v3/invoices
# Mark as sent
POST /zoho-books/books/v3/invoices/{invoice_id}/status/sent
# Email invoice
POST /zoho-books/books/v3/invoices/{invoice_id}/email
```
### Bills
```bash
# List bills
GET /zoho-books/books/v3/bills
# Create bill
POST /zoho-books/books/v3/bills
# Update bill
PUT /zoho-books/books/v3/bills/{bill_id}
# Delete bill
DELETE /zoho-books/books/v3/bills/{bill_id}
```
### Expenses
```bash
# List expenses
GET /zoho-books/books/v3/expenses
# Create expense
POST /zoho-books/books/v3/expenses
# Update expense
PUT /zoho-books/books/v3/expenses/{expense_id}
# Delete expense
DELETE /zoho-books/books/v3/expenses/{expense_id}
```
### Sales Orders
```bash
GET /zoho-books/books/v3/salesorders
POST /zoho-books/books/v3/salesorders
```
### Purchase Orders
```bash
GET /zoho-books/books/v3/purchaseorders
POST /zoho-books/books/v3/purchaseorders
```
### Credit Notes
```bash
GET /zoho-books/books/v3/creditnotes
```
### Recurring Invoices
```bash
GET /zoho-books/books/v3/recurringinvoices
```
### Recurring Bills
```bash
GET /zoho-books/books/v3/recurringbills
```
## Available Modules
| Module | Endpoint | Description |
|--------|----------|-------------|
| Contacts | `/contacts` | Customers and vendors |
| Invoices | `/invoices` | Sales invoices |
| Bills | `/bills` | Vendor bills |
| Expenses | `/expenses` | Business expenses |
| Sales Orders | `/salesorders` | Sales orders |
| Purchase Orders | `/purchaseorders` | Purchase orders |
| Credit Notes | `/creditnotes` | Customer credit notes |
| Recurring Invoices | `/recurringinvoices` | Recurring invoices |
| Recurring Bills | `/recurringbills` | Recurring bills |
## Notes
- All successful responses have `code: 0`
- Dates should be in `yyyy-mm-dd` format
- Contact types are `customer` or `vendor`
- Some modules (items, chart of accounts, bank accounts, projects) require additional OAuth scopes
- Rate limits: 100 requests/minute per organization
- Pagination uses `page` and `per_page` parameters with `has_more_page` in response
## Resources
- [Zoho Books API v3 Introduction](https://www.zoho.com/books/api/v3/introduction/)
- [Zoho Books Invoices API](https://www.zoho.com/books/api/v3/invoices/)
- [Zoho Books Contacts API](https://www.zoho.com/books/api/v3/contacts/)
- [Zoho Books Bills API](https://www.zoho.com/books/api/v3/bills/)
- [Zoho Books Expenses API](https://www.zoho.com/books/api/v3/expenses/)

View File

@@ -0,0 +1,118 @@
# Zoho Calendar Routing Reference
**App name:** `zoho-calendar`
**Base URL proxied:** `calendar.zoho.com`
## API Path Pattern
```
/zoho-calendar/api/v1/{resource}
```
## Common Endpoints
### Calendars
```bash
# List calendars
GET /zoho-calendar/api/v1/calendars
# Get calendar details
GET /zoho-calendar/api/v1/calendars/{calendar_uid}
# Create calendar
POST /zoho-calendar/api/v1/calendars?calendarData={json}
# Delete calendar
DELETE /zoho-calendar/api/v1/calendars/{calendar_uid}
```
### Events
```bash
# List events (range required, max 31 days)
GET /zoho-calendar/api/v1/calendars/{calendar_uid}/events?range={"start":"yyyyMMdd","end":"yyyyMMdd"}
# Get event details
GET /zoho-calendar/api/v1/calendars/{calendar_uid}/events/{event_uid}
# Create event
POST /zoho-calendar/api/v1/calendars/{calendar_uid}/events?eventdata={json}
# Update event (etag required in eventdata)
PUT /zoho-calendar/api/v1/calendars/{calendar_uid}/events/{event_uid}?eventdata={json}
# Delete event (etag required as HEADER)
DELETE /zoho-calendar/api/v1/calendars/{calendar_uid}/events/{event_uid}
Header: etag: {etag_value}
```
## Event Data Format
### Create/Update Event
```json
{
"title": "Meeting Title",
"dateandtime": {
"timezone": "America/Los_Angeles",
"start": "yyyyMMdd'T'HHmmss'Z'",
"end": "yyyyMMdd'T'HHmmss'Z'"
},
"description": "Event description",
"location": "Meeting room",
"isallday": false,
"attendees": [
{
"email": "user@example.com",
"permission": 1,
"attendance": 1
}
],
"reminders": [
{
"action": "popup",
"minutes": 30
}
],
"rrule": "FREQ=DAILY;COUNT=5"
}
```
### Update Event (etag required)
```json
{
"title": "Updated Title",
"dateandtime": {...},
"etag": 1770368451507
}
```
## Calendar Data Format
```json
{
"name": "Calendar Name",
"color": "#FF5733",
"textcolor": "#FFFFFF",
"description": "Calendar description"
}
```
## Notes
- Event and calendar data is passed as JSON in query parameters (`eventdata`, `calendarData`)
- Date/time format: `yyyyMMdd'T'HHmmss'Z'` (GMT) for timed events, `yyyyMMdd` for all-day
- The `range` parameter for listing events cannot exceed 31 days
- **IMPORTANT:** For delete operations, `etag` must be passed as an HTTP header, not a query parameter
- The `etag` is required for update and delete operations - always get the latest etag before modifying
- Permission levels for attendees: 0 (Guest), 1 (View), 2 (Invite), 3 (Edit)
- Attendance: 0 (Non-participant), 1 (Required), 2 (Optional)
- Reminder actions: `email`, `popup`, `notification`
## Resources
- [Zoho Calendar API Introduction](https://www.zoho.com/calendar/help/api/introduction.html)
- [Zoho Calendar Events API](https://www.zoho.com/calendar/help/api/events-api.html)
- [Zoho Calendar Calendars API](https://www.zoho.com/calendar/help/api/calendars-api.html)

View File

@@ -0,0 +1,112 @@
# Zoho CRM Routing Reference
**App name:** `zoho-crm`
**Base URL proxied:** `www.zohoapis.com`
## API Path Pattern
```
/zoho-crm/crm/v8/{resource}
```
## Common Endpoints
### Records
```bash
# List records (fields required)
GET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}
# Get record
GET /zoho-crm/crm/v8/{module_api_name}/{record_id}
# Create records
POST /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{
"field_api_name": "value"
}
]
}
# Update records
PUT /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{
"id": "record_id",
"field_api_name": "updated_value"
}
]
}
# Delete records
DELETE /zoho-crm/crm/v8/{module_api_name}?ids={id1},{id2}
```
### Search
```bash
# Search by criteria
GET /zoho-crm/crm/v8/{module_api_name}/search?criteria=(Last_Name:equals:Smith)
# Search by email
GET /zoho-crm/crm/v8/{module_api_name}/search?email=user@example.com
# Search by phone
GET /zoho-crm/crm/v8/{module_api_name}/search?phone=555-1234
# Global text search
GET /zoho-crm/crm/v8/{module_api_name}/search?word=searchterm
```
## Available Modules
| Module | API Name | Description |
|--------|----------|-------------|
| Leads | `Leads` | Potential customers |
| Contacts | `Contacts` | Individual people |
| Accounts | `Accounts` | Organizations/companies |
| Deals | `Deals` | Sales opportunities |
| Campaigns | `Campaigns` | Marketing campaigns |
| Tasks | `Tasks` | To-do items |
| Calls | `Calls` | Phone call logs |
| Events | `Events` | Calendar appointments |
| Products | `Products` | Items for sale |
## Mandatory Fields
| Module | Required Fields |
|--------|-----------------|
| Leads | `Last_Name` |
| Contacts | `Last_Name` |
| Accounts | `Account_Name` |
| Deals | `Deal_Name`, `Stage` |
| Tasks | `Subject` |
## Search Operators
- Text: `equals`, `not_equal`, `starts_with`, `in`
- Date/Number: `equals`, `not_equal`, `greater_than`, `less_than`, `between`, `in`
- Boolean: `equals`, `not_equal`
## Notes
- The `fields` parameter is **required** for list operations (max 50 fields)
- Module API names are case-sensitive (e.g., `Leads`, not `leads`)
- Maximum 100 records per create/update/delete request
- Maximum 200 records returned per GET request
- Use `page_token` for >2,000 records (expires after 24 hours)
- Some modules require additional OAuth scopes (Tasks, Events, Calls, Products)
- Empty datasets return HTTP 204 (No Content)
## Resources
- [Zoho CRM API v8 Documentation](https://www.zoho.com/crm/developer/docs/api/v8/)
- [Get Records API](https://www.zoho.com/crm/developer/docs/api/v8/get-records.html)
- [Search Records API](https://www.zoho.com/crm/developer/docs/api/v8/search-records.html)

View File

@@ -0,0 +1,214 @@
# Zoho Inventory Routing Reference
**App name:** `zoho-inventory`
**Base URL proxied:** `www.zohoapis.com`
## API Path Pattern
```
/zoho-inventory/inventory/v1/{resource}
```
## Common Endpoints
### Items
```bash
# List items
GET /zoho-inventory/inventory/v1/items
# Get item
GET /zoho-inventory/inventory/v1/items/{item_id}
# Create item
POST /zoho-inventory/inventory/v1/items
Content-Type: application/json
{
"name": "Widget",
"rate": 25.00,
"purchase_rate": 10.00,
"sku": "WDG-001",
"item_type": "inventory",
"product_type": "goods",
"unit": "pcs"
}
# Update item
PUT /zoho-inventory/inventory/v1/items/{item_id}
# Delete item
DELETE /zoho-inventory/inventory/v1/items/{item_id}
# Mark as active/inactive
POST /zoho-inventory/inventory/v1/items/{item_id}/active
POST /zoho-inventory/inventory/v1/items/{item_id}/inactive
```
### Contacts
```bash
# List contacts
GET /zoho-inventory/inventory/v1/contacts
# Get contact
GET /zoho-inventory/inventory/v1/contacts/{contact_id}
# Create contact
POST /zoho-inventory/inventory/v1/contacts
Content-Type: application/json
{
"contact_name": "Customer Name",
"contact_type": "customer"
}
# Update contact
PUT /zoho-inventory/inventory/v1/contacts/{contact_id}
# Delete contact
DELETE /zoho-inventory/inventory/v1/contacts/{contact_id}
```
### Sales Orders
```bash
# List sales orders
GET /zoho-inventory/inventory/v1/salesorders
# Get sales order
GET /zoho-inventory/inventory/v1/salesorders/{salesorder_id}
# Create sales order
POST /zoho-inventory/inventory/v1/salesorders
# Update sales order
PUT /zoho-inventory/inventory/v1/salesorders/{salesorder_id}
# Delete sales order
DELETE /zoho-inventory/inventory/v1/salesorders/{salesorder_id}
# Status actions
POST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/confirmed
POST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/void
```
### Invoices
```bash
# List invoices
GET /zoho-inventory/inventory/v1/invoices
# Get invoice
GET /zoho-inventory/inventory/v1/invoices/{invoice_id}
# Create invoice
POST /zoho-inventory/inventory/v1/invoices
# Update invoice
PUT /zoho-inventory/inventory/v1/invoices/{invoice_id}
# Delete invoice
DELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}
# Status actions
POST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/sent
POST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/draft
POST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/void
# Email
POST /zoho-inventory/inventory/v1/invoices/{invoice_id}/email
```
### Purchase Orders
```bash
# List purchase orders
GET /zoho-inventory/inventory/v1/purchaseorders
# Create purchase order
POST /zoho-inventory/inventory/v1/purchaseorders
# Update purchase order
PUT /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}
# Delete purchase order
DELETE /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}
# Status actions
POST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/issued
POST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/cancelled
```
### Bills
```bash
# List bills
GET /zoho-inventory/inventory/v1/bills
# Create bill
POST /zoho-inventory/inventory/v1/bills
# Update bill
PUT /zoho-inventory/inventory/v1/bills/{bill_id}
# Delete bill
DELETE /zoho-inventory/inventory/v1/bills/{bill_id}
# Status actions
POST /zoho-inventory/inventory/v1/bills/{bill_id}/status/open
POST /zoho-inventory/inventory/v1/bills/{bill_id}/status/void
```
### Item Groups
```bash
GET /zoho-inventory/inventory/v1/itemgroups
GET /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}
POST /zoho-inventory/inventory/v1/itemgroups
PUT /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}
DELETE /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}
```
### Shipment Orders
```bash
POST /zoho-inventory/inventory/v1/shipmentorders
GET /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}
PUT /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}
DELETE /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}
POST /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}/status/delivered
```
## Available Modules
| Module | Endpoint | Description |
|--------|----------|-------------|
| Items | `/items` | Products and services |
| Item Groups | `/itemgroups` | Grouped product variants |
| Contacts | `/contacts` | Customers and vendors |
| Sales Orders | `/salesorders` | Sales orders |
| Invoices | `/invoices` | Sales invoices |
| Purchase Orders | `/purchaseorders` | Purchase orders |
| Bills | `/bills` | Vendor bills |
| Shipment Orders | `/shipmentorders` | Shipment tracking |
## Notes
- All successful responses have `code: 0`
- Dates should be in `yyyy-mm-dd` format
- Contact types are `customer` or `vendor`
- The `organization_id` parameter is automatically handled by the gateway
- Sales order and purchase order numbers are auto-generated by default
- Pagination uses `page` and `per_page` parameters with `has_more_page` in response
- Rate limits: 100 requests/minute per organization
## Resources
- [Zoho Inventory API v1 Introduction](https://www.zoho.com/inventory/api/v1/introduction/)
- [Zoho Inventory Items API](https://www.zoho.com/inventory/api/v1/items/)
- [Zoho Inventory Contacts API](https://www.zoho.com/inventory/api/v1/contacts/)
- [Zoho Inventory Sales Orders API](https://www.zoho.com/inventory/api/v1/salesorders/)
- [Zoho Inventory Invoices API](https://www.zoho.com/inventory/api/v1/invoices/)
- [Zoho Inventory Purchase Orders API](https://www.zoho.com/inventory/api/v1/purchaseorders/)
- [Zoho Inventory Bills API](https://www.zoho.com/inventory/api/v1/bills/)

View File

@@ -0,0 +1,173 @@
# Zoho Mail Routing Reference
**App name:** `zoho-mail`
**Base URL proxied:** `mail.zoho.com`
## API Path Pattern
```
/zoho-mail/api/{resource}
```
## Common Endpoints
### Accounts
```bash
# Get all accounts
GET /zoho-mail/api/accounts
# Get account details
GET /zoho-mail/api/accounts/{accountId}
```
### Folders
```bash
# List all folders
GET /zoho-mail/api/accounts/{accountId}/folders
# Create folder
POST /zoho-mail/api/accounts/{accountId}/folders
Content-Type: application/json
{
"folderName": "My Folder"
}
# Rename folder
PUT /zoho-mail/api/accounts/{accountId}/folders/{folderId}
Content-Type: application/json
{
"folderName": "Renamed Folder"
}
# Delete folder
DELETE /zoho-mail/api/accounts/{accountId}/folders/{folderId}
```
### Labels
```bash
# List labels
GET /zoho-mail/api/accounts/{accountId}/labels
# Create label
POST /zoho-mail/api/accounts/{accountId}/labels
Content-Type: application/json
{
"labelName": "Important"
}
# Update label
PUT /zoho-mail/api/accounts/{accountId}/labels/{labelId}
# Delete label
DELETE /zoho-mail/api/accounts/{accountId}/labels/{labelId}
```
### Messages
```bash
# List emails in folder
GET /zoho-mail/api/accounts/{accountId}/messages/view?folderId={folderId}&limit=50
# Search emails
GET /zoho-mail/api/accounts/{accountId}/messages/search?searchKey={query}
# Get email content
GET /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}/content
# Get email headers
GET /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}/header
# Get email metadata
GET /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}/details
# Get original MIME message
GET /zoho-mail/api/accounts/{accountId}/messages/{messageId}/originalmessage
# Send email
POST /zoho-mail/api/accounts/{accountId}/messages
Content-Type: application/json
{
"fromAddress": "sender@yourdomain.com",
"toAddress": "recipient@example.com",
"subject": "Subject",
"content": "Email body",
"mailFormat": "html"
}
# Reply to email
POST /zoho-mail/api/accounts/{accountId}/messages/{messageId}
# Update message (mark read, move, flag, archive, spam)
PUT /zoho-mail/api/accounts/{accountId}/updatemessage
Content-Type: application/json
{
"messageId": ["messageId1"],
"folderId": "folderId",
"mode": "markAsRead"
}
# Delete email
DELETE /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}
```
### Attachments
```bash
# Upload attachment
POST /zoho-mail/api/accounts/{accountId}/messages/attachments
Content-Type: multipart/form-data
# Get attachment info
GET /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}/attachmentinfo
# Download attachment
GET /zoho-mail/api/accounts/{accountId}/folders/{folderId}/messages/{messageId}/attachments/{attachmentId}
```
## Update Message Modes
| Mode | Description |
|------|-------------|
| `markAsRead` | Mark messages as read |
| `markAsUnread` | Mark messages as unread |
| `moveMessage` | Move messages (requires `destfolderId`) |
| `flag` | Set flag (requires `flagid`: 1-4) |
| `archive` | Archive messages |
| `unArchive` | Unarchive messages |
| `spam` | Mark as spam |
| `notSpam` | Mark as not spam |
## Default Folders
| Folder | Type |
|--------|------|
| Inbox | `Inbox` |
| Drafts | `Drafts` |
| Templates | `Templates` |
| Snoozed | `Snoozed` |
| Sent | `Sent` |
| Spam | `Spam` |
| Trash | `Trash` |
| Outbox | `Outbox` |
## Notes
- Account IDs are required for most operations - get via `/api/accounts`
- Message IDs and Folder IDs are numeric strings
- The `fromAddress` must be associated with the authenticated account
- Uses offset-based pagination with `start` and `limit` parameters
- Some operations require additional OAuth scopes
## Resources
- [Zoho Mail API Overview](https://www.zoho.com/mail/help/api/overview.html)
- [Email Messages API](https://www.zoho.com/mail/help/api/email-api.html)
- [Folders API](https://www.zoho.com/mail/help/api/get-all-folder-details.html)

View File

@@ -0,0 +1,153 @@
# Zoho People Routing Reference
**App name:** `zoho-people`
**Base URL proxied:** `people.zoho.com`
## API Path Pattern
```
/zoho-people/people/api/{resource}
```
or for view-based endpoints:
```
/zoho-people/api/forms/{viewName}/records
```
## Common Endpoints
### Forms
```bash
# List all forms
GET /zoho-people/people/api/forms
```
### Records (Bulk)
```bash
# Get records from any form
GET /zoho-people/people/api/forms/{formLinkName}/getRecords?sIndex=1&limit=200
# Common form link names:
# - employee
# - department
# - designation
# - leave
# - P_ClientDetails
```
### Records (View-based)
```bash
# Get records using a view
GET /zoho-people/api/forms/{viewName}/records?rec_limit=200
# Common view names:
# - P_EmployeeView
# - P_DepartmentView
# - P_DesignationView
```
### Search
```bash
# Search by Employee ID
GET /zoho-people/people/api/forms/employee/getRecords?SearchColumn=EMPLOYEEID&SearchValue={empId}
# Search by Email
GET /zoho-people/people/api/forms/employee/getRecords?SearchColumn=EMPLOYEEMAILALIAS&SearchValue={email}
# Get modified records
GET /zoho-people/people/api/forms/{formLinkName}/getRecords?modifiedtime={timestamp_ms}
```
### Insert Record
```bash
POST /zoho-people/people/api/forms/json/{formLinkName}/insertRecord
Content-Type: application/x-www-form-urlencoded
inputData={"field1":"value1","field2":"value2"}
```
### Update Record
```bash
POST /zoho-people/people/api/forms/json/{formLinkName}/updateRecord
Content-Type: application/x-www-form-urlencoded
inputData={"field1":"newValue"}&recordId={recordId}
```
### Attendance
```bash
# Get attendance entries (requires additional scope)
GET /zoho-people/people/api/attendance/getAttendanceEntries?date={date}&dateFormat={format}
# Check-in/Check-out (requires additional scope)
POST /zoho-people/people/api/attendance
Content-Type: application/x-www-form-urlencoded
dateFormat=dd/MM/yyyy HH:mm:ss&checkIn={datetime}&checkOut={datetime}&empId={empId}
```
### Leave
```bash
# Get leave records
GET /zoho-people/people/api/forms/leave/getRecords?sIndex=1&limit=200
# Add leave
POST /zoho-people/people/api/forms/json/leave/insertRecord
Content-Type: application/x-www-form-urlencoded
inputData={"Employee_ID":"EMP001","Leavetype":"123456","From":"01-Feb-2026","To":"02-Feb-2026"}
```
## Common Form Link Names
| Form | formLinkName |
|------|--------------|
| Employee | `employee` |
| Department | `department` |
| Designation | `designation` |
| Leave | `leave` |
| Clients | `P_ClientDetails` |
## Pagination
Uses index-based pagination:
- `sIndex`: Starting index (1-based)
- `limit`: Max records per request (max 200)
For page 2: `sIndex=201&limit=200`
## Notes
- Record IDs are numeric strings (e.g., `943596000000294355`)
- Insert/Update use `application/x-www-form-urlencoded` content type
- `inputData` parameter contains JSON object as string
- Attendance endpoints require additional OAuth scopes
- Maximum 200 records per request
- Response wraps data in `response.result[]` array
## Error Codes
| Code | Description |
|------|-------------|
| 7011 | Invalid form name |
| 7012 | Invalid view name |
| 7021 | Max limit exceeded (200) |
| 7024 | No records found |
| 7042 | Invalid search value |
| 7218 | Invalid OAuth scope |
## Resources
- [Zoho People API Overview](https://www.zoho.com/people/api/overview.html)
- [Get Bulk Records API](https://www.zoho.com/people/api/bulk-records.html)
- [Insert Record API](https://www.zoho.com/people/api/insert-records.html)
- [Update Record API](https://www.zoho.com/people/api/update-records.html)

View File

@@ -0,0 +1,153 @@
# Zoho Recruit Routing Reference
**App name:** `zoho-recruit`
**Base URL proxied:** `recruit.zoho.com`
## API Path Pattern
```
/zoho-recruit/recruit/v2/{module_api_name}
```
## Common Endpoints
### Modules
```bash
# List all modules
GET /zoho-recruit/recruit/v2/settings/modules
# Get specific module
GET /zoho-recruit/recruit/v2/settings/modules/{module_api_name}
```
### Records
```bash
# List records
GET /zoho-recruit/recruit/v2/{module_api_name}?page=1&per_page=200
# Get single record
GET /zoho-recruit/recruit/v2/{module_api_name}/{record_id}
# Create records (max 100)
POST /zoho-recruit/recruit/v2/{module_api_name}
Content-Type: application/json
{
"data": [
{"field_api_name": "value"}
]
}
# Update single record
PUT /zoho-recruit/recruit/v2/{module_api_name}/{record_id}
Content-Type: application/json
{
"data": [
{"field_api_name": "new_value"}
]
}
# Update multiple records (max 100)
PUT /zoho-recruit/recruit/v2/{module_api_name}
Content-Type: application/json
{
"data": [
{"id": "record_id", "field_api_name": "value"}
]
}
# Delete records (max 100)
DELETE /zoho-recruit/recruit/v2/{module_api_name}?ids={id1},{id2}
```
### Search
```bash
# Search by criteria
GET /zoho-recruit/recruit/v2/{module_api_name}/search?criteria=(field:operator:value)
# Search by email
GET /zoho-recruit/recruit/v2/{module_api_name}/search?email=user@example.com
# Search by phone
GET /zoho-recruit/recruit/v2/{module_api_name}/search?phone=555-1234
# Global word search
GET /zoho-recruit/recruit/v2/{module_api_name}/search?word=keyword
```
## Available Modules
| Module | API Name |
|--------|----------|
| Candidates | `Candidates` |
| Job Openings | `Job_Openings` |
| Applications | `Applications` |
| Interviews | `Interviews` |
| Departments | `Departments` |
| Clients | `Clients` |
| Contacts | `Contacts` |
| Campaigns | `Campaigns` |
| Referrals | `Referrals` |
| Tasks | `Tasks` |
| Events | `Events` |
| Vendors | `Vendors` |
## Query Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `fields` | string | Comma-separated field API names |
| `sort_order` | string | `asc` or `desc` |
| `sort_by` | string | Field API name |
| `converted` | string | `true`, `false`, or `both` |
| `approved` | string | `true`, `false`, or `both` |
| `page` | integer | Page number (default: 1) |
| `per_page` | integer | Records per page (max 200) |
## Search Operators
**Text fields:**
- `equals`, `not_equal`, `starts_with`, `ends_with`, `contains`, `not_contains`, `in`
**Date/Number fields:**
- `equals`, `not_equal`, `greater_than`, `less_than`, `greater_equal`, `less_equal`, `between`
## Pagination
Uses page-based pagination:
- `page`: Page number (default: 1)
- `per_page`: Records per page (max: 200)
Response includes:
```json
{
"data": [...],
"info": {
"per_page": 200,
"count": 50,
"page": 1,
"more_records": false
}
}
```
## Notes
- Module API names are case-sensitive (e.g., `Job_Openings`)
- Maximum 200 records per GET request
- Maximum 100 records per POST/PUT/DELETE request
- `Last_Name` is mandatory for Candidates
- Date format: `yyyy-MM-dd`
- DateTime format: `yyyy-MM-ddTHH:mm:ss±HH:mm` (ISO 8601)
- Lookup fields use JSON objects with `id`
## Resources
- [Zoho Recruit API v2 Overview](https://www.zoho.com/recruit/developer-guide/apiv2/)
- [Get Records API](https://www.zoho.com/recruit/developer-guide/apiv2/get-records.html)
- [Search Records API](https://www.zoho.com/recruit/developer-guide/apiv2/search-records.html)

View File

@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawdhub.com",
"slug": "auto-updater",
"installedVersion": "1.0.0",
"installedAt": 1769729588514
}

View File

@@ -0,0 +1,149 @@
---
name: auto-updater
description: "Automatically update Clawdbot and all installed skills once daily. Runs via cron, checks for updates, applies them, and messages the user with a summary of what changed."
metadata: {"version":"1.0.0","clawdbot":{"emoji":"🔄","os":["darwin","linux"]}}
---
# Auto-Updater Skill
Keep your Clawdbot and skills up to date automatically with daily update checks.
## What It Does
This skill sets up a daily cron job that:
1. Updates Clawdbot itself (via `clawdbot doctor` or package manager)
2. Updates all installed skills (via `clawdhub update --all`)
3. Messages you with a summary of what was updated
## Setup
### Quick Start
Ask Clawdbot to set up the auto-updater:
```
Set up daily auto-updates for yourself and all your skills.
```
Or manually add the cron job:
```bash
clawdbot cron add \
--name "Daily Auto-Update" \
--cron "0 4 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--wake now \
--deliver \
--message "Run daily auto-updates: check for Clawdbot updates and update all skills. Report what was updated."
```
### Configuration Options
| Option | Default | Description |
|--------|---------|-------------|
| Time | 4:00 AM | When to run updates (use `--cron` to change) |
| Timezone | System default | Set with `--tz` |
| Delivery | Main session | Where to send the update summary |
## How Updates Work
### Clawdbot Updates
For **npm/pnpm/bun installs**:
```bash
npm update -g clawdbot@latest
# or: pnpm update -g clawdbot@latest
# or: bun update -g clawdbot@latest
```
For **source installs** (git checkout):
```bash
clawdbot update
```
Always run `clawdbot doctor` after updating to apply migrations.
### Skill Updates
```bash
clawdhub update --all
```
This checks all installed skills against the registry and updates any with new versions available.
## Update Summary Format
After updates complete, you'll receive a message like:
```
🔄 Daily Auto-Update Complete
**Clawdbot**: Updated to v2026.1.10 (was v2026.1.9)
**Skills Updated (3)**:
- prd: 2.0.3 → 2.0.4
- browser: 1.2.0 → 1.2.1
- nano-banana-pro: 3.1.0 → 3.1.2
**Skills Already Current (5)**:
gemini, sag, things-mac, himalaya, peekaboo
No issues encountered.
```
## Manual Commands
Check for updates without applying:
```bash
clawdhub update --all --dry-run
```
View current skill versions:
```bash
clawdhub list
```
Check Clawdbot version:
```bash
clawdbot --version
```
## Troubleshooting
### Updates Not Running
1. Verify cron is enabled: check `cron.enabled` in config
2. Confirm Gateway is running continuously
3. Check cron job exists: `clawdbot cron list`
### Update Failures
If an update fails, the summary will include the error. Common fixes:
- **Permission errors**: Ensure the Gateway user can write to skill directories
- **Network errors**: Check internet connectivity
- **Package conflicts**: Run `clawdbot doctor` to diagnose
### Disabling Auto-Updates
Remove the cron job:
```bash
clawdbot cron remove "Daily Auto-Update"
```
Or disable temporarily in config:
```json
{
"cron": {
"enabled": false
}
}
```
## Resources
- [Clawdbot Updating Guide](https://docs.clawd.bot/install/updating)
- [ClawdHub CLI](https://docs.clawd.bot/tools/clawdhub)
- [Cron Jobs](https://docs.clawd.bot/cron)

View File

@@ -0,0 +1,152 @@
# Agent Implementation Guide
When asked to set up auto-updates, follow this procedure.
## Step 1: Detect Installation Type
```bash
# Check if installed via npm globally
npm list -g clawdbot 2>/dev/null && echo "npm-global"
# Check if installed via source (git)
[ -d ~/.clawdbot/.git ] || [ -f /opt/clawdbot/.git/config ] && echo "source-install"
# Check pnpm
pnpm list -g clawdbot 2>/dev/null && echo "pnpm-global"
# Check bun
bun pm ls -g 2>/dev/null | grep clawdbot && echo "bun-global"
```
## Step 2: Create the Update Script (Optional)
For complex setups, create a helper script at `~/.clawdbot/scripts/auto-update.sh`:
```bash
#!/bin/bash
set -e
LOG_FILE="${HOME}/.clawdbot/logs/auto-update.log"
mkdir -p "$(dirname "$LOG_FILE")"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
log "Starting auto-update..."
# Capture starting versions
CLAWDBOT_VERSION_BEFORE=$(clawdbot --version 2>/dev/null || echo "unknown")
# Update Clawdbot
log "Updating Clawdbot..."
if command -v npm &> /dev/null && npm list -g clawdbot &> /dev/null; then
npm update -g clawdbot@latest 2>&1 | tee -a "$LOG_FILE"
elif command -v pnpm &> /dev/null && pnpm list -g clawdbot &> /dev/null; then
pnpm update -g clawdbot@latest 2>&1 | tee -a "$LOG_FILE"
elif command -v bun &> /dev/null; then
bun update -g clawdbot@latest 2>&1 | tee -a "$LOG_FILE"
else
log "Running clawdbot update (source install)"
clawdbot update 2>&1 | tee -a "$LOG_FILE" || true
fi
# Run doctor for migrations
log "Running doctor..."
clawdbot doctor --yes 2>&1 | tee -a "$LOG_FILE" || true
# Capture new version
CLAWDBOT_VERSION_AFTER=$(clawdbot --version 2>/dev/null || echo "unknown")
# Update skills
log "Updating skills via ClawdHub..."
SKILL_OUTPUT=$(clawdhub update --all 2>&1) || true
echo "$SKILL_OUTPUT" >> "$LOG_FILE"
log "Auto-update complete."
# Output summary for agent to parse
echo "---UPDATE_SUMMARY_START---"
echo "clawdbot_before: $CLAWDBOT_VERSION_BEFORE"
echo "clawdbot_after: $CLAWDBOT_VERSION_AFTER"
echo "skill_output: $SKILL_OUTPUT"
echo "---UPDATE_SUMMARY_END---"
```
## Step 3: Add Cron Job
The recommended approach is to use Clawdbot's built-in cron with an isolated session:
```bash
clawdbot cron add \
--name "Daily Auto-Update" \
--cron "0 4 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--wake now \
--deliver \
--message "Run the daily auto-update routine:
1. Check and update Clawdbot:
- For npm installs: npm update -g clawdbot@latest
- For source installs: clawdbot update
- Then run: clawdbot doctor --yes
2. Update all skills:
- Run: clawdhub update --all
3. Report back with:
- Clawdbot version before/after
- List of skills that were updated (name + old version → new version)
- Any errors encountered
Format the summary clearly for the user."
```
## Step 4: Verify Setup
```bash
# Confirm cron job was added
clawdbot cron list
# Test the update commands work
clawdbot --version
clawdhub list
```
## Customization Prompts
Users may want to customize:
**Different time:**
```bash
--cron "0 6 * * *" # 6 AM instead of 4 AM
```
**Different timezone:**
```bash
--tz "Europe/London"
```
**Specific provider delivery:**
```bash
--provider telegram --to "@username"
```
**Weekly instead of daily:**
```bash
--cron "0 4 * * 0" # Sundays at 4 AM
```
## Error Handling
If updates fail, the agent should:
1. Log the error clearly
2. Still report partial success (if skills updated but Clawdbot didn't, or vice versa)
3. Suggest manual intervention if needed
Common errors to handle:
- `EACCES`: Permission denied → suggest `sudo` or fixing permissions
- Network timeouts → retry once, then report
- Git conflicts (source installs) → suggest `clawdbot update --force`

View File

@@ -0,0 +1,109 @@
# Update Summary Examples
Reference examples for formatting the update report message.
## Full Update (Everything Changed)
```
🔄 Daily Auto-Update Complete
**Clawdbot**
Updated: v2026.1.9 → v2026.1.10
Key changes in this release:
- CLI: add clawdbot update command
- Gateway: add OpenAI-compatible HTTP endpoint
- Sandbox: improved tool-policy errors
**Skills Updated (3)**
1. prd: 2.0.3 → 2.0.4
2. browser: 1.2.0 → 1.2.1
3. nano-banana-pro: 3.1.0 → 3.1.2
**Skills Already Current (5)**
gemini, sag, things-mac, himalaya, peekaboo
✅ All updates completed successfully.
```
## No Updates Available
```
🔄 Daily Auto-Update Check
**Clawdbot**: v2026.1.10 (already latest)
**Skills**: All 8 installed skills are current.
Nothing to update today.
```
## Partial Update (Skills Only)
```
🔄 Daily Auto-Update Complete
**Clawdbot**: v2026.1.10 (no update available)
**Skills Updated (2)**
1. himalaya: 1.0.0 → 1.0.1
- Fixed IMAP connection timeout handling
2. 1password: 2.1.0 → 2.2.0
- Added support for SSH keys
**Skills Already Current (6)**
prd, gemini, browser, sag, things-mac, peekaboo
✅ Skill updates completed.
```
## Update With Errors
```
🔄 Daily Auto-Update Complete (with issues)
**Clawdbot**: v2026.1.9 → v2026.1.10 ✅
**Skills Updated (1)**
1. prd: 2.0.3 → 2.0.4 ✅
**Skills Failed (1)**
1. ❌ nano-banana-pro: Update failed
Error: Network timeout while downloading v3.1.2
Recommendation: Run `clawdhub update nano-banana-pro` manually
**Skills Already Current (6)**
gemini, sag, things-mac, himalaya, peekaboo, browser
⚠️ Completed with 1 error. See above for details.
```
## First Run / Setup Confirmation
```
🔄 Auto-Updater Configured
Daily updates will run at 4:00 AM (America/Los_Angeles).
**What will be updated:**
- Clawdbot core
- All installed skills via ClawdHub
**Current status:**
- Clawdbot: v2026.1.10
- Installed skills: 8
You'll receive a summary here after each update run.
To modify: `clawdbot cron edit "Daily Auto-Update"`
To disable: `clawdbot cron remove "Daily Auto-Update"`
```
## Formatting Guidelines
1. **Use emojis sparingly** - just the 🔄 header and ✅/❌ for status
2. **Lead with the most important info** - what changed
3. **Group similar items** - updated skills together, current skills together
4. **Include version numbers** - always show before → after
5. **Be concise** - users want a quick scan, not a wall of text
6. **Surface errors prominently** - don't bury failures

View File

@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawdhub.com",
"slug": "clawdbot-backup",
"installedVersion": "1.0.0",
"installedAt": 1769731470951
}

View File

@@ -0,0 +1,802 @@
---
name: clawdbot-backup
description: Backup and restore ClawdBot configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.
homepage: https://github.com/clawdbot/backup-skill
metadata: {"clawdbot":{"emoji":"💾","requires":{"bins":["git","tar","rsync"],"env":[]}}}
---
# ClawdBot Backup Skill
Backup, restore, and sync your ClawdBot configuration across devices directly from Clawdbot.
## Overview
This skill helps you:
- Backup all ClawdBot data and settings
- Restore from backups
- Sync between multiple machines
- Version control your configuration
- Automate backup routines
- Migrate to new devices
## ClawdBot Directory Structure
### Key Locations
```
~/.claude/ # Main ClawdBot directory
├── settings.json # Global settings
├── settings.local.json # Local overrides (machine-specific)
├── projects.json # Project configurations
├── skills/ # Your custom skills
│ ├── skill-name/
│ │ ├── SKILL.md
│ │ └── supporting-files/
│ └── another-skill/
├── commands/ # Custom slash commands (legacy)
│ └── command-name.md
├── contexts/ # Saved contexts
├── templates/ # Response templates
└── mcp/ # MCP server configurations
└── servers.json
~/projects/ # Your projects (optional backup)
├── project-1/
│ └── .claude/ # Project-specific config
│ ├── settings.json
│ └── skills/
└── project-2/
```
### What to Backup
```
ESSENTIAL (Always backup):
✓ ~/.claude/skills/ # Custom skills
✓ ~/.claude/commands/ # Custom commands
✓ ~/.claude/settings.json # Global settings
✓ ~/.claude/mcp/ # MCP configurations
RECOMMENDED (Usually backup):
✓ ~/.claude/contexts/ # Saved contexts
✓ ~/.claude/templates/ # Templates
✓ Project .claude/ folders # Project configs
OPTIONAL (Case by case):
○ ~/.claude/settings.local.json # Machine-specific
○ Cache directories # Can be rebuilt
○ Log files # Usually not needed
```
## Quick Backup Commands
### Full Backup
```bash
# Create timestamped backup
BACKUP_DIR="$HOME/clawdbot-backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="clawdbot_backup_$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \
-C "$HOME" \
.claude/skills \
.claude/commands \
.claude/settings.json \
.claude/mcp \
.claude/contexts \
.claude/templates \
2>/dev/null
echo "Backup created: $BACKUP_DIR/$BACKUP_NAME.tar.gz"
```
### Quick Skills-Only Backup
```bash
# Backup just skills
tar -czvf ~/clawdbot_skills_$(date +%Y%m%d).tar.gz \
-C "$HOME" .claude/skills .claude/commands
```
### Restore from Backup
```bash
# Restore full backup
BACKUP_FILE="$HOME/clawdbot-backups/clawdbot_backup_20260129.tar.gz"
# Preview contents first
tar -tzvf "$BACKUP_FILE"
# Restore (will overwrite existing)
tar -xzvf "$BACKUP_FILE" -C "$HOME"
echo "Restore complete!"
```
## Backup Script
### Full-Featured Backup Script
```bash
#!/bin/bash
# clawdbot-backup.sh - Comprehensive ClawdBot backup tool
set -e
# Configuration
BACKUP_ROOT="${CLAWDBOT_BACKUP_DIR:-$HOME/clawdbot-backups}"
CLAUDE_DIR="$HOME/.claude"
MAX_BACKUPS=10 # Keep last N backups
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Check if ClawdBot directory exists
check_claude_dir() {
if [ ! -d "$CLAUDE_DIR" ]; then
log_error "ClawdBot directory not found: $CLAUDE_DIR"
exit 1
fi
}
# Create backup
create_backup() {
local backup_type="${1:-full}"
local backup_name="clawdbot_${backup_type}_${TIMESTAMP}"
local backup_path="$BACKUP_ROOT/$backup_name.tar.gz"
mkdir -p "$BACKUP_ROOT"
log_info "Creating $backup_type backup..."
case $backup_type in
full)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/skills \
.claude/commands \
.claude/settings.json \
.claude/settings.local.json \
.claude/projects.json \
.claude/mcp \
.claude/contexts \
.claude/templates \
2>/dev/null || true
;;
skills)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/skills \
.claude/commands \
2>/dev/null || true
;;
settings)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/settings.json \
.claude/settings.local.json \
.claude/mcp \
2>/dev/null || true
;;
*)
log_error "Unknown backup type: $backup_type"
exit 1
;;
esac
if [ -f "$backup_path" ]; then
local size=$(du -h "$backup_path" | cut -f1)
log_info "Backup created: $backup_path ($size)"
else
log_error "Backup failed!"
exit 1
fi
}
# List backups
list_backups() {
log_info "Available backups in $BACKUP_ROOT:"
echo ""
if [ -d "$BACKUP_ROOT" ]; then
ls -lh "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | \
awk '{print $9, $5, $6, $7, $8}' || \
echo "No backups found."
else
echo "Backup directory doesn't exist."
fi
}
# Restore backup
restore_backup() {
local backup_file="$1"
if [ -z "$backup_file" ]; then
log_error "Please specify backup file"
list_backups
exit 1
fi
if [ ! -f "$backup_file" ]; then
# Try relative path in backup dir
backup_file="$BACKUP_ROOT/$backup_file"
fi
if [ ! -f "$backup_file" ]; then
log_error "Backup file not found: $backup_file"
exit 1
fi
log_warn "This will overwrite existing configuration!"
read -p "Continue? (y/N) " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
log_info "Restore cancelled."
exit 0
fi
log_info "Restoring from: $backup_file"
tar -xzvf "$backup_file" -C "$HOME"
log_info "Restore complete!"
}
# Clean old backups
cleanup_backups() {
log_info "Cleaning old backups (keeping last $MAX_BACKUPS)..."
cd "$BACKUP_ROOT" 2>/dev/null || return
local count=$(ls -1 *.tar.gz 2>/dev/null | wc -l)
if [ "$count" -gt "$MAX_BACKUPS" ]; then
local to_delete=$((count - MAX_BACKUPS))
ls -1t *.tar.gz | tail -n "$to_delete" | xargs rm -v
log_info "Removed $to_delete old backup(s)"
else
log_info "No cleanup needed ($count backups)"
fi
}
# Show backup stats
show_stats() {
log_info "ClawdBot Backup Statistics"
echo ""
echo "=== Directory Sizes ==="
du -sh "$CLAUDE_DIR"/skills 2>/dev/null || echo "Skills: N/A"
du -sh "$CLAUDE_DIR"/commands 2>/dev/null || echo "Commands: N/A"
du -sh "$CLAUDE_DIR"/mcp 2>/dev/null || echo "MCP: N/A"
du -sh "$CLAUDE_DIR" 2>/dev/null || echo "Total: N/A"
echo ""
echo "=== Skills Count ==="
find "$CLAUDE_DIR/skills" -name "SKILL.md" 2>/dev/null | wc -l | xargs echo "Skills:"
find "$CLAUDE_DIR/commands" -name "*.md" 2>/dev/null | wc -l | xargs echo "Commands:"
echo ""
echo "=== Backup Directory ==="
if [ -d "$BACKUP_ROOT" ]; then
du -sh "$BACKUP_ROOT"
ls -1 "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | wc -l | xargs echo "Backup files:"
else
echo "No backups yet"
fi
}
# Usage
usage() {
cat << EOF
ClawdBot Backup Tool
Usage: $(basename $0) <command> [options]
Commands:
backup [type] Create backup (types: full, skills, settings)
restore <file> Restore from backup file
list List available backups
cleanup Remove old backups (keep last $MAX_BACKUPS)
stats Show backup statistics
help Show this help
Examples:
$(basename $0) backup # Full backup
$(basename $0) backup skills # Skills only
$(basename $0) restore latest.tar.gz
$(basename $0) list
$(basename $0) cleanup
Environment:
CLAWDBOT_BACKUP_DIR Backup directory (default: ~/clawdbot-backups)
EOF
}
# Main
main() {
check_claude_dir
case "${1:-help}" in
backup)
create_backup "${2:-full}"
;;
restore)
restore_backup "$2"
;;
list)
list_backups
;;
cleanup)
cleanup_backups
;;
stats)
show_stats
;;
help|--help|-h)
usage
;;
*)
log_error "Unknown command: $1"
usage
exit 1
;;
esac
}
main "$@"
```
### Save and Use
```bash
# Save script
cat > ~/.local/bin/clawdbot-backup << 'SCRIPT'
# Paste script content here
SCRIPT
chmod +x ~/.local/bin/clawdbot-backup
# Usage
clawdbot-backup backup # Full backup
clawdbot-backup backup skills # Skills only
clawdbot-backup list # List backups
clawdbot-backup restore <file> # Restore
```
## Git Version Control
### Initialize Git Repo
```bash
cd ~/.claude
# Initialize git
git init
# Create .gitignore
cat > .gitignore << 'EOF'
# Machine-specific settings
settings.local.json
# Cache and temp files
cache/
*.tmp
*.log
# Large files
*.tar.gz
*.zip
# Sensitive data (if any)
*.pem
*.key
credentials/
EOF
# Initial commit
git add .
git commit -m "Initial ClawdBot configuration backup"
```
### Push to Remote
```bash
# Add remote (GitHub, GitLab, etc)
git remote add origin git@github.com:username/clawdbot-config.git
# Push
git push -u origin main
```
### Daily Workflow
```bash
# After making changes to skills/settings
cd ~/.claude
git add .
git commit -m "Updated skill: trading-bot"
git push
```
### Auto-Commit Script
```bash
#!/bin/bash
# auto-commit-claude.sh - Auto commit changes
cd ~/.claude || exit 1
# Check for changes
if git diff --quiet && git diff --staged --quiet; then
echo "No changes to commit"
exit 0
fi
# Get changed files for commit message
CHANGED=$(git status --short | head -5 | awk '{print $2}' | tr '\n' ', ')
git add .
git commit -m "Auto-backup: $CHANGED ($(date +%Y-%m-%d))"
git push 2>/dev/null || echo "Push failed (offline?)"
```
## Sync Between Devices
### Method 1: Git Sync
```bash
# On new device
git clone git@github.com:username/clawdbot-config.git ~/.claude
# Pull latest changes
cd ~/.claude && git pull
# Push local changes
cd ~/.claude && git add . && git commit -m "Update" && git push
```
### Method 2: Rsync
```bash
# Sync to remote server
rsync -avz --delete \
~/.claude/ \
user@server:~/clawdbot-backup/
# Sync from remote server
rsync -avz --delete \
user@server:~/clawdbot-backup/ \
~/.claude/
```
### Method 3: Cloud Storage
```bash
# Backup to cloud folder (Dropbox, Google Drive, etc)
CLOUD_DIR="$HOME/Dropbox/ClawdBot"
# Sync skills
rsync -avz ~/.claude/skills/ "$CLOUD_DIR/skills/"
rsync -avz ~/.claude/commands/ "$CLOUD_DIR/commands/"
# Copy settings
cp ~/.claude/settings.json "$CLOUD_DIR/"
```
### Sync Script
```bash
#!/bin/bash
# sync-clawdbot.sh - Sync ClawdBot config between devices
SYNC_DIR="${CLAWDBOT_SYNC_DIR:-$HOME/Dropbox/ClawdBot}"
CLAUDE_DIR="$HOME/.claude"
sync_to_cloud() {
echo "Syncing to cloud..."
mkdir -p "$SYNC_DIR"
rsync -avz --delete "$CLAUDE_DIR/skills/" "$SYNC_DIR/skills/"
rsync -avz --delete "$CLAUDE_DIR/commands/" "$SYNC_DIR/commands/"
rsync -avz "$CLAUDE_DIR/mcp/" "$SYNC_DIR/mcp/" 2>/dev/null
cp "$CLAUDE_DIR/settings.json" "$SYNC_DIR/" 2>/dev/null
echo "Sync complete!"
}
sync_from_cloud() {
echo "Syncing from cloud..."
rsync -avz "$SYNC_DIR/skills/" "$CLAUDE_DIR/skills/"
rsync -avz "$SYNC_DIR/commands/" "$CLAUDE_DIR/commands/"
rsync -avz "$SYNC_DIR/mcp/" "$CLAUDE_DIR/mcp/" 2>/dev/null
# Don't overwrite local settings by default
if [ ! -f "$CLAUDE_DIR/settings.json" ]; then
cp "$SYNC_DIR/settings.json" "$CLAUDE_DIR/" 2>/dev/null
fi
echo "Sync complete!"
}
case "$1" in
push) sync_to_cloud ;;
pull) sync_from_cloud ;;
*)
echo "Usage: $0 {push|pull}"
echo " push - Upload local config to cloud"
echo " pull - Download cloud config to local"
;;
esac
```
## Automated Backups
### Cron Job (Linux/Mac)
```bash
# Edit crontab
crontab -e
# Add daily backup at 2 AM
0 2 * * * /home/user/.local/bin/clawdbot-backup backup full
# Add weekly cleanup on Sundays
0 3 * * 0 /home/user/.local/bin/clawdbot-backup cleanup
# Add git auto-commit every 6 hours
0 */6 * * * cd ~/.claude && git add . && git commit -m "Auto-backup $(date +\%Y-\%m-\%d)" && git push 2>/dev/null
```
### Systemd Timer (Linux)
```bash
# Create service: ~/.config/systemd/user/clawdbot-backup.service
cat > ~/.config/systemd/user/clawdbot-backup.service << 'EOF'
[Unit]
Description=ClawdBot Backup
[Service]
Type=oneshot
ExecStart=/home/user/.local/bin/clawdbot-backup backup full
EOF
# Create timer: ~/.config/systemd/user/clawdbot-backup.timer
cat > ~/.config/systemd/user/clawdbot-backup.timer << 'EOF'
[Unit]
Description=Daily ClawdBot Backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Enable
systemctl --user enable clawdbot-backup.timer
systemctl --user start clawdbot-backup.timer
```
### Launchd (macOS)
```bash
# Create plist: ~/Library/LaunchAgents/com.clawdbot.backup.plist
cat > ~/Library/LaunchAgents/com.clawdbot.backup.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.clawdbot.backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/username/.local/bin/clawdbot-backup</string>
<string>backup</string>
<string>full</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
EOF
# Load
launchctl load ~/Library/LaunchAgents/com.clawdbot.backup.plist
```
## Migration Guide
### Migrate to New Machine
```bash
# === On OLD machine ===
# 1. Create full backup
clawdbot-backup backup full
# 2. Copy backup file to new machine
scp ~/clawdbot-backups/clawdbot_full_*.tar.gz newmachine:~/
# Or use git
cd ~/.claude
git add . && git commit -m "Pre-migration backup"
git push
# === On NEW machine ===
# Method A: From backup file
tar -xzvf ~/clawdbot_full_*.tar.gz -C ~
# Method B: From git
git clone git@github.com:username/clawdbot-config.git ~/.claude
# 3. Verify
ls -la ~/.claude/skills/
```
### Export Single Skill
```bash
# Export one skill for sharing
SKILL_NAME="my-awesome-skill"
tar -czvf "${SKILL_NAME}.tar.gz" -C ~/.claude/skills "$SKILL_NAME"
# Import skill
tar -xzvf "${SKILL_NAME}.tar.gz" -C ~/.claude/skills/
```
### Export All Skills for Sharing
```bash
# Create shareable skills bundle (no personal settings)
tar -czvf clawdbot-skills-share.tar.gz \
-C ~/.claude \
skills \
--exclude='*.local*' \
--exclude='*personal*'
```
## Backup Verification
### Verify Backup Integrity
```bash
# Test backup without extracting
tar -tzvf backup.tar.gz > /dev/null && echo "Backup OK" || echo "Backup CORRUPT"
# List contents
tar -tzvf backup.tar.gz
# Verify specific file exists
tar -tzvf backup.tar.gz | grep "skills/my-skill/SKILL.md"
```
### Compare Backup to Current
```bash
# Extract to temp dir
TEMP_DIR=$(mktemp -d)
tar -xzf backup.tar.gz -C "$TEMP_DIR"
# Compare
diff -rq ~/.claude/skills "$TEMP_DIR/.claude/skills"
# Cleanup
rm -rf "$TEMP_DIR"
```
## Troubleshooting
### Common Issues
```bash
# Issue: Permission denied
chmod -R u+rw ~/.claude
# Issue: Backup too large
# Exclude cache and logs
tar --exclude='cache' --exclude='*.log' -czvf backup.tar.gz ~/.claude
# Issue: Restore overwrote settings
# Keep settings.local.json for machine-specific config
# It won't be overwritten if using proper backup
# Issue: Git conflicts after sync
cd ~/.claude
git stash
git pull
git stash pop
# Resolve conflicts manually if needed
```
### Recovery from Corruption
```bash
# If ~/.claude is corrupted
# 1. Move corrupted dir
mv ~/.claude ~/.claude.corrupted
# 2. Restore from backup
clawdbot-backup restore latest.tar.gz
# 3. Or restore from git
git clone git@github.com:username/clawdbot-config.git ~/.claude
# 4. Compare and recover anything missing
diff -rq ~/.claude ~/.claude.corrupted/
```
## Quick Reference
### Essential Commands
```bash
# Backup
tar -czvf ~/clawdbot-backup.tar.gz -C ~ .claude/skills .claude/commands .claude/settings.json
# Restore
tar -xzvf ~/clawdbot-backup.tar.gz -C ~
# List backup contents
tar -tzvf ~/clawdbot-backup.tar.gz
# Git backup
cd ~/.claude && git add . && git commit -m "Backup" && git push
# Git restore
cd ~/.claude && git pull
```
### Backup Checklist
```
Before major changes:
□ Create backup
□ Verify backup integrity
□ Note what you're changing
Regular maintenance:
□ Weekly full backup
□ Daily git commits (if using)
□ Monthly cleanup of old backups
□ Test restore procedure quarterly
```
## Resources
### Related Skills
```
- skill-creator - Create new skills
- mcp-builder - Configure MCP servers
- dotfiles - General dotfile management
```
### Documentation
```
- ClawdBot Docs: docs.clawdbot.com
- Skills Guide: docs.clawdbot.com/skills
- MCP Setup: docs.clawdbot.com/mcp
```
---
**Tip:** Always test your backup restoration process before you actually need it. A backup you can't restore is worthless!

View File

@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawdhub.com",
"slug": "clean-code",
"installedVersion": "1.0.0",
"installedAt": 1769734456794
}

201
skills/clean-code/SKILL.md Normal file
View File

@@ -0,0 +1,201 @@
---
name: clean-code
description: Pragmatic coding standards - concise, direct, no over-engineering, no unnecessary comments
allowed-tools: Read, Write, Edit
version: 2.0
priority: CRITICAL
---
# Clean Code - Pragmatic AI Coding Standards
> **CRITICAL SKILL** - Be **concise, direct, and solution-focused**.
---
## Core Principles
| Principle | Rule |
|-----------|------|
| **SRP** | Single Responsibility - each function/class does ONE thing |
| **DRY** | Don't Repeat Yourself - extract duplicates, reuse |
| **KISS** | Keep It Simple - simplest solution that works |
| **YAGNI** | You Aren't Gonna Need It - don't build unused features |
| **Boy Scout** | Leave code cleaner than you found it |
---
## Naming Rules
| Element | Convention |
|---------|------------|
| **Variables** | Reveal intent: `userCount` not `n` |
| **Functions** | Verb + noun: `getUserById()` not `user()` |
| **Booleans** | Question form: `isActive`, `hasPermission`, `canEdit` |
| **Constants** | SCREAMING_SNAKE: `MAX_RETRY_COUNT` |
> **Rule:** If you need a comment to explain a name, rename it.
---
## Function Rules
| Rule | Description |
|------|-------------|
| **Small** | Max 20 lines, ideally 5-10 |
| **One Thing** | Does one thing, does it well |
| **One Level** | One level of abstraction per function |
| **Few Args** | Max 3 arguments, prefer 0-2 |
| **No Side Effects** | Don't mutate inputs unexpectedly |
---
## Code Structure
| Pattern | Apply |
|---------|-------|
| **Guard Clauses** | Early returns for edge cases |
| **Flat > Nested** | Avoid deep nesting (max 2 levels) |
| **Composition** | Small functions composed together |
| **Colocation** | Keep related code close |
---
## AI Coding Style
| Situation | Action |
|-----------|--------|
| User asks for feature | Write it directly |
| User reports bug | Fix it, don't explain |
| No clear requirement | Ask, don't assume |
---
## Anti-Patterns (DON'T)
| ❌ Pattern | ✅ Fix |
|-----------|-------|
| Comment every line | Delete obvious comments |
| Helper for one-liner | Inline the code |
| Factory for 2 objects | Direct instantiation |
| utils.ts with 1 function | Put code where used |
| "First we import..." | Just write code |
| Deep nesting | Guard clauses |
| Magic numbers | Named constants |
| God functions | Split by responsibility |
---
## 🔴 Before Editing ANY File (THINK FIRST!)
**Before changing a file, ask yourself:**
| Question | Why |
|----------|-----|
| **What imports this file?** | They might break |
| **What does this file import?** | Interface changes |
| **What tests cover this?** | Tests might fail |
| **Is this a shared component?** | Multiple places affected |
**Quick Check:**
```
File to edit: UserService.ts
└── Who imports this? → UserController.ts, AuthController.ts
└── Do they need changes too? → Check function signatures
```
> 🔴 **Rule:** Edit the file + all dependent files in the SAME task.
> 🔴 **Never leave broken imports or missing updates.**
---
## Summary
| Do | Don't |
|----|-------|
| Write code directly | Write tutorials |
| Let code self-document | Add obvious comments |
| Fix bugs immediately | Explain the fix first |
| Inline small things | Create unnecessary files |
| Name things clearly | Use abbreviations |
| Keep functions small | Write 100+ line functions |
> **Remember: The user wants working code, not a programming lesson.**
---
## 🔴 Self-Check Before Completing (MANDATORY)
**Before saying "task complete", verify:**
| Check | Question |
|-------|----------|
| ✅ **Goal met?** | Did I do exactly what user asked? |
| ✅ **Files edited?** | Did I modify all necessary files? |
| ✅ **Code works?** | Did I test/verify the change? |
| ✅ **No errors?** | Lint and TypeScript pass? |
| ✅ **Nothing forgotten?** | Any edge cases missed? |
> 🔴 **Rule:** If ANY check fails, fix it before completing.
---
## Verification Scripts (MANDATORY)
> 🔴 **CRITICAL:** Each agent runs ONLY their own skill's scripts after completing work.
### Agent → Script Mapping
| Agent | Script | Command |
|-------|--------|---------|
| **frontend-specialist** | UX Audit | `python .agent/skills/frontend-design/scripts/ux_audit.py .` |
| **frontend-specialist** | A11y Check | `python .agent/skills/frontend-design/scripts/accessibility_checker.py .` |
| **backend-specialist** | API Validator | `python .agent/skills/api-patterns/scripts/api_validator.py .` |
| **mobile-developer** | Mobile Audit | `python .agent/skills/mobile-design/scripts/mobile_audit.py .` |
| **database-architect** | Schema Validate | `python .agent/skills/database-design/scripts/schema_validator.py .` |
| **security-auditor** | Security Scan | `python .agent/skills/vulnerability-scanner/scripts/security_scan.py .` |
| **seo-specialist** | SEO Check | `python .agent/skills/seo-fundamentals/scripts/seo_checker.py .` |
| **seo-specialist** | GEO Check | `python .agent/skills/geo-fundamentals/scripts/geo_checker.py .` |
| **performance-optimizer** | Lighthouse | `python .agent/skills/performance-profiling/scripts/lighthouse_audit.py <url>` |
| **test-engineer** | Test Runner | `python .agent/skills/testing-patterns/scripts/test_runner.py .` |
| **test-engineer** | Playwright | `python .agent/skills/webapp-testing/scripts/playwright_runner.py <url>` |
| **Any agent** | Lint Check | `python .agent/skills/lint-and-validate/scripts/lint_runner.py .` |
| **Any agent** | Type Coverage | `python .agent/skills/lint-and-validate/scripts/type_coverage.py .` |
| **Any agent** | i18n Check | `python .agent/skills/i18n-localization/scripts/i18n_checker.py .` |
> ❌ **WRONG:** `test-engineer` running `ux_audit.py`
> ✅ **CORRECT:** `frontend-specialist` running `ux_audit.py`
---
### 🔴 Script Output Handling (READ → SUMMARIZE → ASK)
**When running a validation script, you MUST:**
1. **Run the script** and capture ALL output
2. **Parse the output** - identify errors, warnings, and passes
3. **Summarize to user** in this format:
```markdown
## Script Results: [script_name.py]
### ❌ Errors Found (X items)
- [File:Line] Error description 1
- [File:Line] Error description 2
### ⚠️ Warnings (Y items)
- [File:Line] Warning description
### ✅ Passed (Z items)
- Check 1 passed
- Check 2 passed
**Should I fix the X errors?**
```
4. **Wait for user confirmation** before fixing
5. **After fixing** → Re-run script to confirm
> 🔴 **VIOLATION:** Running script and ignoring output = FAILED task.
> 🔴 **VIOLATION:** Auto-fixing without asking = Not allowed.
> 🔴 **Rule:** Always READ output → SUMMARIZE → ASK → then fix.

View File

@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawdhub.com",
"slug": "coding-agent",
"installedVersion": "1.0.1",
"installedAt": 1769734439160
}

View File

@@ -0,0 +1,274 @@
---
name: coding-agent
description: Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.
metadata: {"clawdbot":{"emoji":"🧩","requires":{"anyBins":["claude","codex","opencode","pi"]}}}
---
# Coding Agent (background-first)
Use **bash background mode** for non-interactive coding work. For interactive coding sessions, use the **tmux** skill (always, except very simple one-shot prompts).
## The Pattern: workdir + background
```bash
# Create temp space for chats/scratch work
SCRATCH=$(mktemp -d)
# Start agent in target directory ("little box" - only sees relevant files)
bash workdir:$SCRATCH background:true command:"<agent command>"
# Or for project work:
bash workdir:~/project/folder background:true command:"<agent command>"
# Returns sessionId for tracking
# Monitor progress
process action:log sessionId:XXX
# Check if done
process action:poll sessionId:XXX
# Send input (if agent asks a question)
process action:write sessionId:XXX data:"y"
# Kill if needed
process action:kill sessionId:XXX
```
**Why workdir matters:** Agent wakes up in a focused directory, doesn't wander off reading unrelated files (like your soul.md 😅).
---
## Codex CLI
**Model:** `gpt-5.2-codex` is the default (set in ~/.codex/config.toml)
### Building/Creating (use --full-auto or --yolo)
```bash
# --full-auto: sandboxed but auto-approves in workspace
bash workdir:~/project background:true command:"codex exec --full-auto \"Build a snake game with dark theme\""
# --yolo: NO sandbox, NO approvals (fastest, most dangerous)
bash workdir:~/project background:true command:"codex --yolo \"Build a snake game with dark theme\""
# Note: --yolo is a shortcut for --dangerously-bypass-approvals-and-sandbox
```
### Reviewing PRs (vanilla, no flags)
**⚠️ CRITICAL: Never review PRs in Clawdbot's own project folder!**
- Either use the project where the PR is submitted (if it's NOT ~/Projects/clawdbot)
- Or clone to a temp folder first
```bash
# Option 1: Review in the actual project (if NOT clawdbot)
bash workdir:~/Projects/some-other-repo background:true command:"codex review --base main"
# Option 2: Clone to temp folder for safe review (REQUIRED for clawdbot PRs!)
REVIEW_DIR=$(mktemp -d)
git clone https://github.com/clawdbot/clawdbot.git $REVIEW_DIR
cd $REVIEW_DIR && gh pr checkout 130
bash workdir:$REVIEW_DIR background:true command:"codex review --base origin/main"
# Clean up after: rm -rf $REVIEW_DIR
# Option 3: Use git worktree (keeps main intact)
git worktree add /tmp/pr-130-review pr-130-branch
bash workdir:/tmp/pr-130-review background:true command:"codex review --base main"
```
**Why?** Checking out branches in the running Clawdbot repo can break the live instance!
### Batch PR Reviews (parallel army!)
```bash
# Fetch all PR refs first
git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*'
# Deploy the army - one Codex per PR!
bash workdir:~/project background:true command:"codex exec \"Review PR #86. git diff origin/main...origin/pr/86\""
bash workdir:~/project background:true command:"codex exec \"Review PR #87. git diff origin/main...origin/pr/87\""
bash workdir:~/project background:true command:"codex exec \"Review PR #95. git diff origin/main...origin/pr/95\""
# ... repeat for all PRs
# Monitor all
process action:list
# Get results and post to GitHub
process action:log sessionId:XXX
gh pr comment <PR#> --body "<review content>"
```
### Tips for PR Reviews
- **Fetch refs first:** `git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*'`
- **Use git diff:** Tell Codex to use `git diff origin/main...origin/pr/XX`
- **Don't checkout:** Multiple parallel reviews = don't let them change branches
- **Post results:** Use `gh pr comment` to post reviews to GitHub
---
## Claude Code
```bash
bash workdir:~/project background:true command:"claude \"Your task\""
```
---
## OpenCode
```bash
bash workdir:~/project background:true command:"opencode run \"Your task\""
```
---
## Pi Coding Agent
```bash
# Install: npm install -g @mariozechner/pi-coding-agent
bash workdir:~/project background:true command:"pi \"Your task\""
```
---
## Pi flags (common)
- `--print` / `-p`: non-interactive; runs prompt and exits.
- `--provider <name>`: pick provider (default: google).
- `--model <id>`: pick model (default: gemini-2.5-flash).
- `--api-key <key>`: override API key (defaults to env vars).
Examples:
```bash
# Set provider + model, non-interactive
bash workdir:~/project background:true command:"pi --provider openai --model gpt-4o-mini -p \"Summarize src/\""
```
---
## tmux (interactive sessions)
Use the tmux skill for interactive coding sessions (always, except very simple one-shot prompts). Prefer bash background mode for non-interactive runs.
---
## Parallel Issue Fixing with git worktrees + tmux
For fixing multiple issues in parallel, use git worktrees (isolated branches) + tmux sessions:
```bash
# 1. Clone repo to temp location
cd /tmp && git clone git@github.com:user/repo.git repo-worktrees
cd repo-worktrees
# 2. Create worktrees for each issue (isolated branches!)
git worktree add -b fix/issue-78 /tmp/issue-78 main
git worktree add -b fix/issue-99 /tmp/issue-99 main
# 3. Set up tmux sessions
SOCKET="${TMPDIR:-/tmp}/codex-fixes.sock"
tmux -S "$SOCKET" new-session -d -s fix-78
tmux -S "$SOCKET" new-session -d -s fix-99
# 4. Launch Codex in each (after pnpm install!)
tmux -S "$SOCKET" send-keys -t fix-78 "cd /tmp/issue-78 && pnpm install && codex --yolo 'Fix issue #78: <description>. Commit and push.'" Enter
tmux -S "$SOCKET" send-keys -t fix-99 "cd /tmp/issue-99 && pnpm install && codex --yolo 'Fix issue #99: <description>. Commit and push.'" Enter
# 5. Monitor progress
tmux -S "$SOCKET" capture-pane -p -t fix-78 -S -30
tmux -S "$SOCKET" capture-pane -p -t fix-99 -S -30
# 6. Check if done (prompt returned)
tmux -S "$SOCKET" capture-pane -p -t fix-78 -S -3 | grep -q "" && echo "Done!"
# 7. Create PRs after fixes
cd /tmp/issue-78 && git push -u origin fix/issue-78
gh pr create --repo user/repo --head fix/issue-78 --title "fix: ..." --body "..."
# 8. Cleanup
tmux -S "$SOCKET" kill-server
git worktree remove /tmp/issue-78
git worktree remove /tmp/issue-99
```
**Why worktrees?** Each Codex works in isolated branch, no conflicts. Can run 5+ parallel fixes!
**Why tmux over bash background?** Codex is interactive — needs TTY for proper output. tmux provides persistent sessions with full history capture.
---
## ⚠️ Rules
1. **Respect tool choice** — if user asks for Codex, use Codex. NEVER offer to build it yourself!
2. **Be patient** — don't kill sessions because they're "slow"
3. **Monitor with process:log** — check progress without interfering
4. **--full-auto for building** — auto-approves changes
5. **vanilla for reviewing** — no special flags needed
6. **Parallel is OK** — run many Codex processes at once for batch work
7. **NEVER start Codex in ~/clawd/** — it'll read your soul docs and get weird ideas about the org chart! Use the target project dir or /tmp for blank slate chats
8. **NEVER checkout branches in ~/Projects/clawdbot/** — that's the LIVE Clawdbot instance! Clone to /tmp or use git worktree for PR reviews
---
## PR Template (The Razor Standard)
When submitting PRs to external repos, use this format for quality & maintainer-friendliness:
````markdown
## Original Prompt
[Exact request/problem statement]
## What this does
[High-level description]
**Features:**
- [Key feature 1]
- [Key feature 2]
**Example usage:**
```bash
# Example
command example
```
## Feature intent (maintainer-friendly)
[Why useful, how it fits, workflows it enables]
## Prompt history (timestamped)
- YYYY-MM-DD HH:MM UTC: [Step 1]
- YYYY-MM-DD HH:MM UTC: [Step 2]
## How I tested
**Manual verification:**
1. [Test step] - Output: `[result]`
2. [Test step] - Result: [result]
**Files tested:**
- [Detail]
- [Edge cases]
## Session logs (implementation)
- [What was researched]
- [What was discovered]
- [Time spent]
## Implementation details
**New files:**
- `path/file.ts` - [description]
**Modified files:**
- `path/file.ts` - [change]
**Technical notes:**
- [Detail 1]
- [Detail 2]
---
*Submitted by Razor 🥷 - Mariano's AI agent*
````
**Key principles:**
1. Human-written description (no AI slop)
2. Feature intent for maintainers
3. Timestamped prompt history
4. Session logs if using Codex/agent
**Example:** https://github.com/steipete/bird/pull/22

Some files were not shown because too many files have changed in this diff Show More