Dawloom

Dawloom developer portal

Dawloom runs a free public API and a free MCP server. Both convert documents to markdown. Both are open: no account, no API key, no rate-limit tier to buy. This page is the whole contract, and everything on it is machine-readable somewhere else too.

Quickstart

One request, no setup. The base URL is https://dawloom.com and every endpoint lives under /api/v1/.

Convert a local file

curl -F file=@report.docx \
  https://dawloom.com/api/v1/convert

Convert a file on the web

curl -X POST https://dawloom.com/api/v1/convert \
  -H "Content-Type: application/json" \
  -d '{"url":"https://dawloom.com/developers/sample.docx"}'

Get the markdown on its own

curl -F file=@report.docx \
  -H "Accept: text/markdown" \
  https://dawloom.com/api/v1/convert

Read any page on this site as markdown

curl -H "Accept: text/markdown" \
  https://dawloom.com/services/

Sandbox

There is no separate sandbox environment, because there is nothing to protect: the API is free, read-only in effect, and stores nothing. Test against production. To try it without supplying your own file, convert the sample document we host for exactly this purpose.

Sample document

/developers/sample.docx— a small Word file with headings, a list, and a table.

curl -X POST https://dawloom.com/api/v1/convert \
  -H "Content-Type: application/json" \
  -d '{"url":"https://dawloom.com/developers/sample.docx"}'

The one endpoint with a real side effect is POST /api/v1/contact: it emails a person. Do not use it to smoke-test.

Authentication and API keys

There are none. No key, no token, no OAuth, no sign-up. Send the request. The security array in the OpenAPI document is empty for the same reason, and the MCP manifest declares authentication: none. If you are building something that needs a key, that is a private integration, and it starts with a conversation.

Endpoints

Every operation has a stable operation id, so it maps cleanly onto an LLM function-calling tool definition. The same list is served as JSON at /api/v1/.

MethodPathOperation idWhat it does
GET/api/v1/getApiIndexLists every endpoint in this version with its operation id. Start here.
GET/api/v1/healthgetHealthReturns the service status. Cheap, safe to poll, no side effects.
GET/api/v1/formatslistSupportedFormatsLists the 13 file extensions the converter accepts, and the size limit.
GET/api/v1/convertgetConvertUsageUsage notes, limits, and copy-paste curl examples for the converter.
POST/api/v1/convertconvertDocumentConverts a document to GitHub-flavored markdown. Multipart, JSON, or raw bytes.
POST/api/v1/contactsubmitContactMessageSends a project enquiry to the Dawloom team. A human replies.
GET/api/v1/openapi.jsongetOpenApiDocumentThe OpenAPI 3.1 document for everything above.

Errors

Every 4xx and 5xx response is JSON, never HTML, and every one has the same shape. It is modelled on RFC 9457 problem details. Send Accept: application/problem+json to get the response typed as a problem document. Branch on code, show detail to a person, and act on hint.

{
  "type": "https://dawloom.com/developers/errors/#validation_failed",
  "title": "One or more fields failed validation",
  "status": 400,
  "code": "validation_failed",
  "detail": "2 field(s) failed validation.",
  "hint": "Fix the fields listed in \"errors\" and send the request again.",
  "documentation_url": "https://dawloom.com/developers/",
  "instance": "/api/v1/contact",
  "ok": false,
  "error": "validation_failed",
  "errors": [
    { "field": "email", "code": "invalid_email", "message": "Give a valid email address so we can reply." }
  ]
}
codeHTTPMeaning
invalid_json400The body is not valid JSON.
invalid_request400The body is JSON but the shape is wrong.
validation_failed400One or more fields failed validation. See the errors array.
not_found404No endpoint at that path.
method_not_allowed405Wrong HTTP method. See the allow field.
payload_too_large413The document is over 25 MB.
unsupported_media_type415Unsupported Content-Type.
unprocessable422The file was read but could not be converted.
rate_limited429Over the quota. See Retry-After.
fetch_failed502The document URL could not be fetched.
upstream_failed502An upstream service failed.
not_configured503The endpoint is not configured on this deployment.

A 404 on a page URL, not an API path, returns HTML for browsers and a short markdown document for everything else. That markdown lists the sitemap, llms.txt, and this page.

Rate limits

Limits are per client IP. Every response carries RateLimit and RateLimit-Policy, the IETF structured-field form, plus the older RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset fields. A 429 also carries Retry-After in seconds. Read them and throttle yourself rather than retrying blind.

GroupLimitWindowApplies to
Reads120 requests60 secondsindex, health, formats, usage, openapi.json
Conversions30 requests60 secondsPOST /api/v1/convert
Contact5 requests600 secondsPOST /api/v1/contact
RateLimit-Policy: "convert";q=30;w=60
RateLimit: "convert";r=29;t=60
RateLimit-Limit: 30
RateLimit-Remaining: 29
RateLimit-Reset: 60

Versioning and deprecation

The version is in the URL path. Everything current lives under /api/v1/, and every response repeats it in an X-Api-Version header.

  • A breaking change never lands in an existing version. It gets a new path, /api/v2/, and both run side by side.
  • Additive changes, meaning new fields, new endpoints, and new enum members, can land in v1 at any time. Parse leniently and ignore what you do not know.
  • A deprecated endpoint keeps working for at least 12 months after the notice.
  • Deprecated responses carry Deprecation: true, a Sunset HTTP date (RFC 8594), and a Link header with rel="deprecation".

Deprecated today: the unversioned aliases /api/convert and /api/contact. They still work and are scheduled to sunset on 31 December 2031. Move to the /api/v1/ paths.

MCP server

The same conversion is exposed as an MCP server over Streamable HTTP, so Claude, ChatGPT, and any other MCP client can call it as a tool. No key. The manifest sits at the well-known path, and the server speaks both the modern stateless revision and the older initialize handshake.

Add it to Claude Code

claude mcp add --transport http \
  dawloom-tools https://dawloom.com/mcp

Or configure it by hand

{
  "mcpServers": {
    "dawloom-tools": {
      "type": "http",
      "url": "https://dawloom.com/mcp"
    }
  }
}
Endpoint
https://dawloom.com/mcp
Transport
Streamable HTTP
Manifest
/.well-known/mcp.json
Tools
convert_document, list_supported_formats

We also build MCP servers for other companies. That work is described on the MCP servers page.

Command line

The API is a single POST, so curl is a perfectly good client. A shell function is enough to make it feel like a tool:

dawloom() {
  curl -sS -F "file=@$1" -H "Accept: text/markdown" \
    https://dawloom.com/api/v1/convert
}

dawloom report.docx > report.md

A packaged CLI lives in the site repository under cli/. It is not on npm yet. When it is published this page will say so, with the install command.

Machine-readable files

Everything an agent needs to work with Dawloom without reading a single HTML page.

Every page on dawloom.com is also available as markdown. Send Accept: text/markdown to any page URL and you get clean markdown with the front matter, no navigation, no scripts. Each HTML page also advertises its markdown twin in a Link header.

Support

Email support@dawloom.com for anything about the API or the MCP server. For a project, use the contact form or POST /api/v1/contact. What we collect and why is written down on the privacy page.

Need an API of your own?

We build the kind of API surface this page describes, for products that need agents to reach them.

Search the whole site