Hoist

Domain registration, DNS management, and code deployment for AI agents. Register domains and deploy in one command.

Getting Started

Introduction Authentication Quickstart

Auth

POST /auth/signupPOST /auth/loginGET /auth/whoami

Domains

POST /domains/searchPOST /domains/checkoutGET /domains/tldsPOST /domains/registerGET /domainsGET /domains/:domainPOST …/dnsDEL …/dns/:id

Payments

GET /pricingPOST /confirm-paymentGET /payment-status

Deploy

POST /deployGET /deploy/:idGET /deploys

MCP Server

Setup Tools Reference

Tools

TLD Pricing Try It Live

Hoist API Reference

Register domains, manage DNS, deploy code, and go live — all via REST API. Built for AI agents and developers who ship fast.

BASE URL https://hoist-g8do.polsia.app/api

🔑 Authentication

Hoist uses API key authentication. Keys are prefixed with hoist_ and sent as Bearer tokens. Some endpoints (domain search, pricing, checkout) are public — no auth needed. Endpoints that manage your account or domains require authentication.

Authorization Header

Authorization: Bearer hoist_your_api_key_here

Get your API key by signing up or logging in. The key is returned in the response body.

🚀 Quickstart

Get from zero to a registered domain in 3 API calls.

1

Create an account

Sign up to get your API key. You'll use this for all authenticated requests.

curl Copy

curl -X POST https://hoist-g8do.polsia.app/api/auth/signup \-H "Content-Type: application/json" \-d '{"email": "[email protected]", "password": "secure_password_123"}'

Response

{"user": { "id": 1, "email": "[email protected]" },"api_key": "hoist_a1b2c3d4e5f6...","hint": "Use this key in Authorization: Bearer <key>"}

2

Search for a domain

Check if your domain is available. Send just the name to search all TLDs, or include the extension for a specific check.

curl Copy

curl -X POST https://hoist-g8do.polsia.app/api/domains/search \-H "Content-Type: application/json" \-d '{"name": "myproject"}'

Response — Multi-TLD search

{"name": "myproject","results": [ { "domain": "myproject.dev", "available": true, "price_formatted": "$14.99/yr" }, { "domain": "myproject.io", "available": true, "price_formatted": "$39.99/yr" }, { "domain": "myproject.com", "available": false } ] }

3

Register your domain

Register and pay — you'll get a Stripe checkout URL to complete payment.

curl Copy

curl -X POST https://hoist-g8do.polsia.app/api/domains/register \-H "Content-Type: application/json" \-H "Authorization: Bearer hoist_your_api_key" \-d '{"domain": "myproject.dev"}'

Response

{"success": true,"domain": "myproject.dev","payment": {"status": "pending","amount_cents": 1499,"payment_url": "https://buy.stripe.com/...","instructions": "Complete payment at the URL above" } }

👤 Auth

Create accounts and manage API keys. Passwords must be at least 8 characters.

POST /api/auth/signup Public ▾

Create a new account and receive an API key. Email must be unique.

Request Body

FieldTypeRequiredDescription
emailstringrequiredAccount email address
passwordstringrequiredMinimum 8 characters

curl Node.js Python

RequestCopy

curl -X POST https://hoist-g8do.polsia.app/api/auth/signup \-H "Content-Type: application/json" \-d '{"email": "[email protected]", "password": "secure_pass_123"}'

Node.jsCopy

const res = await fetch('https://hoist-g8do.polsia.app/api/auth/signup', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({email: '[email protected]',password: 'secure_pass_123' }) });const { api_key } = await res.json();

PythonCopy

import requests res = requests.post('https://hoist-g8do.polsia.app/api/auth/signup', json={'email': '[email protected]','password': 'secure_pass_123'}) api_key = res.json()['api_key']

Response — 201

{"user": { "id": 1, "email": "[email protected]" },"api_key": "hoist_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6","hint": "Use this key in Authorization: Bearer <key>"}

POST /api/auth/login Public ▾

Login with existing credentials. Returns a new API key on every login.

Request Body

FieldTypeRequiredDescription
emailstringrequiredAccount email
passwordstringrequiredAccount password

RequestCopy

Node.jsCopy

const res = await fetch('https://hoist-g8do.polsia.app/api/auth/login', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ email: '[email protected]', password: 'secure_pass_123' }) });const { api_key } = await res.json();

PythonCopy

import requests res = requests.post('https://hoist-g8do.polsia.app/api/auth/login', json={'email': '[email protected]','password': 'secure_pass_123'}) api_key = res.json()['api_key']

Response — 200

