Vercel

vercel

by byungkyu

|

4.0kDevOps未扫描2026年4月6日

安装

claude skill add --url https://github.com/openclaw/skills

文档

Vercel

Access the Vercel API with managed OAuth authentication. Manage projects, deployments, domains, teams, and environment variables.

Quick Start

bash
# List projects
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/vercel/v9/projects?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

Base URL

code
https://gateway.maton.ai/vercel/{native-api-path}

Replace {native-api-path} with the actual Vercel API endpoint path (e.g., v9/projects, v6/deployments). The gateway proxies requests to api.vercel.com and automatically injects your OAuth token.

Authentication

All requests require the Maton API key in the Authorization header:

code
Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

bash
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 Vercel OAuth connections at https://ctrl.maton.ai.

List Connections

bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=vercel&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

bash
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'vercel'}).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": "cf5e9c78-dff3-495f-a1d4-e0c6eeeafa9a",
    "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=...",
    "app": "vercel",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

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 Vercel connections, specify which one to use with the Maton-Connection header:

bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/vercel/v9/projects')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'cf5e9c78-dff3-495f-a1d4-e0c6eeeafa9a')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

API Reference

User

Get Current User

bash
GET /vercel/v2/user

Response:

json
{
  "user": {
    "id": "srL5ucia16R88imgFgrn9XHH",
    "email": "user@example.com",
    "username": "username",
    "name": "User Name",
    "avatar": null,
    "defaultTeamId": "team_abc123",
    "billing": {
      "plan": "hobby",
      "status": "active"
    }
  }
}

Teams

List Teams

bash
GET /vercel/v2/teams

Response:

json
{
  "teams": [
    {
      "id": "team_1xPDNnVvmKxzxPs2x2XQRoKu",
      "slug": "my-team",
      "name": "My Team",
      "createdAt": 1732138693523,
      "membership": {
        "role": "OWNER"
      },
      "billing": {
        "plan": "hobby",
        "status": "active"
      }
    }
  ],
  "pagination": {
    "count": 1,
    "next": null,
    "prev": null
  }
}

Projects

List Projects

bash
GET /vercel/v9/projects?limit=20

Response:

json
{
  "projects": [
    {
      "id": "prj_ET9o8o6WAQTfWbtF8NeFe4XF9uYG",
      "name": "my-project",
      "accountId": "team_abc123",
      "framework": "nextjs",
      "nodeVersion": "22.x",
      "createdAt": 1733304037737,
      "updatedAt": 1766947708146,
      "targets": {},
      "latestDeployments": []
    }
  ],
  "pagination": {
    "count": 20,
    "next": 1733304037737,
    "prev": null
  }
}

Get Project

bash
GET /vercel/v9/projects/{projectId}

Response:

json
{
  "id": "prj_ET9o8o6WAQTfWbtF8NeFe4XF9uYG",
  "name": "my-project",
  "accountId": "team_abc123",
  "framework": "nextjs",
  "nodeVersion": "22.x",
  "createdAt": 1733304037737,
  "updatedAt": 1766947708146,
  "buildCommand": null,
  "devCommand": null,
  "installCommand": null,
  "outputDirectory": null,
  "rootDirectory": null,
  "serverlessFunctionRegion": "iad1"
}

Create Project

bash
POST /vercel/v9/projects
Content-Type: application/json

{
  "name": "my-new-project",
  "framework": "nextjs",
  "gitRepository": {
    "type": "github",
    "repo": "username/repo"
  }
}

Update Project

bash
PATCH /vercel/v9/projects/{projectId}
Content-Type: application/json

{
  "name": "updated-project-name",
  "buildCommand": "npm run build"
}

Delete Project

bash
DELETE /vercel/v9/projects/{projectId}

Deployments

List Deployments

bash
GET /vercel/v6/deployments?limit=20

Query Parameters:

  • limit - Number of results (default: 20)
  • projectId - Filter by project ID
  • target - Filter by target (production, preview)
  • state - Filter by state (BUILDING, READY, ERROR, CANCELED)

