通过托管 OAuth 以编程方式访问 ClickFunnels 2.0 的联系人、商品、订单、课程、表单和 Webhook。
文档
Netlify
试用通过 OAuth 网关读写 Netlify 的站点、部署、构建、DNS 与环境变量。
它能做什么
将 Netlify API 请求代理到一个托管 OAuth 网关,覆盖站点、部署、构建、DNS 区域与记录、环境变量、构建钩子、Webhook、表单、函数和服务等资源。读取类调用(列表、详情)开箱即用,可用于查看站点信息、部署状态和构建日志。任何写入操作(创建站点、触发构建、修改 DNS、变更环境变量)都必须先展示目标资源标识,再等待用户明确确认;删除站点、DNS 区域等高影响操作还需说明后果并取得批准。设计上优先选择可逆动作,例如用部署锁定代替删除,用恢复部署代替重新部署。
什么时候用它
- 查看 Netlify 站点、部署与构建状态
- 审查已绑定域名的 DNS 区域与记录
- 检查 production、dev 等不同上下文下的环境变量
- 回滚或锁定某个部署
技能文档
Netlify
Access the Netlify API with managed OAuth authentication. View sites, deploys, builds, DNS zones, environment variables, and webhooks. Administrative write operations require explicit approval.
Quick Start
# List all sites
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/netlify/api/v1/sites')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/netlify/{native-api-path}
The gateway proxies requests to api.netlify.com and automatically injects your OAuth token. Only the endpoints documented in this skill are supported — always use specific endpoint paths from the API Reference section below rather than constructing arbitrary paths.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Netlify OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=netlify&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
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'netlify'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-12T11:15:33.183756Z",
"last_updated_time": "2026-02-12T11:15:51.556556Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "netlify",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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 Netlify connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/netlify/api/v1/sites')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to sites, deploys, forms, submissions, and DNS within the connected Netlify account. Only install if you need Netlify administration. Prefer least-privilege OAuth access where available and review scopes before authorizing.
- Default to read-only operations. Always start by listing or retrieving resources to confirm account, site, and resource identifiers before proposing any changes.
- All write operations require explicit user approval with specific identifiers. Before executing any create, update, or delete call:
- Retrieve and display the target resource (site name/ID, deploy ID, DNS zone, env var key) so the user can verify.
- Clearly describe the intended effect (e.g., "This will delete site 'my-production-app' (site_id: abc123) and all its deploys").
- Wait for explicit user confirmation before proceeding.
- High-impact operations require extra caution. Deleting sites, modifying DNS zones/records, changing environment variables, and triggering production builds can affect live websites. These actions must include a summary of consequences and require confirmation.
- Prefer reversible actions. Use deploy locking over deletion, and rollback (restore deploy) over redeploying. Always confirm destructive operations like site deletion or DNS zone removal.
API Reference
User & Accounts
Get Current User
GET /netlify/api/v1/user
List Accounts
GET /netlify/api/v1/accounts
Get Account
GET /netlify/api/v1/accounts/{account_id}
Sites
List Sites
GET /netlify/api/v1/sites
With filtering:
GET /netlify/api/v1/sites?filter=all&page=1&per_page=100
Get Site
GET /netlify/api/v1/sites/{site_id}
Create Site
POST /netlify/api/v1/{account_slug}/sites
Content-Type: application/json
{
"name": "my-new-site"
}
Update Site
PUT /netlify/api/v1/sites/{site_id}
Content-Type: application/json
{
"name": "updated-site-name"
}
Delete Site
DELETE /netlify/api/v1/sites/{site_id}
Deploys
List Deploys
GET /netlify/api/v1/sites/{site_id}/deploys
Get Deploy
GET /netlify/api/v1/deploys/{deploy_id}
Create Deploy
POST /netlify/api/v1/sites/{site_id}/deploys
Content-Type: application/json
{
"title": "Deploy from API"
}
Lock Deploy
POST /netlify/api/v1/deploys/{deploy_id}/lock
Unlock Deploy
POST /netlify/api/v1/deploys/{deploy_id}/unlock
Restore Deploy (Rollback)
PUT /netlify/api/v1/deploys/{deploy_id}
Builds
List Builds
GET /netlify/api/v1/sites/{site_id}/builds
Get Build
GET /netlify/api/v1/builds/{build_id}
Trigger Build
POST /netlify/api/v1/sites/{site_id}/builds
Environment Variables
Environment variables are managed at the account level with optional site scope.
List Environment Variables
GET /netlify/api/v1/accounts/{account_id}/env?site_id={site_id}
Create Environment Variables
POST /netlify/api/v1/accounts/{account_id}/env?site_id={site_id}
Content-Type: application/json
[
{
"key": "MY_VAR",
"values": [
{"value": "my_value", "context": "all"}
]
}
]
Context values: all, production, deploy-preview, branch-deploy, dev
Update Environment Variable
PUT /netlify/api/v1/accounts/{account_id}/env/{key}?site_id={site_id}
Content-Type: application/json
{
"key": "MY_VAR",
"values": [
{"value": "updated_value", "context": "all"}
]
}
Delete Environment Variable
DELETE /netlify/api/v1/accounts/{account_id}/env/{key}?site_id={site_id}
DNS Zones
List DNS Zones
GET /netlify/api/v1/dns_zones
Create DNS Zone
POST /netlify/api/v1/dns_zones
Content-Type: application/json
{
"name": "example.com",
"account_slug": "my-account"
}
Get DNS Zone
GET /netlify/api/v1/dns_zones/{zone_id}
Delete DNS Zone
DELETE /netlify/api/v1/dns_zones/{zone_id}
DNS Records
List DNS Records
GET /netlify/api/v1/dns_zones/{zone_id}/dns_records
Create DNS Record
POST /netlify/api/v1/dns_zones/{zone_id}/dns_records
Content-Type: application/json
{
"type": "A",
"hostname": "www",
"value": "192.0.2.1",
"ttl": 3600
}
Delete DNS Record
DELETE /netlify/api/v1/dns_zones/{zone_id}/dns_records/{record_id}
Build Hooks
List Build Hooks
GET /netlify/api/v1/sites/{site_id}/build_hooks
Create Build Hook
POST /netlify/api/v1/sites/{site_id}/build_hooks
Content-Type: application/json
{
"title": "My Build Hook",
"branch": "main"
}
Response includes a url that can be POSTed to trigger a build.
Delete Build Hook
DELETE /netlify/api/v1/sites/{site_id}/build_hooks/{hook_id}
Webhooks
List Webhooks
GET /netlify/api/v1/hooks?site_id={site_id}
Create Webhook
POST /netlify/api/v1/hooks?site_id={site_id}
Content-Type: application/json
{
"type": "url",
"event": "deploy_created",
"data": {
"url": "https://example.com/webhook"
}
}
Events: deploy_created, deploy_building, deploy_failed, deploy_succeeded, form_submission
Delete Webhook
DELETE /netlify/api/v1/hooks/{hook_id}
Forms
List Forms
GET /netlify/api/v1/sites/{site_id}/forms
List Form Submissions
GET /netlify/api/v1/sites/{site_id}/submissions
Delete Form
DELETE /netlify/api/v1/sites/{site_id}/forms/{form_id}
Functions
List Functions
GET /netlify/api/v1/sites/{site_id}/functions
Services/Add-ons
List Available Services
GET /netlify/api/v1/services
Get Service Details
GET /netlify/api/v1/services/{service_id}
Pagination
Use page and per_page query parameters:
GET /netlify/api/v1/sites?page=1&per_page=100
Default per_page varies by endpoint. Check response headers for pagination info.
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/netlify/api/v1/sites',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const sites = await response.json();
Python
import os
import requests
response = requests.get(
'https://api.maton.ai/netlify/api/v1/sites',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
sites = response.json()
Create Site and Set Environment Variable
import os
import requests
headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
# Create site
site = requests.post(
'https://api.maton.ai/netlify/api/v1/my-account/sites',
headers=headers,
json={'name': 'my-new-site'}
).json()
# Add environment variable
requests.post(
f'https://api.maton.ai/netlify/api/v1/accounts/{site["account_id"]}/env',
headers=headers,
params={'site_id': site['id']},
json=[{'key': 'API_KEY', 'values': [{'value': 'secret', 'context': 'all'}]}]
)
Notes
- Site IDs are UUIDs (e.g.,
d37d1ce4-5444-40f5-a4ca-a2c40a8b6835) - Account slugs are used for creating sites within a team (e.g.,
my-team-slug) - Deploy IDs are returned when creating deploys and can be used to track deploy status
- Build hooks return a URL that can be POSTed to externally trigger builds
- Environment variable contexts control where variables are available:
all,production,deploy-preview,branch-deploy,dev - IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Netlify connection |
| 401 | Invalid or missing Maton API key |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Netlify API |
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
- Ensure your URL path starts with
netlify. For example:
- Correct:
https://api.maton.ai/netlify/api/v1/sites - Incorrect:
https://api.maton.ai/api/v1/sites
Resources
常见问题
- 如何完成鉴权?
- 在 Maton 设置页生成 API key 并导出为 MATON_API_KEY 环境变量,网关会自动注入 Netlify 的 OAuth token,调用时只需在 Authorization 头中携带 Bearer 令牌。
- 能否修改我的 Netlify 账户?
- 可以。但每次写入前都需要先显示目标资源(站点 ID、部署 ID、DNS 区域 ID、变量名),并等待用户确认后才执行。
- 同时接入多个 Netlify 账户怎么办?
- 支持。当存在多个 OAuth 连接时,通过 Maton-Connection 请求头指定本次调用要使用的连接即可。
相关技能
通过托管 OAuth 代理连接 Notion 工作区,支持搜索、数据库查询与读取,写入需用户确认。
通过 OAuth 网关管理 Vercel 的项目、部署、域名、团队与环境变量。
通过托管 OAuth 网关读写 Calendly 排程数据。
通过托管 OAuth 调用 Confluence Cloud API,管理页面、空间、博客、评论与附件。
通过 OAuth 认证网关管理 Stripe 客户、订阅、发票、产品、价格和支付。