API

Every machine-readable surface this site offers.

This is a portfolio site, not a product with a programmable API. What it does offer, it offers to machines on the same terms as to browsers: everything below works without credentials and returns real content.

Markdown mirror

Every page has a markdown twin at <path>index.md — for example/index.md or/emojilibrary/index.md. SendingAccept: text/markdown on any GET also returns the markdown variant, so agents never have to parse HTML.

Indexes

Contact API

The contact form posts to POST /api/submit. The request body is JSON, and all four fields are required:

{
  "name": "Your name",
  "email": "[email protected]",
  "message": "Your message",
  "cf-turnstile-response": "token minted by the Turnstile widget"
}

The response is JSON on every outcome:{"ok": true} on success;{"ok": false, "errors": {"email": "Enter an email address I can reply to."}, "message": "Check the fields marked."} with status 400 on validation failure; and{"ok": false, "message": "Expected a JSON body."} when the body is not the JSON object above.

Only the Turnstile widget on the contact page mintscf-turnstile-response, and each token is good for one submission. So this endpoint cannot be driven on its own, by design, and there is no key-based access to it. To reach James, open the contact page.