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.

01Call an endpoint
curl -X POST https://MY_DOMAINNAME/api/v1/pdf \
  -H "Content-Type: application/json" \
  -d '{
    "url":"https://example.com",
    "format":"A4",
    "printBackground":true
  }'
02Response
{
  "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.

MethodPathDescriptionPrice
POST/api/v1/renderExecute JavaScript in real Chromium and return the fully rendered document.$0.01
POST/api/v1/markdownTurn live webpages into clean, structured Markdown ready for agents and RAG.$0.01
POST/api/v1/screenshotCapture viewport or full-page PNG screenshots from a real browser.$0.02
POST/api/v1/pdfGenerate print-ready PDFs from JavaScript-rendered webpages.$0.03
POST/api/v1/seoExtract titles, metadata, headings, canonical URLs, schema and links.$0.015
POST/api/v1/securityInspect TLS and important HTTP security headers from a public URL.$0.015
POST/api/v1/linksExtract links, JSON-LD and machine-readable structured page data.$0.01
GET/api/v1/healthOperational state of every servicefree
GET/mcpMCP tool manifest for agent frameworksfree

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.

ParamTypeRequiredNotes
urlstringyesAbsolute http or https URL
waitUntilstringnoload | domcontentloaded | networkidle
timeoutMsintnoDefault 30000, max 120000
widthintnoViewport width in CSS pixels, default 1440
fullPagebooleannoScreenshot only — capture beyond the viewport
formatstringnoPDF only — A4 or Letter
printBackgroundbooleannoPDF only — include background graphics
includeLinksbooleannoMarkdown only — keep inline links
typesstring[]noLinks & Data only — links | jsonld | microdata
includeTlsbooleannoSecurity 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.

402 RESPONSE
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
    }
  ]
}
SIGNED RETRY
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:

mcp.json
{
  "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.

StatusCodeWhen it happens
400invalid_requestMalformed body or an unknown parameter
402payment_requiredExpected — the price quote, not a failure
409nonce_reusedA payment authorization was replayed
422unrenderableUpstream returned a body we cannot render
424upstream_failedTarget site returned 5xx or refused the connection
451blocked_targetThe destination is on a policy blocklist
504render_timeoutPage exceeded timeoutMs before the wait condition