Response:

json
{
  "deployments": [
    {
      "uid": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
      "name": "my-project",
      "url": "my-project-abc123.vercel.app",
      "created": 1759739951209,
      "state": "READY",
      "readyState": "READY",
      "target": "production",
      "source": "git",
      "creator": {
        "uid": "srL5ucia16R88imgFgrn9XHH",
        "username": "username"
      },
      "meta": {
        "githubCommitRef": "main",
        "githubCommitSha": "6e88c2d..."
      }
    }
  ],
  "pagination": {
    "count": 20,
    "next": 1759739951209,
    "prev": null
  }
}

Get Deployment

bash
GET /vercel/v13/deployments/{deploymentId}

Response:

json
{
  "id": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
  "name": "my-project",
  "url": "my-project-abc123.vercel.app",
  "created": 1759739951209,
  "buildingAt": 1759739952144,
  "ready": 1759740085170,
  "state": "READY",
  "readyState": "READY",
  "target": "production",
  "source": "git",
  "creator": {
    "uid": "srL5ucia16R88imgFgrn9XHH",
    "username": "username"
  }
}

Get Deployment Build Logs

bash
GET /vercel/v3/deployments/{deploymentId}/events

Response:

json
[
  {
    "created": 1759739951860,
    "deploymentId": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
    "text": "Running build in Washington, D.C., USA (East) – iad1",
    "type": "stdout",
    "info": {
      "type": "build",
      "name": "bld_b3go7zd2k"
    }
  }
]

Cancel Deployment

bash
PATCH /vercel/v12/deployments/{deploymentId}/cancel

Environment Variables

List Environment Variables

bash
GET /vercel/v10/projects/{projectId}/env

Response:

json
{
  "envs": [
    {
      "id": "6EwQRCd32PVNHORP",
      "key": "API_KEY",
      "value": "...",
      "type": "encrypted",
      "target": ["production", "preview", "development"],
      "createdAt": 1732148489672,
      "updatedAt": 1745542152381
    }
  ]
}

Create Environment Variable

bash
POST /vercel/v10/projects/{projectId}/env
Content-Type: application/json

{
  "key": "MY_ENV_VAR",
  "value": "my-value",
  "type": "encrypted",
  "target": ["production", "preview"]
}

Update Environment Variable

bash
PATCH /vercel/v10/projects/{projectId}/env/{envId}
Content-Type: application/json

{
  "value": "updated-value"
}

Delete Environment Variable

bash
DELETE /vercel/v10/projects/{projectId}/env/{envId}

Domains

List Domains

bash
GET /vercel/v5/domains

Response:

json
{
  "domains": [
    {
      "name": "example.com",
      "apexName": "example.com",
      "projectId": "prj_abc123",
      "verified": true,
      "createdAt": 1732138693523
    }
  ],
  "pagination": {
    "count": 10,
    "next": null,
    "prev": null
  }
}

Get Domain

bash
GET /vercel/v5/domains/{domain}

Add Domain

bash
POST /vercel/v5/domains
Content-Type: application/json

{
  "name": "example.com"
}

Remove Domain

bash
DELETE /vercel/v6/domains/{domain}

Artifacts (Remote Caching)

Get Artifacts Status

bash
GET /vercel/v8/artifacts/status

Response:

json
{
  "status": "enabled"
}

Pagination

Vercel uses cursor-based pagination with next and prev cursors:

bash
GET /vercel/v9/projects?limit=20&until=1733304037737

Parameters:

  • limit - Results per page (varies by endpoint, typically max 100)
  • until - Cursor for next page (use next from response)
  • since - Cursor for previous page (use prev from response)

Response includes:

json
{
  "pagination": {
    "count": 20,
    "next": 1733304037737,
    "prev": 1759739951209
  }
}

Code Examples

JavaScript

