通过 OAuth 网关管理 Vercel 的项目、部署、域名、团队与环境变量。
文档
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 以编程方式访问 ClickFunnels 2.0 的联系人、商品、订单、课程、表单和 Webhook。
通过托管 OAuth,在 WordPress.com REST v1.1 API 上读写文章、页面、站点和内容。
通过托管 OAuth 代理调用 Slack API,实现发消息、管频道、列用户和定时投递。
通过 Maton 网关访问 Dropbox 文件、文件夹与元数据,OAuth 由网关托管。
通过托管 OAuth 接入 Microsoft Graph API,访问 SharePoint 站点、列表、文档库和文件。