文档

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

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. 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:
    1. Retrieve and display the target resource (site name/ID, deploy ID, DNS zone, env var key) so the user can verify.
    2. Clearly describe the intended effect (e.g., "This will delete site 'my-production-app' (site_id: abc123) and all its deploys").
    3. 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 -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments

Error Handling

StatusMeaning
400Missing Netlify connection
401Invalid or missing Maton API key
404Resource not found
429Rate limited
4xx/5xxPassthrough error from Netlify API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. 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

  1. 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 网关管理 Vercel 的项目、部署、域名、团队与环境变量。

24 次安装

通过托管 OAuth 以编程方式访问 ClickFunnels 2.0 的联系人、商品、订单、课程、表单和 Webhook。

147 次安装3 星标

通过托管 OAuth,在 WordPress.com REST v1.1 API 上读写文章、页面、站点和内容。

158 次安装8 星标

通过托管 OAuth 代理调用 Slack API,实现发消息、管频道、列用户和定时投递。

249 次安装7 星标

通过 Maton 网关访问 Dropbox 文件、文件夹与元数据,OAuth 由网关托管。

170 次安装5 星标

通过托管 OAuth 接入 Microsoft Graph API,访问 SharePoint 站点、列表、文档库和文件。

32 次安装3 星标