Render a URL in a real headless browser (JavaScript executed) and return its art
Render a URL in a real headless browser (JavaScript executed) and return its article content with the clutter stripped — same cleaning + output formats as /api/url/clean, but for client-rendered / SPA pages whose content only appears after JS runs (where a raw HTTP fetch returns an empty shell). `format`: markdown (default), text, both (JSON envelope), html (self-contained reader page, raw text/html), or pdf (typeset reading doc, raw application/pdf). Optional `waitUntil` (load|domcontentloaded|networkidle0|networkidle2, default networkidle2) and `timeoutMs` (1000-15000, default 12000) control how long to let JS settle. Use /api/url/clean instead for server-rendered pages — it is faster and cheaper; only reach for render when JS rendering is required.
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
GET https://2s.io/api/url/render
| Category | Code and developer |
|---|---|
| Provider host | 2s.io |
| Networks | eip155:8453, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp |
| Payment schemes | exact |
| Self-reported calls, 30 days | 1 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-09-24 | valid payment request | 402 | $0.015 | 244 ms |
Example input (from the provider)
{
"method": "GET",
"queryParams": {
"format": "markdown",
"url": "https://react.dev"
},
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"properties": {
"method": {
"const": "GET"
},
"queryParams": {
"properties": {
"format": {
"default": "markdown",
"enum": [
"markdown",
"text",
"both",
"html",
"pdf"
],
"type": "string"
},
"timeoutMs": {
"default": 12000,
"maximum": 15000,
"minimum": 1000,
"type": "integer"
},
"url": {
"type": "string"
},
"waitUntil": {
"default": "networkidle2",
"enum": [
"load",
"domcontentloaded",
"networkidle0",
"networkidle2"
],
"type": "string"
}
},
"required": [
"url"
]
},
"type": {
"const": "http"
}
},
"required": [
"type",
"method",
"queryParams"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}