Every endpoint, one page
Base URL https://app.irmu.com/api — bearer auth, JSON responses, predictable errors.
The surface area
Generated from the live OpenAPI spec and refreshed daily.
Crawl a url
Fetches a single URL, charges the calling organization's credit balance, and returns the response body alongside billing metadata. Costs are computed before the fetch and exposed in credits_charged; daily per-host tallies are recorded for rate-limiting purposes.
When to use it for one-off page retrieval where you need the raw content, a JavaScript-rendered view, or an AI-generated answer about the page. Use premium when standard egress IPs are blocked. Use js=false only when you are certain the target is static and want lower cost.
jsdefaults to enabled; explicitly disable it for static targets to reduce charges.ai_queryadds a fixed 5-credit surcharge; omit or leave empty to skip it.- Passing
keyin the query string logs the credential in proxies and access logs; prefer theAuthorizationheader.
| Parameter | In | Type | Description |
|---|---|---|---|
| url * | query | string<uri> | The page to crawl. Must be `http` or `https` and must have a host. |
| premium | query | string | Fetch through the premium pool. Costs more; use it for targets that refuse ordinary requests. Sent as text in a query string, so the spellings a person would reach for all work: `true`, `false`, `1`, `0`, `yes`, `no`, `on`, `off`, in any case. Anything that is not a yes or a no is refused rather than quietly read as `false`. |
| js | query | string | Render javascript before reading the page. On by default, because it is what works on most of the web -- a caller who knows their target is static turns it off and pays less. Accepts the same spellings as `premium`. |
| ai_query | query | string | A question to answer about the page once it has been retrieved. Costs 5 credits on top of the fetch. An empty value is the same as asking nothing and costs nothing extra. |
| key | query | string | The API key, for callers that cannot set a header. Accepted on this route only -- a key in a url is copied into access logs, proxy logs and `Referer` headers, which is a fair trade for a machine-to-machine endpoint and a bad one for anything else. Ignored when an `Authorization` header is present. |
curl -X GET "https://app.irmu.com/api/crawl?url=&premium=&js=&ai_query=&key=" \
-H "Authorization: Bearer $IRMU_API_KEY"{
"url": "https://www.Example.COM/products?page=2",
"domain": "www.example.com",
"premium": false,
"js": true,
"ai_query": "",
"credits_charged": 5,
"credits_remaining": 995
}Shared request parameters
These apply across endpoints unless a product page says otherwise.
| Parameter | Type | Description |
|---|---|---|
| url | string, required | Absolute URL of the target page. |
| render | boolean | Run the request in real headless Chrome before capturing. |
| country | string | Two-letter country code for proxy geo-targeting. |
| city | string | City-level targeting where the pool supports it. |
| session_id | string | Reuse the same IP and cookie jar across requests. |
| wait_for | string | CSS selector to wait for before capture. |
| timeout_ms | integer | Hard ceiling for the request, 1000–120000. |
| premium_proxy | boolean | Force residential IPs for hard targets. |
| device | string | desktop | mobile — sets viewport and fingerprint. |
| output | string | html | text | markdown for scrape responses. |
Bearer tokens
curl https://app.irmu.com/api/account \
-H "Authorization: Bearer irmu_sk_live_..."Error envelope
{
"error": {
"code": "target_unreachable",
"message": "Target failed after 4 retries.",
"request_id": "req_01J9K2XA7Q",
"billed": false
}
}Rate limits and concurrency
| Plan | Concurrent requests | Burst |
|---|---|---|
| Free | 1 | 1 req/s |
| Lite | 5 | 5 req/s |
| Standard | 50 | 50 req/s |
| Pro | 100 | 100 req/s |
| Enterprise | 500+ (negotiated) | Negotiated |
Start building with Irmu today
1,000 free credits every month, no card required. Every API, every integration, one key.