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/convertConvert 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/convertRead 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/.
| Method | Path | Operation id | What it does |
|---|---|---|---|
| GET | /api/v1/ | getApiIndex | Lists every endpoint in this version with its operation id. Start here. |
| GET | /api/v1/health | getHealth | Returns the service status. Cheap, safe to poll, no side effects. |
| GET | /api/v1/formats | listSupportedFormats | Lists the 13 file extensions the converter accepts, and the size limit. |
| GET | /api/v1/convert | getConvertUsage | Usage notes, limits, and copy-paste curl examples for the converter. |
| POST | /api/v1/convert | convertDocument | Converts a document to GitHub-flavored markdown. Multipart, JSON, or raw bytes. |
| POST | /api/v1/contact | submitContactMessage | Sends a project enquiry to the Dawloom team. A human replies. |
| GET | /api/v1/openapi.json | getOpenApiDocument | The 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." }
]
}| code | HTTP | Meaning |
|---|---|---|
| invalid_json | 400 | The body is not valid JSON. |
| invalid_request | 400 | The body is JSON but the shape is wrong. |
| validation_failed | 400 | One or more fields failed validation. See the errors array. |
| not_found | 404 | No endpoint at that path. |
| method_not_allowed | 405 | Wrong HTTP method. See the allow field. |
| payload_too_large | 413 | The document is over 25 MB. |
| unsupported_media_type | 415 | Unsupported Content-Type. |
| unprocessable | 422 | The file was read but could not be converted. |
| rate_limited | 429 | Over the quota. See Retry-After. |
| fetch_failed | 502 | The document URL could not be fetched. |
| upstream_failed | 502 | An upstream service failed. |
| not_configured | 503 | The 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.
| Group | Limit | Window | Applies to |
|---|---|---|---|
| Reads | 120 requests | 60 seconds | index, health, formats, usage, openapi.json |
| Conversions | 30 requests | 60 seconds | POST /api/v1/convert |
| Contact | 5 requests | 600 seconds | POST /api/v1/contact |
RateLimit-Policy: "convert";q=30;w=60
RateLimit: "convert";r=29;t=60
RateLimit-Limit: 30
RateLimit-Remaining: 29
RateLimit-Reset: 60Versioning 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, aSunsetHTTP date (RFC 8594), and aLinkheader withrel="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/mcpOr 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.mdA 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.
/api/v1/openapi.json
OpenAPI 3.1 document
Every operation, typed request and response schemas, and the error model.
/.well-known/mcp.json
MCP manifest
Server identity, transport, and tool list at the well-known path.
/llms.txt
llms.txt
Every page on this site with a one-line summary, plus when to use Dawloom.
/agents.md
agents.md
Agent instructions: best-fit jobs, how to call the API, what not to use it for.
/sitemap-index.xml
Sitemap
The machine-readable URL list.
/robots.txt
robots.txt
Crawler rules. Every AI crawler is allowed.
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.