Skip to content

Documentation

Four calls from nothing to a registered domain.

This page is the whole surface at a glance. The generated schema is at openapi.json, the version written for a model to read at inference time is at /.well-known/llms.txt, and the same nouns are exposed as MCP tools.

Quickstart

# 1 — get a token. no auth required for this call.
$ curl -sX POST https://api.slipdock.ai/v1/workspaces \
       -H 'content-type: application/json' \
       -d '{"owner_email":"you@example.com","label":"my agent"}'
  {"workspace_id":"ws_7f3a","token":"sk_live_...","plan":"free"}

$ export AUTH="authorization: Bearer sk_live_..."

# 2 — everything free needs no further ceremony.
$ curl -s "https://api.slipdock.ai/v1/domains/search?q=example&tlds=com,dev"
$ curl -s https://api.slipdock.ai/v1/repos -H "$AUTH" -d '{"name":"my-app"}'

# 3 — anything that costs money returns 402 and a next_action.
$ curl -s https://api.slipdock.ai/v1/domains/register -H "$AUTH" \
       -H 'idempotency-key: reg-example-com-1' \
       -d '{"domain":"example.com","years":1}'
  {"error":"payment_required",
   "next_action":{"type":"await_payment",
                  "poll":"/v1/orders/o_1f2e",
                  "pay_link_sent_to":"y***@example.com"}}

# 4 — poll every 2-5s. do not poll faster.
$ curl -s https://api.slipdock.ai/v1/orders/o_1f2e -H "$AUTH"
  {"state":"complete","resources":[{"kind":"domain","name":"example.com"}]}

Authentication

One credential for everything. Authorization: Bearer sk_live_… on the REST API, and the same token as the git password (with the workspace id as the username) when you push. There is no second set of credentials to manage, and no OAuth dance, because there is no browser in this flow.

The token is scoped to one workspace. Tokens are shown once, at creation. If you lose it, the workspace owner can be emailed — you cannot recover it yourself, which is the point.

Endpoints

workspace + auth

MethodPathWhat it does
POST/v1/workspacesCreate a workspace and return a scoped token. No auth.
GET/v1/workspaces/meWho am I, plan, wallet, limits.
GET/v1/eventsAudit timeline the agent can read.

domains

MethodPathWhat it does
GET/v1/domains/search?q=&tlds=Availability and a firm price per TLD.
POST/v1/domains/registerCreate an order. Costs money — returns 402 or completes from the wallet.
GET/v1/domainsWhat this workspace owns.
GET/v1/domains/{domain}One domain, with expiry and renewal state.

dns — free

MethodPathWhat it does
GET/v1/dns/{zone}/recordsRead the zone.
POST/v1/dns/{zone}/recordsCreate a record.
DELETE/v1/dns/{zone}/recordsDelete a record.
POST/v1/dns/{zone}/point-at-appWire a zone at an app in one call.

code + hosting

MethodPathWhat it does
POST/v1/reposClaim a free private git repository.
GET/v1/reposRepos and their latest commit.
POST/v1/appsBuild and deploy from a repo.
GET/v1/appsDeployed apps and their URLs.
POST/v1/staticPublish a static site.

money

MethodPathWhat it does
GET/v1/walletBalance, cap, ledger, runway.
POST/v1/wallet/topupAsk the human for credit. Emails a link.
GET/v1/orders/{id}Poll an order.
GET/v1/planQuota usage and limits.
GET/v1/subscriptionsRecurring services and runway_days.
DELETE/v1/subscriptions/{id}Cancel a recurring service.

The error contract

Every non-2xx response has the same shape, and the important part is next_action. An agent should branch on it rather than on the status code or on prose.

{
  "error": "payment_required",
  "message": "This order needs the workspace owner to approve payment.",
  "next_action": {
    "type": "await_payment",
    "poll": "/v1/orders/o_123",
    "pay_link_sent_to": "o***@example.com",
    "expires_at": "2026-08-02T18:00:00Z"
  }
}
next_action.typeWhat the agent should do
await_paymentA human has been emailed. Poll the order and tell your user.
await_ownerSomething needs the workspace owner that is not a payment.
retryTransient. Try the same call again after a short delay.
retry_withFixable. The object names the field to change.
search_alternativesThe name is gone. Suggest others; search is free.
create_workspaceNo valid token. Start at POST /v1/workspaces.
upgrade_planA quota is exhausted and the plan throttles rather than bills.
request_topupThe wallet cannot cover this. POST /v1/wallet/topup.
overage_billedOver the allowance; the excess draws from the wallet.
contact_supportWe got it wrong. Do not retry in a loop.
doneNothing further is required.

402 is not a failure. It is the normal first-purchase path. The correct agent behaviour is to tell the user "I have emailed you a link to approve $X" and keep polling.

Idempotency

Send an Idempotency-Key header on any POST. Repeating a register call with the same key returns the same order instead of buying twice. Registration additionally defaults to keying on the domain name, so an accidental retry is safe even if you forget the header — the failure mode of an agent retry loop should not be two domains.

Shipping code without a container image

You do not need Docker, a registry, or a build pipeline. Claim a repo, push source, and Slipdock builds and deploys it. git push is the one transport every coding agent already has.

$ curl -s https://api.slipdock.ai/v1/repos -H "$AUTH" -d '{"name":"my-app"}'
  {"clone_url":"https://git.slipdock.ai/ws_7f3a/my-app.git"}

$ git init -b main && git add -A && git commit -m "initial"
$ git remote add slipdock https://ws_7f3a:$SLIPDOCK_TOKEN@git.slipdock.ai/ws_7f3a/my-app.git
$ git push -u slipdock main
  → buildpack build → deployed → https://my-app.slipdock.app

The repo is private, and it is a plain git remote. Clone it and host it elsewhere whenever you like — any design that makes leaving hard would be a bug, not a moat.

MCP server

The same nouns as tools, for agents that speak the Model Context Protocol: slipdock_setup, search_domains, register_domain, check_order, create_repo, check_plan, list_domains, wallet_status, request_topup.

Manners

Also useful