javascript
const response = await fetch(
  'https://gateway.maton.ai/vercel/v9/projects?limit=10',
  {
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`
    }
  }
);
const data = await response.json();

Python

python
import os
import requests

response = requests.get(
    'https://gateway.maton.ai/vercel/v9/projects',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
    params={'limit': 10}
)
data = response.json()

List Deployments for a Project

python
import os
import requests

project_id = 'prj_abc123'
response = requests.get(
    'https://gateway.maton.ai/vercel/v6/deployments',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
    params={'projectId': project_id, 'limit': 10}
)
deployments = response.json()['deployments']

Notes

  • API versions vary by endpoint (v2, v5, v6, v9, v10, v13, etc.)
  • Timestamps are in milliseconds since Unix epoch
  • Project IDs start with prj_, deployment IDs start with dpl_, team IDs start with team_
  • Deployment states: BUILDING, READY, ERROR, CANCELED, QUEUED
  • Environment variable types: plain, encrypted, secret, sensitive
  • Environment targets: production, preview, development
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq, environment variables may not expand correctly in some shells

Error Handling

StatusMeaning
400Missing Vercel connection or invalid request
401Invalid or missing Maton API key
403Insufficient permissions
404Resource not found
429Rate limited
4xx/5xxPassthrough error from Vercel API

Resources

相关 Skills

环境密钥管理

by alirezarezvani

Universal
热门

统一梳理dev/staging/prod的.env和密钥流程,自动生成.env.example、校验必填变量、扫描Git历史泄漏,并联动Vault、AWS SSM、1Password、Doppler完成轮换。

统一管理环境变量、密钥与配置,减少泄露和部署混乱,安全治理与团队协作一起做好,DevOps 场景很省心。

DevOps
未扫描10.2k

可观测性设计

by alirezarezvani

Universal
热门

面向生产系统规划可落地的可观测性体系,串起指标、日志、链路追踪与 SLI/SLO、错误预算、告警和仪表盘设计,适合搭建监控平台与优化故障响应。

把监控、日志、链路追踪串起来,帮助团队从设计阶段构建可观测性,排障更快、系统演进更稳。

DevOps
未扫描10.2k

AWS架构师

by alirezarezvani

Universal
热门

面向初创团队规划 AWS 架构,覆盖 Serverless、ECS、Aurora 等方案,可生成 CloudFormation 模板,兼顾成本优化、CI/CD 搭建与迁移上云。

特别适合创业团队,用无服务器模式和 IaC 模板快速搭好 AWS 架构,连成本优化、CI/CD 与迁移路径都能一并规划。

DevOps
未扫描10.2k

相关 MCP 服务

kubefwd

编辑精选

by txn2

热门

kubefwd 是让 AI 帮你批量转发 Kubernetes 服务到本地的开发神器。

微服务开发者最头疼的本地调试问题,它一键搞定——自动分配 IP 避免端口冲突,还能用自然语言查询状态。但依赖 AI 工作流,纯命令行爱好者可能觉得不够直接。

DevOps
4.1k

Cloudflare

编辑精选

by Cloudflare

热门

Cloudflare MCP Server 是让你用自然语言管理 Workers、KV 和 R2 等云资源的工具。

这个工具解决了开发者频繁切换控制台和文档的痛点,特别适合那些在 Cloudflare 上部署无服务器应用、需要快速调试或管理配置的团队。不过,由于它依赖多个子服务器,初次设置可能有点繁琐,建议先从 Workers Bindings 这类核心功能入手。

DevOps
3.6k

Terraform

编辑精选

by hashicorp

Terraform MCP Server 是让 AI 助手直接操作 Terraform Registry 和 HCP Terraform 的桥梁。

如果你经常在 Terraform 里翻文档找模块配置,这个服务器能省不少时间——直接问 Claude 就能生成准确的代码片段。最适合管理多云基础设施的团队,但注意它目前只适合本地使用,别在生产环境里暴露 HTTP 端点。

DevOps
1.3k

评论