For developers and agents

dataacrobat.com developer documentation

Read Jay Ozer's published work using Markdown or MCP, or ask a question through the public Ask Jay API. These interfaces cover his projects, experience, patents, open source, and background.

When to use each interface

Authentication and access

No API key, account, bearer token, or OAuth flow is required. The API and MCP server work with public portfolio content. Ask Jay requests are rate limited by IP. If you receive HTTP 429, honor Retry-After before retrying; the response's detail explains which limit was reached. Use requests from your server or MCP client; the examples below do not require cross-origin browser access.

Ask Jay API

Send JSON to POST /api/ask. A single question is enough:

curl -N 'https://www.dataacrobat.com/api/ask' \
  -H 'Content-Type: application/json' \
  -H 'Accept: text/event-stream' \
  --data '{"question":"What has Jay built?"}'

For follow-up questions, send the conversation as messages instead:

{
  "messages": [
    { "role": "user", "content": "What has Jay built?" },
    { "role": "assistant", "content": "I build production AI systems." },
    { "role": "user", "content": "Tell me more about document intelligence." }
  ]
}

Each message must contain nonblank text of at most 10,000 characters. A conversation can contain 1–50 messages. Optional sessionId and responseId fields are accepted. Send the conversation history with each request; a session identifier alone does not supply earlier messages. If both messages and question are sent, messages takes precedence.

Streaming responses and errors

Successful responses use Content-Type: text/event-stream. Read each SSE data: field as a JSON event, except for the final literal [DONE]. For example:

data: {"type":"status","status":"thinking"}

data: {"type":"content","content":"I build production AI systems."}

data: [DONE]

The stream uses status, content, done, and error event types. A done event can include citations, retrieval evidence, and session or response identifiers. An error after streaming starts arrives as an error event within the HTTP 200 stream; check those events as well as the HTTP status.

Invalid request bodies return HTTP 422 with a JSON detail array describing the invalid fields. Rate limits return HTTP 429 with a JSON detail string. See the OpenAPI schemas for the full request and HTTP error formats.

API failures retain detail and also provide an error object containing a code, message, and resolution, plus a documentation link. Unknown API URLs return HTTP 404 as JSON. Unsupported methods return HTTP 405 as JSON and include an Allow header. Unexpected failures before streaming starts return HTTP 500 as JSON without internal details. These HTTP errors are separate from errors reported inside an already-started SSE stream.

Rate limits and retries

Ask Jay responses include the caller's current quota, including validation errors and successful streams:

The default chat quota is 30 accepted requests per minute per IP. Job analysis also has a quota of five analyses per hour. The deployed configuration can change the chat quota, so read the response headers. A job-analysis rejection reports its hourly policy and retry delay. Quotas use an in-memory rolling window on the backend and reset when it restarts.

Browser tools with WebMCP

On the portfolio page, browsers supporting WebMCP discover the read-only ask_jay tool. It accepts {"question":"What has Jay built?"}, opens the visible Ask Jay conversation, and returns {"answer":"…","citations":["…"]} after the response completes. Follow-up calls use the conversation shown in the drawer.

The tool uses document.modelContext.registerTool, with a fallback to navigator.modelContext for earlier implementations. It supports cancellation, rejects concurrent requests, and returns an error object on failure; rate-limit errors also include retryAfter in seconds when available. Registration is removed when the page unmounts. WebMCP browser support is experimental; ordinary chat, the HTTP API, and the MCP server remain available.

MCP server

Connect a Streamable HTTP MCP client to:

https://www.dataacrobat.com/mcp

Initialize the connection and call tools/list to discover the live tool schemas. All tools are read-only:

For example, call search_portfolio with {"query":"document intelligence","limit":5}. Use get_contact, get_patents, get_experience, or get_projects with an empty arguments object. The server also exposes portfolio://about, portfolio://operating-system, portfolio://projects, and portfolio://resume resources.

Markdown and discovery

The portfolio, this developer page, and the privacy page each have a Markdown representation. Request it through the Accept header or the .md URL:

curl -H 'Accept: text/markdown' 'https://www.dataacrobat.com/developers'
curl 'https://www.dataacrobat.com/developers.md'

This is a personal portfolio with public reading and question-answering interfaces. It has no accounts, payments, or booking flow. For professional enquiries, contact Jay. Read the privacy policy before sending information through Ask Jay.

Back to the portfolio