---
title: "Convert Markdown to PDF (API key)"
method: POST
path: "/api/v1/md"
tags: ["render"]
---

# Convert Markdown to PDF (API key)

`POST /api/v1/md`

## Request

- Base URL: `https://makespdf.com`
- URL: `https://makespdf.com/api/v1/md`
- Auth: one of:
  - HTTP bearer
  - none

Convert GitHub-flavoured Markdown (tables, code, Mermaid, math, alerts, footnotes) to a tagged PDF in about a second. Options can also come from YAML frontmatter.

## Request body

- object
  - `markdown` string, required: GitHub-flavoured Markdown source. Max 200KB of text - inline `data:` image payloads are excluded from that budget and bounded by the image limits (5MB each, 20 per document). Request body max 15MB.
  - `options` object: Rendering options. Omit for defaults.
    - `pageSize` 'A3' | 'A4' | 'A5' | 'Letter' | 'Legal'
    - `fontFamily` 'Inter' | 'NotoSans'
    - `fontSize` number
    - `margins` number[]: [top, right, bottom, left] in points.
    - `title` string
    - `theme` 'default' | 'github'
    - `pageNumbers` 'page-n-of-total' | 'n-of-total' | 'n': Footer page numbers: 'page-n-of-total' -> 'Page 3 of 12', 'n-of-total' -> '3 / 12', 'n' -> '3'. Omit for no page numbers.
    - `pageNumberPosition` 'left' | 'center' | 'right': Footer alignment when pageNumbers is set. Default 'right'.

## Response `200`

Rendered PDF (PDF/A-2A + PDF/UA-1 dual-compliant, tagged). Send `Accept: application/json` for metadata instead of bytes.

- RenderMetadata: Returned instead of PDF bytes when the request sends `Accept: application/json`.
  - `success` true, required
  - `templateId` string: Stored template rendered (/render only).
  - `pageCount` integer, required
  - `sizeBytes` integer, required
  - `renderMs` integer, required
  - `artifactId` string: Render artifact id; download again via GET /api/v1/artifacts/{id}/pdf.
  - `templateWarnings` unknown[]
    - unknown
  - `layoutWarnings` unknown[]
    - unknown
  - `credits_deducted` integer
  - `remaining_balance` integer
  - `paid` object
    - `payer` string
    - `txHash` string

## Other responses

- `400`: Malformed body or failed validation. Never billed.
- `401`: Missing or invalid Bearer token. The body links the docs, llms.txt and the auth skill.
- `402`: Insufficient credits (authed callers) or an x402 challenge (wallet callers, PAYMENT-REQUIRED header).
- `429`: Rate limit exceeded.
- `500`: Unexpected server error. Never billed.

---

[API](https://skmtc.dev/makespdf/apis/makespdf-api.md) · [All operations](https://skmtc.dev/makespdf/apis/makespdf-api/llms.txt) · [OpenAPI document](https://skmtc.dev/makespdf/apis/makespdf-api/revisions/b3042c8646ef?raw)
