Developers & AI agents

Moveezi, machine-readable.

Everything on this site is readable by a program: an OpenAPI 3.1 spec, a JSON API, an MCP server over Streamable HTTP, and every page as markdown. No key, no signup, no rate limit on reads.

What is published

Four ways in

Pick whichever one your stack already speaks. They are all views of the same content, generated from the live site, so none of them can go stale.

Markdown

Append .md to any path, or send Accept: text/markdown to the page itself. Navigation and footer are stripped, so you pay for content and not chrome. Responses carry Vary: Accept, per acceptmarkdown.com.

Public API

A page index, any page as JSON or markdown, and ranked full-text search. Described by an OpenAPI 3.1 document with a unique operation ID, typed parameters and response schemas on every operation.

MCP server

Model Context Protocol over Streamable HTTP at /mcp. Four tools and a set of resources, no authentication. Manifest at /.well-known/mcp.json, and listed on Smithery.

llms.txt

/llms.txt says what Moveezi is, when an agent should reach for it, which kinds of moving business it fits, and where every machine-readable file lives.

Honest 404s

A path that does not exist returns a real HTTP 404, never a 200 with an app shell. Ask for markdown and the body is a short page telling you where to look instead.

SDK and CLI

Official JavaScript and Python clients, both dependency-free, and a moveezi CLI. pip install moveezi, or npm install DumontAI/moveezi-sdk for the JavaScript one.

A sandbox

The one write on this API creates a CRM record and emails a human. POST /api/v1/lead/validate runs the same rules and creates nothing, so you can check a payload before you send it for real.

Limits and a promise

Reads are 120 a minute, leads 5 an hour, both reported in RateLimit-* headers so you can back off on real numbers. The deprecation policy says what will not change without six months of notice.

Structured data

Every page carries JSON-LD: the organisation, its contact points, the product, and FAQ answers. The sitemap and robots.txt are complete and open to AI crawlers.

Connect an agent

Add the MCP server

Point any MCP client at the endpoint below. It is public and read-only: product knowledge, pricing and documentation, never customer or operational data.

# Claude Code
claude mcp add --transport http moveezi https://www.moveezi.com/mcp

# Any client that reads a config file
{
  "mcpServers": {
    "moveezi": { "type": "http", "url": "https://www.moveezi.com/mcp" }
  }
}

Tools: search_moveezi_site, get_moveezi_page, list_moveezi_pages, get_moveezi_pricing. Resources cover llms.txt, the sitemap, the OpenAPI document and the key product pages as markdown.

Try it

Three requests

# Any page as markdown
curl https://www.moveezi.com/pricing.md
curl -H "Accept: text/markdown" https://www.moveezi.com/pricing

# Search the site
curl "https://www.moveezi.com/api/v1/search?q=video+survey"

# Or use the SDK
pip install moveezi && moveezi search "video survey"
npm install DumontAI/moveezi-sdk

# List the MCP tools
curl -X POST https://www.moveezi.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Reference

Every endpoint

EndpointWhat it returns
GET /api/v1/pagesEvery published page with title, description and markdown URL.

Operation ID listPages.

GET /api/v1/pages/{slug}One page as JSON, or as markdown with Accept: text/markdown.

Operation ID getPage.

GET /api/v1/search?q=Ranked full-text search with a snippet around the first match.

Operation ID searchSite.

POST /api/v1/pages/batchUp to 50 pages in one round trip, so you do not loop getPage.

Operation ID getPagesBatch.

POST /api/v1/lead/validateSandbox. Runs a lead through the same rules and writes nothing.

Operation ID validateLead. Check a payload before you submit it for real.

POST /api/leadSends an enquiry to the Moveezi sales team. 5 per IP per hour.

Operation ID submitLead. Send an Idempotency-Key so a retry does not create a second lead. Only on behalf of a person who asked you to.

POST /mcpMCP over Streamable HTTP. GET returns 405; there is no server-initiated stream.
GET /openapi.jsonThe full API description. Also at /openapi.yaml.
GET /.well-known/mcp.jsonMCP server manifest in registry server.json format.
GET /auth.mdHow to authenticate: you do not. Written to the auth.md structure so nothing is ambiguous.
GET /api-deprecation-policyWhat we will and will not change, and how much notice you get.
GET /api/v1/sandboxWhere the sandbox is and what it covers.
GET /llms.txtSite summary, when-to-use guidance and the index of everything above.
GET /sitemap.xmlEvery published URL.
GET /<anything-else>A real HTTP 404, never a 200 with an app shell. With Accept: text/markdown the body is a short markdown page pointing at the files above.

Limits. Reads allow 120 requests per minute per IP; POST /api/lead allows 5 per hour. Every response carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and RateLimit-Policy, and a 429 carries Retry-After, so you can back off on real numbers rather than guessing.

Versioning. The version is in the path. Within /api/v1 this API only changes additively: new endpoints, new optional parameters, new response fields. When an operation is going to be withdrawn its responses carry Deprecation and Sunset dates (RFC 8594 and RFC 9745) and a Link to its replacement, for at least six months first, and it is marked deprecated in the spec. Nothing is deprecated today. Full policy: /api-deprecation-policy.

This is the public marketing surface. The tenant API behind app.moveezi.com is authenticated, versioned separately and not documented here. Talk to us if you need access to it.

Building something on Moveezi?

Tell us what you are integrating and we will help you get there.

Start a conversation