Overview
The InstantBot Web Extraction API fetches any public URL and returns structured data in a single call. No browser, no scraping infrastructure, no headaches. Send a URL, get back clean JSON.
Three endpoints cover the most common extraction needs: full-page data, contact-only extraction, and AI-generated summaries. All endpoints share the same auth scheme and error format.
Authentication
Pass your API key in the x-api-key header on every request. Keys start with ib_. Get yours from the dashboard.
curl -X POST https://instantbot.app/api/v1/extract \ -H "x-api-key: ib_your_key_here" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com"}'
Missing or malformed key returns
401. Exceeded quota returns 429.Rate Limits
100 requests per hour per API key, regardless of plan. Every response includes:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Max requests per hour (100) |
| X-RateLimit-Remaining | Requests left in the current window |
| X-RateLimit-Reset | Unix timestamp when the window resets |
Endpoints
POST
/extract
Full page extraction — title, description, body text (up to 5,000 chars), emails, phones, links, images, and metadata.
Request body
{
"url": "https://example.com" // required; http:// added automatically if omitted
}
Response
{
"success": true,
"url": "https://example.com",
"title": "Example Domain",
"description": "This domain is for use in illustrative examples...",
"text": "Example Domain This domain is for use...", // max 5,000 chars
"emails": ["[email protected]"],
"phones": ["+1 800 555 0100"],
"links": [{ "href": "https://example.com/about", "text": "About" }], // up to 50
"images": [{ "src": "https://example.com/logo.png", "alt": "Logo" }], // up to 30
"metadata": {
"og:title": "Example Domain",
"language": "en",
"canonical": "https://example.com/"
},
"processingTimeMs": 342
}
POST
/extract/contacts
Contact-focused extraction — emails, phones, physical addresses, and social media profile links.
Request body
{
"url": "https://example.com/contact" // required
}
Response
{
"success": true,
"url": "https://example.com/contact",
"emails": ["[email protected]", "[email protected]"],
"phones": ["+1 800 555 0100"],
"addresses": ["123 Main Street, Springfield, IL 62701"],
"socialLinks": [
"https://twitter.com/example",
"https://linkedin.com/company/example"
],
"processingTimeMs": 198
}
POST
/extract/summary
AI-powered summary — distills any page into a short paragraph and 3–5 key points using a large language model.
Request body
{
"url": "https://example.com", // required
"maxLength": 500 // optional; max 2000, default 500
}
Response
{
"success": true,
"url": "https://example.com",
"title": "Example Domain",
"summary": "Example.com is a placeholder domain maintained by IANA...",
"keyPoints": [
"Reserved by IANA for illustrative examples",
"Safe to use in documentation without prior permission",
"Links to further official information"
],
"processingTimeMs": 1820
}
This endpoint calls an LLM internally and typically takes 1–4 seconds longer than the others.
ERR
Error responses
All errors share the same JSON envelope.
| Status | Meaning |
|---|---|
| 400 | Missing or invalid url in request body |
| 401 | Missing or malformed API key |
| 429 | Rate limit exceeded (100 req/hour) |
| 502 | Target URL returned a non-200 HTTP response |
| 500 | Internal server error |
Error body
{
"success": false,
"error": "url is required",
"processingTimeMs": 2
}
Pricing
Free
$0 / month
- 100 requests / day
- All 3 endpoints
- 100 req / hour rate limit
- No credit card needed
Pro
$49 / month
- 10,000 requests / day
- All 3 endpoints
- 100 req / hour rate limit
- Priority email support