DOCS
API reference
Everything the services accept and return. There is no authentication section, because there are no API keys — payment is the authentication.
Quickstart
One request. No account step, because there is no account.
curl -X POST https://MY_DOMAINNAME/api/v1/pdf \
-H "Content-Type: application/json" \
-d '{
"url":"https://example.com",
"format":"A4",
"printBackground":true
}'
{
"success": true,
"price": "$0.03",
"pages": 7,
"render_ms": 4281,
"content_type": "application/pdf",
"download_url": "/files/abc123.pdf"
}
The first unpaid call returns 402 with a price and a nonce. A client that speaks x402 signs and retries automatically; see x402 payment.
Endpoints
Every service, its path and its unit price. All endpoints accept JSON and return JSON unless you ask for bytes.
| Method | Path | Description | Price |
|---|---|---|---|
| POST | /api/v1/render | Execute JavaScript in real Chromium and return the fully rendered document. | $0.01 |
| POST | /api/v1/markdown | Turn live webpages into clean, structured Markdown ready for agents and RAG. | $0.01 |
| POST | /api/v1/screenshot | Capture viewport or full-page PNG screenshots from a real browser. | $0.02 |
| POST | /api/v1/pdf | Generate print-ready PDFs from JavaScript-rendered webpages. | $0.03 |
| POST | /api/v1/seo | Extract titles, metadata, headings, canonical URLs, schema and links. | $0.015 |
| POST | /api/v1/security | Inspect TLS and important HTTP security headers from a public URL. | $0.015 |
| POST | /api/v1/links | Extract links, JSON-LD and machine-readable structured page data. | $0.01 |
| GET | /api/v1/health | Operational state of every service | free |
| GET | /mcp | MCP tool manifest for agent frameworks | free |
Parameters
Shared parameters plus the ones specific to each service. Sending a parameter a service does not use returns 400 rather than ignoring it silently.
| Param | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Absolute http or https URL |
| waitUntil | string | no | load | domcontentloaded | networkidle |
| timeoutMs | int | no | Default 30000, max 120000 |
| width | int | no | Viewport width in CSS pixels, default 1440 |
| fullPage | boolean | no | Screenshot only — capture beyond the viewport |
| format | string | no | PDF only — A4 or Letter |
| printBackground | boolean | no | PDF only — include background graphics |
| includeLinks | boolean | no | Markdown only — keep inline links |
| types | string[] | no | Links & Data only — links | jsonld | microdata |
| includeTls | boolean | no | Security Check only — inspect the TLS chain |
x402 payment flow
x402 lets a client receive a 402 response, authorize the payment and retry the request automatically. Nonces are single-use, bound to a hash of the request body, and expire in 120 seconds.
HTTP/1.1 402 Payment Required
Content-Type: application/json
X-Payment-Nonce: pn_9f2c81a4
{
"error": "payment_required",
"accepts": [
{
"scheme": "x402/exact",
"network": "base",
"asset": "USDC",
"amount": "0.03",
"nonce": "pn_9f2c81a4",
"expires_in": 120
}
]
}
curl -X POST https://MY_DOMAINNAME/api/v1/pdf \
-H "X-PAYMENT: $(x402 sign 0.03)" \
-H "Content-Type: application/json" \
-d @request.json
MCP
All seven services are exposed as MCP tools, so an agent framework can discover them without a bespoke wrapper. Add the server to your client configuration:
{
"mcpServers": {
"agentnorth": {
"url": "https://MY_DOMAINNAME/mcp",
"transport": "http"
}
}
}
Tool names match the service paths — render, markdown, screenshot, pdf, seo, security, links. Each declares its price so an agent can budget before calling.
Errors
Failure modes and their codes. Only 2xx responses settle — everything on this list leaves the payment authorization unused, so none of them cost you anything.
| Status | Code | When it happens |
|---|---|---|
| 400 | invalid_request | Malformed body or an unknown parameter |
| 402 | payment_required | Expected — the price quote, not a failure |
| 409 | nonce_reused | A payment authorization was replayed |
| 422 | unrenderable | Upstream returned a body we cannot render |
| 424 | upstream_failed | Target site returned 5xx or refused the connection |
| 451 | blocked_target | The destination is on a policy blocklist |
| 504 | render_timeout | Page exceeded timeoutMs before the wait condition |