{"user": { "id": 1, "email": "[email protected]" },"api_key": "hoist_new_key_generated_on_login..."}

GET /api/auth/whoami Auth Required ▾

Get your account info, domain/deployment counts, and active API keys.

curlCopy

curl https://hoist-g8do.polsia.app/api/auth/whoami \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{"user": { "id": 1, "email": "[email protected]" },"stats": { "api_keys": 2, "domains": 3, "deployments": 7 },"api_keys": [ { "id": 1, "name": "default", "prefix": "hoist_a1b2...", "created_at": "2026-03-01T..." } ] }

🌐 Domains

Search for domains, register them, manage DNS records. Search and checkout are public — everything else needs auth.

POST /api/domains/search Public ▾

Check domain availability. Send domain for a single TLD check, or name (without extension) to search across all 14 supported TLDs.

Request Body

FieldTypeRequiredDescription
domainstringoption AFull domain with TLD (e.g. "myapp.dev")
namestringoption BName only — searches all TLDs (e.g. "myapp")

Single TLDCopy

curl -X POST https://hoist-g8do.polsia.app/api/domains/search \-H "Content-Type: application/json" \-d '{"domain": "myproject.dev"}'

Node.js — Multi-TLDCopy

const res = await fetch('https://hoist-g8do.polsia.app/api/domains/search', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ name: 'myproject' }) });const { results } = await res.json();const available = results.filter(r => r.available);

Python — Multi-TLDCopy

import requests res = requests.post('https://hoist-g8do.polsia.app/api/domains/search', json={'name': 'myproject'}) available = [r for r in res.json()['results'] if r['available']]

Response — Single TLD

{"available": true,"domain": "myproject.dev","price_cents": 1499,"price_formatted": "$14.99/yr","tld": ".dev"}

POST /api/domains/checkout Public ▾

Guest-friendly checkout. No account needed — auto-creates one. Returns a Stripe checkout URL.

Request Body

FieldTypeRequiredDescription
domainstringrequiredDomain to register (e.g. "myapp.dev")
emailstringrequiredEmail for account creation

curlCopy

curl -X POST https://hoist-g8do.polsia.app/api/domains/checkout \-H "Content-Type: application/json" \-d '{"domain": "myapp.dev", "email": "[email protected]"}'

Response — 200

{"success": true,"checkout_url": "https://buy.stripe.com/...","domain": "myapp.dev","price_cents": 1499,"price_formatted": "$14.99/yr"}

GET /api/domains/tlds Public ▾

List all supported TLDs with pricing. No parameters needed.

curlCopy

curl https://hoist-g8do.polsia.app/api/domains/tlds

Response — 200

{"tlds": [ { "tld": ".site", "price_cents": 299, "price_formatted": "$2.99/yr" }, { "tld": ".com", "price_cents": 1299, "price_formatted": "$12.99/yr" }, { "tld": ".ai", "price_cents": 7999, "price_formatted": "$79.99/yr" } ],"count": 14}

POST /api/domains/register Auth Required ▾

Register a domain. Returns a Stripe payment URL. Domain activates after payment.

Request Body

FieldTypeRequiredDescription
domainstringrequiredDomain to register (e.g. "myapp.dev")

curlCopy

curl -X POST https://hoist-g8do.polsia.app/api/domains/register \-H "Content-Type: application/json" \-H "Authorization: Bearer hoist_your_api_key" \-d '{"domain": "myapp.dev"}'

Response — 200

{"success": true,"domain": "myapp.dev","price_cents": 1499,"payment": {"status": "pending","amount_cents": 1499,"payment_url": "https://buy.stripe.com/...","instructions": "Complete payment at the URL above" } }

GET /api/domains Auth Required ▾

List all your registered domains with DNS record and deployment counts.

curlCopy

curl https://hoist-g8do.polsia.app/api/domains \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{"domains": [ {"domain": "myapp.dev","status": "registered","registered_at": "2026-03-01T12:00:00Z","dns_record_count": 3,"deployment_count": 2 } ],"count": 1}

GET /api/domains/:domain Auth Required ▾

Get domain details including DNS records and recent deployments.

curlCopy

curl https://hoist-g8do.polsia.app/api/domains/myapp.dev \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{"domain": "myapp.dev","status": "registered","dns_records": [ { "type": "A", "name": "@", "value": "1.2.3.4", "ttl": 3600 } ],"deployments": [ { "deploy_id": "dep_abc123", "status": "live", "deploy_url": "https://myapp.dev" } ] }

POST /api/domains/:domain/dns Auth Required ▾

