HomeBrowseUpload
← Back to registry
// Skill profile

Vercel

name: vercel

by byungkyu · published 2026-04-01

邮件处理开发工具
Total installs
0
Stars
★ 0
Last updated
2026-04
// Install command
$ claw add gh:byungkyu/byungkyu-vercel-api
View on GitHub
// Full documentation

---

name: vercel

description: |

Vercel API integration with managed OAuth. Manage projects, deployments, domains, teams, and environment variables.

Use this skill when users want to interact with Vercel - deploying apps, managing projects, checking deployment status, or configuring domains.

For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).

compatibility: Requires network access and valid Maton API key

metadata:

author: maton

version: "1.0"

clawdbot:

emoji: "▲"

homepage: "https://maton.ai"

requires:

env:

- MATON_API_KEY

---

# Vercel

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

Quick Start

# 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

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:

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](https://maton.ai)

2. Go to [maton.ai/settings](https://maton.ai/settings)

3. Copy your API key

Connection Management

Manage your Vercel OAuth connections at `https://ctrl.maton.ai`.

List Connections

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

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

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:**

{
  "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

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:

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

GET /vercel/v2/user

**Response:**

{
  "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

GET /vercel/v2/teams

**Response:**

{
  "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

GET /vercel/v9/projects?limit=20

**Response:**

{
  "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

GET /vercel/v9/projects/{projectId}

**Response:**

{
  "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

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

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

#### Update Project

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

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

#### Delete Project

DELETE /vercel/v9/projects/{projectId}

Deployments

#### List Deployments

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:**

    {
      "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

    GET /vercel/v13/deployments/{deploymentId}

    **Response:**

    {
      "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

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

    **Response:**

    [
      {
        "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

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

    Environment Variables

    #### List Environment Variables

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

    **Response:**

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

    #### Create Environment Variable

    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

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

    #### Delete Environment Variable

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

    Domains

    #### List Domains

    GET /vercel/v5/domains

    **Response:**

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

    #### Get Domain

    GET /vercel/v5/domains/{domain}

    #### Add Domain

    POST /vercel/v5/domains
    Content-Type: application/json
    
    {
      "name": "example.com"
    }

    #### Remove Domain

    DELETE /vercel/v6/domains/{domain}

    Artifacts (Remote Caching)

    #### Get Artifacts Status

    GET /vercel/v8/artifacts/status

    **Response:**

    {
      "status": "enabled"
    }

    Pagination

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

    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:**

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

    Code Examples

    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

    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

    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

    | Status | Meaning |

    |--------|---------|

    | 400 | Missing Vercel connection or invalid request |

    | 401 | Invalid or missing Maton API key |

    | 403 | Insufficient permissions |

    | 404 | Resource not found |

    | 429 | Rate limited |

    | 4xx/5xx | Passthrough error from Vercel API |

    Resources

  • [Vercel REST API Documentation](https://vercel.com/docs/rest-api)
  • [Vercel API Reference](https://vercel.com/docs/rest-api/endpoints)
  • [Maton Community](https://discord.com/invite/dBfFAcefs2)
  • [Maton Support](mailto:support@maton.ai)
  • // Comments
    Sign in with GitHub to leave a comment.
    // Related skills

    More tools from the same signal band