ShipStatic
Deploy static websites from AI agents. Free at mcp.shipstatic.com — no install, no signup.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"@shipstatic/mcp"
]
}
}
}Runnable packages
2.3.1stdioRemote endpoints
https://mcp.shipstatic.comstreamable-httpWhat it can do
Tool inventory
Tools (15)
🟡deployments_upload(files, labels, password, idempotencyKey, ttl)
Deploy a static site to a live URL: free, no account or API key required. **File content is plain text by default.** Pass HTML/CSS/JS/JSON/SVG/etc. directly in each file's `content` as a regular string. Only set `encoding: "base64"` per-file for binary content (images, fonts) — do not base64-encode text. Returns the live URL. Without a connected account, the response also includes a one-time claim URL, and the site expires in 3 days unless claimed. Pass `password` to make the site private.
Input Schema
{
"type": "object",
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative path within the site (e.g. \"index.html\", \"assets/app.css\"). No leading slash; no parent-folder wrapping."
},
"content": {
"type": "string",
"description": "File content as a plain text string. For HTML, CSS, JS, JSON, SVG, plain text — pass directly with no encoding step. For binary files (images, fonts) ONLY, set this entry's `encoding: \"base64\"` and pass base64-encoded bytes."
},
"encoding": {
"description": "Defaults to `\"utf-8\"` (raw text). Set to `\"base64\"` ONLY for binary files. Never base64-encode text content — pass it as a plain string.",
"type": "string",
"enum": [
"utf-8",
"base64"
]
}
},
"required": [
"path",
"content"
]
},
"description": "Files that make up the site. The site root is implied by these paths."
},
"labels": {
"description": "Labels for organizing deployments (e.g. [\"production\", \"v1.2\"]). Lowercase, 3-25 chars, allows . _ - separators. Up to 10.",
"type": "array",
"items": {
"type": "string"
}
},
"password": {
"description": "Optional password to gate the deployment behind an unlock prompt (6–128 characters; whitespace significant). Visitors must enter this password before viewing the site, including on any custom domains pointing at it.",
"type": "string"
},
"idempotencyKey": {
"description": "Makes this deploy replayable instead of repeatable. A deploy is not naturally idempotent: if a call times out you cannot tell \"it never landed\" from \"it landed and the response was lost\", and retrying creates a second deployment. Send the same key on the retry and the original deployment is replayed instead (within 24 hours). Key the ATTEMPT — a run id, a commit sha, a uuid minted before the first try — never one minted fresh on each retry, which would defeat the point.",
"type": "string"
},
"ttl": {
"description": "Seconds until this deployment expires and the platform reclaims it; omit for one that never does. Only for authenticated deploys — an anonymous deployment already expires on the platform's schedule, and a requested ttl on one is refused. A deployment carrying a ttl cannot be linked to a custom domain: deploy without one if the site needs a domain.",
"type": "number"
}
},
"required": [
"files"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the live deployment."
},
"files": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Number of files in the deployment."
},
"size": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Total deployment size in bytes."
},
"status": {
"type": "string",
"description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
},
"config": {
"type": "boolean",
"description": "True if the deployment includes a ship.json routing config."
},
"password": {
"type": "boolean",
"description": "True if the deployment is password-protected."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the deployment; empty when none."
},
"via": {
"description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
"type": [
"string",
"null"
]
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the deployment was created."
},
"expires": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
},
"screenshot": {
"type": "string",
"format": "uri",
"description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
},
"claim": {
"description": "One-time URL that claims this anonymous deployment to a free account, making it permanent. Only present on anonymous deploys; absent when the deploy was made with a connected account.",
"type": "string",
"format": "uri"
}
},
"required": [
"deployment",
"url",
"files",
"size",
"status",
"config",
"password",
"labels",
"via",
"created",
"expires",
"screenshot"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢deployments_list(limit, cursor)
List all deployments with their URLs, status, labels, and password protection state. The response's `cursor` is null on the last page; pass it back as `cursor` to fetch the next.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum number of items to return in one page. Omit for the server default.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"cursor": {
"description": "Opaque position from the previous response's `cursor` field; omit for the first page.",
"type": "string"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"cursor": {
"description": "Opaque cursor for the next page; null on the last page. The whole has-more signal.",
"type": [
"string",
"null"
]
},
"deployments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the live deployment."
},
"files": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Number of files in the deployment."
},
"size": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Total deployment size in bytes."
},
"status": {
"type": "string",
"description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
},
"config": {
"type": "boolean",
"description": "True if the deployment includes a ship.json routing config."
},
"password": {
"type": "boolean",
"description": "True if the deployment is password-protected."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the deployment; empty when none."
},
"via": {
"description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
"type": [
"string",
"null"
]
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the deployment was created."
},
"expires": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
},
"screenshot": {
"type": "string",
"format": "uri",
"description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
}
},
"required": [
"deployment",
"url",
"files",
"size",
"status",
"config",
"password",
"labels",
"via",
"created",
"expires",
"screenshot"
],
"additionalProperties": false
},
"description": "The deployments on this page."
}
},
"required": [
"cursor",
"deployments"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢deployments_get(deployment)
Get deployment details including URL, status, file count, size, labels, and password protection state.
Input Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname (e.g. \"happy-cat-abc1234.shipstatic.com\"). Returned by deployments_upload or deployments_list."
}
},
"required": [
"deployment"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the live deployment."
},
"files": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Number of files in the deployment."
},
"size": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Total deployment size in bytes."
},
"status": {
"type": "string",
"description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
},
"config": {
"type": "boolean",
"description": "True if the deployment includes a ship.json routing config."
},
"password": {
"type": "boolean",
"description": "True if the deployment is password-protected."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the deployment; empty when none."
},
"via": {
"description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
"type": [
"string",
"null"
]
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the deployment was created."
},
"expires": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
},
"screenshot": {
"type": "string",
"format": "uri",
"description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
}
},
"required": [
"deployment",
"url",
"files",
"size",
"status",
"config",
"password",
"labels",
"via",
"created",
"expires",
"screenshot"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴deployments_set(deployment, labels)
Update deployment labels. Replaces all existing labels.
Input Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname (e.g. \"happy-cat-abc1234.shipstatic.com\"). Use deployments_list to find deployments."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels to set. Replaces all existing labels. Pass empty array to clear."
}
},
"required": [
"deployment",
"labels"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the live deployment."
},
"files": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Number of files in the deployment."
},
"size": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Total deployment size in bytes."
},
"status": {
"type": "string",
"description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
},
"config": {
"type": "boolean",
"description": "True if the deployment includes a ship.json routing config."
},
"password": {
"type": "boolean",
"description": "True if the deployment is password-protected."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the deployment; empty when none."
},
"via": {
"description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
"type": [
"string",
"null"
]
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the deployment was created."
},
"expires": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
},
"screenshot": {
"type": "string",
"format": "uri",
"description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
}
},
"required": [
"deployment",
"url",
"files",
"size",
"status",
"config",
"password",
"labels",
"via",
"created",
"expires",
"screenshot"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴deployments_delete(deployment)
Permanently deletes a deployment and its files.
Input Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "Deployment hostname to delete (e.g. \"happy-cat-abc1234.shipstatic.com\")"
}
},
"required": [
"deployment"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"deployment": {
"type": "string",
"description": "The deployment hostname that was marked for removal."
},
"status": {
"type": "string",
"description": "The state the deployment is in while background cleanup runs. One of: pending, success, failed, deleting."
}
},
"required": [
"deployment",
"status"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴domains_set(domain, deployment, labels)
Create or update a custom domain. Can reserve a name (omit deployment), link it to a deployment, switch deployments, or update labels. domains_records then returns the DNS records to configure.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name (e.g. \"www.example.com\" or \"blog.example.com\")"
},
"deployment": {
"description": "Deployment to serve on this domain (e.g. \"happy-cat-abc1234.shipstatic.com\"). Omit to reserve the domain without linking.",
"type": "string"
},
"labels": {
"description": "Labels for organizing domains (e.g. [\"production\"]).",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain name, e.g. \"www.example.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the domain."
},
"status": {
"type": "string",
"description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
},
"deployment": {
"description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
"type": [
"string",
"null"
]
},
"linked": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
},
"links": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many times a deployment has been linked to this domain."
},
"verification": {
"type": "string",
"description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
},
"verified": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
},
"verifications": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many DNS verification attempts this domain has had."
},
"paused": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the domain; empty when none."
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the domain was created."
},
"isCreate": {
"type": "boolean",
"description": "True when this call created the domain; false when it updated an existing one."
}
},
"required": [
"domain",
"url",
"status",
"deployment",
"linked",
"links",
"verification",
"verified",
"verifications",
"paused",
"labels",
"created",
"isCreate"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_list(limit, cursor)
List all domains with their URLs, linked deployment, and `status`. The response's `cursor` is null on the last page; pass it back as `cursor` to fetch the next.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum number of items to return in one page. Omit for the server default.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"cursor": {
"description": "Opaque position from the previous response's `cursor` field; omit for the first page.",
"type": "string"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"cursor": {
"description": "Opaque cursor for the next page; null on the last page. The whole has-more signal.",
"type": [
"string",
"null"
]
},
"domains": {
"type": "array",
"items": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain name, e.g. \"www.example.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the domain."
},
"status": {
"type": "string",
"description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
},
"deployment": {
"description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
"type": [
"string",
"null"
]
},
"linked": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
},
"links": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many times a deployment has been linked to this domain."
},
"verification": {
"type": "string",
"description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
},
"verified": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
},
"verifications": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many DNS verification attempts this domain has had."
},
"paused": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the domain; empty when none."
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the domain was created."
}
},
"required": [
"domain",
"url",
"status",
"deployment",
"linked",
"links",
"verification",
"verified",
"verifications",
"paused",
"labels",
"created"
],
"additionalProperties": false
},
"description": "The domains on this page."
}
},
"required": [
"cursor",
"domains"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_get(domain)
Get domain details including URL, linked deployment, labels, and `status`: the one word saying what the domain needs from its owner (`unverified`, `unlinked`, `live`, `paused`).
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name (e.g. \"www.example.com\"). Use domains_list to find names."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain name, e.g. \"www.example.com\"."
},
"url": {
"type": "string",
"format": "uri",
"description": "Full URL to the domain."
},
"status": {
"type": "string",
"description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
},
"deployment": {
"description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
"type": [
"string",
"null"
]
},
"linked": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
},
"links": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many times a deployment has been linked to this domain."
},
"verification": {
"type": "string",
"description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
},
"verified": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
},
"verifications": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "How many DNS verification attempts this domain has had."
},
"paused": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels attached to the domain; empty when none."
},
"created": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp (seconds) when the domain was created."
}
},
"required": [
"domain",
"url",
"status",
"deployment",
"linked",
"links",
"verification",
"verified",
"verifications",
"paused",
"labels",
"created"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_records(domain)
Returns the DNS records to configure at the domain's DNS provider. Call after domains_set.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name. Must be a domain previously created with domains_set."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain the records are for."
},
"apex": {
"type": "string",
"description": "The apex (registered) domain where DNS records are managed."
},
"records": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"A",
"CNAME"
],
"description": "Record type: A for the apex redirect, CNAME for the hosted subdomain."
},
"name": {
"type": "string",
"description": "The DNS name to configure."
},
"value": {
"type": "string",
"description": "The value to set: an IP for A, a hostname for CNAME."
}
},
"required": [
"type",
"name",
"value"
],
"additionalProperties": false
},
"description": "The records to configure at the DNS provider, in the order to add them."
}
},
"required": [
"domain",
"apex",
"records"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_dns(domain)
Returns the DNS provider recorded for the domain, if known (e.g. Cloudflare, Namecheap): where its DNS records are configured.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name (e.g. \"www.example.com\"). Must be a domain previously created with domains_set."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain name."
},
"dns": {
"anyOf": [
{
"type": "object",
"properties": {
"provider": {
"description": "The provider serving this domain's DNS; absent when unidentified.",
"type": "object",
"properties": {
"name": {
"description": "Provider name, e.g. \"Cloudflare\"; null if unknown.",
"type": [
"string",
"null"
]
},
"url": {
"description": "The provider's DNS dashboard, where the records get added; null or absent when unknown.",
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "What the platform recorded about the domain's DNS provider when the domain was created; null if nothing was recorded."
}
},
"required": [
"domain",
"dns"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_share(domain)
Returns a shareable DNS setup URL that needs no API key, for whoever manages the domain's DNS.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name to generate a share link for. Must be a domain previously created with domains_set."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain the setup link is for."
},
"url": {
"type": "string",
"format": "uri",
"description": "The shareable DNS setup URL; whoever opens it sees the records to configure, with no API key."
}
},
"required": [
"domain",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_validate(domain)
Check if a domain name is valid and available before creating it. Returns the normalized form and availability.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name to check (e.g. \"www.example.com\"). Call before domains_set to check availability."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"valid": {
"type": "boolean",
"description": "Whether the domain's shape is usable."
},
"normalized": {
"description": "The normalized domain name; null when invalid.",
"type": [
"string",
"null"
]
},
"available": {
"description": "Whether nobody has registered the name yet; null when invalid. Creating it would be new; re-pointing your own domain is a write, not a create.",
"type": [
"boolean",
"null"
]
},
"reason": {
"description": "Why the name is unusable, for display; null when it is usable.",
"type": [
"string",
"null"
]
}
},
"required": [
"valid",
"normalized",
"available",
"reason"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢domains_verify(domain)
Trigger DNS verification for a custom domain. Call after the user has configured DNS records from domains_records. Verification is asynchronous — read the domain again with domains_get to learn the verdict, since its `status` has not moved yet when this returns. A verified domain serves nothing until a deployment is linked with domains_set.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name to verify DNS for. Must be a domain previously created with domains_set."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain whose DNS verification was queued, normalized. The check runs asynchronously; the domain's `verification` and `status` update once DNS propagates, so read the domain again rather than trusting this acknowledgement for a verdict."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🔴domains_delete(domain)
Permanently deletes a domain.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Domain name to delete (e.g. \"www.example.com\")"
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain name that was removed, normalized."
}
},
"required": [
"domain"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢whoami
Returns the account's email, name, plan, current usage and plan caps.
Input Schema
{
"type": "object",
"properties": {}
}Output Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "The account email address."
},
"name": {
"description": "Display name; null if not set.",
"type": [
"string",
"null"
]
},
"plan": {
"type": "string",
"description": "The plan the account is on. One of: free, pro, team, scale, sponsored."
},
"usage": {
"type": "object",
"properties": {
"deployments": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Deployments, every row whatever its status."
},
"platformDomains": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Names chosen under the platform's own suffix, e.g. \"my-app.shipstatic.com\"."
},
"customDomains": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Hostnames the customer owns, paused ones included."
},
"seats": {
"description": "People with a seat: the owner and every member. Absent on responses that predate seats, which then mean one seat.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"deployments",
"platformDomains",
"customDomains"
],
"additionalProperties": false,
"description": "What the account currently holds."
},
"caps": {
"type": "object",
"properties": {
"deployments": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Deployments, every row whatever its status."
},
"platformDomains": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Names chosen under the platform's own suffix, e.g. \"my-app.shipstatic.com\"."
},
"customDomains": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Hostnames the customer owns, paused ones included."
},
"seats": {
"description": "People with a seat: the owner and every member. Absent on responses that predate seats, which then mean one seat.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"deployments",
"platformDomains",
"customDomains"
],
"additionalProperties": false,
"description": "What the account is allowed to hold: the same keys as usage, so the pair divides."
}
},
"required": [
"email",
"name",
"plan",
"usage",
"caps"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Community
Evidence