Add a DNS record. Supports A, AAAA, CNAME, MX, TXT, NS, SRV record types.

Request Body

FieldTypeRequiredDescription
typestringrequiredA, AAAA, CNAME, MX, TXT, NS, SRV
namestringrequiredRecord name (@ for root, or subdomain)
valuestringrequiredRecord value (IP, hostname, etc.)
ttlnumberoptionalTTL in seconds (default: 3600)
prioritynumberoptionalPriority for MX/SRV records

curlCopy

curl -X POST https://hoist-g8do.polsia.app/api/domains/myapp.dev/dns \-H "Content-Type: application/json" \-H "Authorization: Bearer hoist_your_api_key" \-d '{"type": "A", "name": "@", "value": "1.2.3.4", "ttl": 3600}'

DELETE /api/domains/:domain/dns/:id Auth Required ▾

Delete a DNS record by ID.

curlCopy

curl -X DELETE https://hoist-g8do.polsia.app/api/domains/myapp.dev/dns/42 \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{ "deleted": true }

💳 Payments

Pricing data, payment confirmation, and status checks. Stripe handles the checkout.

GET /api/pricing Public ▾

Get all TLD pricing with Stripe payment links. Use this to build your own checkout UI.

curlCopy

curl https://hoist-g8do.polsia.app/api/pricing

Response — 200

{"currency": "usd","billing_period": "yearly","tlds": [ {"tld": ".site","price_cents": 299,"price_usd": "2.99","price_formatted": "$2.99/yr","billing_period": "yearly","payment_link": "https://buy.stripe.com/..." } ],"count": 14}

POST /api/domains/confirm-payment Auth Required ▾

Confirm payment and activate a domain. Usually called after Stripe checkout completes, but can also be triggered manually.

Request Body

FieldTypeRequiredDescription
domainstringrequiredDomain to confirm
session_idstringoptionalStripe checkout session ID

curlCopy

curl -X POST https://hoist-g8do.polsia.app/api/domains/confirm-payment \-H "Content-Type: application/json" \-H "Authorization: Bearer hoist_your_api_key" \-d '{"domain": "myapp.dev"}'

GET /api/domains/payment-status/:domain Auth Required ▾

Check the payment status for a specific domain.

curlCopy

curl https://hoist-g8do.polsia.app/api/domains/payment-status/myapp.dev \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{"domain": "myapp.dev","domain_status": "registered","payment_status": "paid","amount_cents": 1499,"paid_at": "2026-03-01T12:30:00Z"}

🚢 Deploy

Deploy code to your registered domains. Point to a GitHub repo and Hoist handles the rest.

POST /api/deploy Auth Required ▾

Create a new deployment. Provide a source URL (GitHub repo) and the target domain.

Request Body

FieldTypeRequiredDescription
domainstringrequiredTarget domain (must be registered)
source_urlstringrequiredGitHub repo URL
source_typestringoptionalDefault: "github"

RequestCopy

curl -X POST https://hoist-g8do.polsia.app/api/deploy \-H "Content-Type: application/json" \-H "Authorization: Bearer hoist_your_api_key" \-d '{"domain": "myapp.dev", "source_url": "https://github.com/user/repo"}'

Node.jsCopy

