[ Developers ] · [ Agents ]

Jordan Dalton API documentation

Everything on this site is readable by a program: a public JSON API, an MCP server, markdown versions of every page, and a set of discovery files. No signup, no API key, no OAuth dance.

Basics

Base URL, auth, and limits

Base URL
https://jordandalton.com/api/v1

Versioned in the path. A breaking change ships as /api/v2 and v1 keeps working alongside it.

Authentication
None

Every endpoint is public and read-mostly. No API key, no bearer token, no CSRF token. Send Accept: application/json and go.

Rate limit
60 req / minute / IP

Every response carries RateLimit-Limit, -Remaining, -Reset, and RateLimit-Policy. A 429 adds Retry-After.

Endpoints

Five endpoints, all public

GET/api/v1/healthoperationId: getApiHealth

Whether the API is serving traffic, which version is current, and whether it is deprecated.

curl https://jordandalton.com/api/v1/health
GET/api/v1/servicesoperationId: listServices

Every service with price, duration, and landing page, plus availability and payment terms.

curl https://jordandalton.com/api/v1/services
GET/api/v1/articlesoperationId: listArticles

Published articles, newest first, with slug, title, description, date, and canonical URL.

curl https://jordandalton.com/api/v1/articles
GET/api/v1/articles/{slug}operationId: getArticle

One article by slug, including the full markdown body.

curl https://jordandalton.com/api/v1/articles/how-much-does-an-ai-consultant-cost
POST/api/v1/bookingsoperationId: createBooking

Submit a build day booking request. Jordan gets an SMS and replies by email, normally within 24 hours.

curl -X POST https://jordandalton.com/api/v1/bookings \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ada Lovelace",
    "email": "ada@example.com",
    "brief": "Ship an internal dashboard on top of our Postgres warehouse."
  }'

Request and response shapes for all of these are typed in the OpenAPI 3.1 spec. Every operation has a unique operationId and a described, typed response schema, so the spec drops straight into an LLM function-calling setup.

Errors

One error shape, everywhere

Every 4xx and 5xx response is application/problem+json (RFC 9457). Branch on code, show error.message to a human, and act on error.hint. This holds for HTML paths too: request a missing page with Accept: application/json and you get the same object.

{
  "type": "https://jordandalton.com/docs#error-validation_failed",
  "title": "Validation Failed",
  "status": 422,
  "detail": "The email field is required.",
  "instance": "/api/v1/bookings",
  "code": "validation_failed",
  "message": "The email field is required.",
  "error": {
    "code": "validation_failed",
    "message": "The email field is required.",
    "hint": "One or more fields failed validation. The \"errors\" object maps each field to its problems. Fix those fields and retry.",
    "fields": { "email": ["The email field is required."] }
  },
  "documentation_url": "https://jordandalton.com/docs",
  "errors": { "email": ["The email field is required."] }
}
code status what to do
not_found404Nothing exists at that path or slug. List valid slugs with listArticles.
method_not_allowed405The path exists but not for that method. Check the spec.
validation_failed422One or more fields are wrong. The errors object names each one.
rate_limited429Quota exceeded. Wait the seconds in Retry-After, then retry.
server_error500Failure on our side. Retry once with backoff.
Versioning

Nothing breaks without warning

Version in the path

Every endpoint is under /api/v1/. Additive changes (a new field, a new endpoint) ship into v1. Anything that would break an existing integration ships as /api/v2/ instead, and v1 keeps serving.

Six months of notice

When a version is scheduled for removal, its responses carry a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the removal date, at least six months ahead. GET /api/v1/health reports the same thing as deprecated and sunset fields, so a poller never has to read headers. v1 is current and is not deprecated.

MCP

Or skip the API and connect the MCP server

https://jordandalton.com/mcp speaks MCP over Streamable HTTP with no authentication. Add it to Claude, ChatGPT, Cursor, or any MCP client:

{
  "mcpServers": {
    "jordan-dalton": {
      "type": "http",
      "url": "https://jordandalton.com/mcp"
    }
  }
}
Tools
  • get-services — pricing, availability, terms.
  • list-articles — every published article.
  • submit-booking — send a booking request; Jordan gets an SMS.
Resources
  • services — the catalog as JSON.
  • articles-index — the article index as JSON.
  • llms-txt — this site's guide for agents.
  • build-day-skill — the SKILL.md for booking.
Discovery

Every page, as markdown

Send Accept: text/markdown to any content page and you get clean markdown instead of HTML. Responses declare Vary: Accept, so a cache in front of the site cannot hand you the wrong variant. Missing pages return a real 404 with a markdown body that points back here.

curl -H "Accept: text/markdown" https://jordandalton.com/services
/llms.txtStart here. What this site is, when to use it, and every page worth reading.
/.well-known/openapi.jsonOpenAPI 3.1 description of every endpoint below, with typed request and response schemas.
/.well-known/mcp.jsonMCP server manifest: transport, tools, resources, and rate limits.
/.well-known/mcp/server-card.jsonThe same manifest at the server-card path.
/.well-known/api-catalogRFC 9727 linkset pointing at the spec, the docs, and the status endpoint.
/.well-known/agent-skills/index.jsonAgent skills discovery index, with a digest of each SKILL.md.
/sitemap.xmlEvery URL on the site.
/articles.jsonThe article index as JSON, no version prefix.
Command line

Scripting it

There is no separate CLI to install. The API is plain HTTP with no auth, so curl and jq are the CLI:

# every service and its price
curl -s https://jordandalton.com/api/v1/services | jq '.data[] | {name, price}'

# the latest article, as markdown
curl -s https://jordandalton.com/api/v1/articles \
  | jq -r '.data[0].slug' \
  | xargs -I{} curl -s https://jordandalton.com/api/v1/articles/{} \
  | jq -r '.data.markdown'
Questions

Something missing?

If an endpoint you need does not exist, or a response shape is wrong, email jordan@daltonsolutions.com and it usually gets fixed the same week. More on who is behind this at /about, and the ways to reach a human at /contact.