const res = await fetch('https://hoist-g8do.polsia.app/api/deploy', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': `Bearer ${apiKey}` },body: JSON.stringify({domain: 'myapp.dev',source_url: 'https://github.com/user/repo' }) });const { deployment } = await res.json(); console.log('Deploy ID:', deployment.deploy_id);

PythonCopy

import requests res = requests.post('https://hoist-g8do.polsia.app/api/deploy', headers={'Authorization': f'Bearer {api_key}'}, json={'domain': 'myapp.dev','source_url': 'https://github.com/user/repo' } ) deploy_id = res.json()['deployment']['deploy_id']

Response — 201

{"deployment": {"deploy_id": "dep_a1b2c3d4","domain": "myapp.dev","status": "building","source_type": "github","source_url": "https://github.com/user/repo","started\_at": "2026-03-01T12:00:00Z" } }

GET /api/deploy/:deployId Auth Required ▾

Poll deployment status. Status transitions: buildinglive or failed.

curlCopy

curl https://hoist-g8do.polsia.app/api/deploy/dep\_a1b2c3d4 \-H "Authorization: Bearer hoist_your_api_key"

Response — 200

{"deployment": {"deploy_id": "dep_a1b2c3d4","domain": "myapp.dev","status": "live","deploy_url": "https://myapp.dev","build\_log": "...","started_at": "2026-03-01T12:00:00Z","completed_at": "2026-03-01T12:02:30Z" } }

GET /api/deploys Auth Required ▾

List all your deployments across all domains.

curlCopy

curl https://hoist-g8do.polsia.app/api/deploys \-H "Authorization: Bearer hoist_your_api_key"

💰 TLD Pricing

Live pricing pulled from the API. All prices are annual.

Loading pricing...

⚡ Try It Live

Test domain search against the live API. No auth required.

🔍 Domain Search

📋 TLD List

GET /api/domains/tlds

💲 Pricing

GET /api/pricing

🤖 MCP Server

Connect Hoist to Claude Desktop, Cursor, or any MCP-compatible AI agent. Search domains, register, deploy, and manage DNS — all from your AI assistant.

Quick Install

npmCopy

npx @hoist/mcp-server

Claude Desktop

Add to ~/.claude/claude_desktop_config.json:

JSONCopy

{"mcpServers": {"hoist": {"command": "npx","args": ["@hoist/mcp-server"],"env": {"HOIST_API_KEY": "hoist_your_api_key_here" } } } }

Cursor

Add to .cursor/mcp.json in your project root:

JSONCopy

Or fetch the config directly:

curlCopy

curl https://hoist-g8do.polsia.app/mcp/config.json

No API key? The search_domain and get_pricing tools work without authentication. Register via register_domain with an email for guest checkout — no key needed.

🔧 MCP Tools Reference

Six tools available to AI agents. Each wraps a Hoist REST endpoint.

ToolAuthDescription
search_domainNoCheck availability for one domain or search across all TLDs
register_domainOptionalRegister a domain. Guest checkout with email, or auth with API key
check_statusYesDomain status, DNS records, deployments, payment info
get_pricingNoTLD pricing list, filterable by specific TLD
deployYesDeploy a git repo to a registered domain
manage_dnsYesAdd, delete, or list DNS records (A, AAAA, CNAME, MX, TXT, NS, SRV)

Example: AI agent finds and registers a domain

Agent conversation

// Agent uses search_domain tool User: "Find me a cheap domain for my side project called neptune" Agent calls: search_domain({ query: "neptune" })// → Returns availability across .com, .io, .dev, .xyz, .site, etc. Agent calls: register_domain({ domain: "neptune.site", email: "[email protected]"})// → Returns Stripe checkout URL ($2.99/yr) Agent: "neptune.site is available for $2.99/yr. Here's your checkout link: ..."

📖 Full Workflow: Search → Register → Deploy

End-to-end example in Node.js — from finding a domain to deploying code on it.

Node.js — Full workflowCopy

const BASE = 'https://hoist-g8do.polsia.app/api';// 1. Sign up and get API key const auth = await fetch(`${BASE}/auth/signup`, {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ email: '[email protected]', password: 'supersecure123' }) }).then(r => r.json());const headers = {'Content-Type': 'application/json','Authorization': `Bearer ${auth.api_key}`};// 2. Search for available domains const search = await fetch(`${BASE}/domains/search`, {method: 'POST', headers,body: JSON.stringify({ name: 'coolproject' }) }).then(r => r.json());const available = search.results.filter(r => r.available); console.log('Available:', available.map(r => `${r.domain} (${r.price_formatted})`));// 3. Register the cheapest available domain const pick = available.sort((a, b) => a.price_cents - b.price_cents)[0];const reg = await fetch(`${BASE}/domains/register`, {method: 'POST', headers,body: JSON.stringify({ domain: pick.domain }) }).then(r => r.json()); console.log('Pay here:', reg.payment.payment_url);// → User completes Stripe checkout // 4. Deploy after payment const deploy = await fetch(`${BASE}/deploy`, {method: 'POST', headers,body: JSON.stringify({domain: pick.domain,source_url: 'https://github.com/user/my-app' }) }).then(r => r.json());// 5. Poll until live let status = 'building';while (status === 'building') {await new Promise(r => setTimeout(r, 5000));const check = await fetch(`${BASE}/deploy/${deploy.deployment.deploy_id}`, { headers }) .then(r => r.json()); status = check.deployment.status; } console.log('Live at:', `https://${pick.domain}`);

⚠️ Errors

All errors return JSON with an error field. Some include a hint.

StatusMeaningExample
400Bad request / missing fields{"error": "Email and password required"}
401Missing or invalid API key{"error": "Missing API key", "hint": "Set Authorization: Bearer <key>"}
404Resource not found{"error": "Domain not found"}
409Conflict (duplicate){"error": "Email already registered"}
500Server error{"error": "Internal server error"}

Related Servers