Nebulix Web API
Nebulix gives your code and AI agents two building blocks for working with the live web: search to find pages, and extract to turn any public page into clean, structured JSON.
Base URL:
Quickstart
- Create a free account — you get 1,000 credits every month.
- Copy your API key from the dashboard. It starts with
nbx_live_. - Make your first request:
Authentication
Every request to /v1/* needs your API key in the Authorization header:
Authorization: Bearer nbx_live_xxxxxxxxxxxxxxxxxxxxxxxxPOST /v1/search
Runs a live web search and returns ranked results. Costs 1 credit.
Body parameters
| Name | Type | Description |
|---|---|---|
| q | string | Required. The search query, up to 300 characters. |
| geo | string | Two-letter country code to localise results, e.g. us, id, de. Default us. |
| limit | integer | Number of results, 1–20. Default 10. |
Example
Response
{
"query": "electric cars indonesia",
"geo": "id",
"engine": "brave",
"count": 2,
"results": [
{ "position": 1, "title": "…", "url": "https://…", "domain": "…", "snippet": "…" }
],
"ms": 412,
"credits_used": 1
}engine field shows which provider answered. With a Brave Search API key configured on the server it is brave. Without one, Nebulix falls back to wikipedia.POST /v1/extract
Fetches a public URL and returns structured data: title, meta tags, headings, links, images, readable text and — when the page has them — product and article details from JSON-LD. Costs 2 credits.
Body parameters
| Name | Type | Description |
|---|---|---|
| url | string | Required. A public http(s) URL. https:// is added if missing. |
| include_text | boolean | Include up to 5,000 characters of readable page text. Default true. |
Example
Response
{
"url": "https://example.com/",
"status": 200,
"title": "Example Domain",
"description": null,
"language": "en",
"product": null,
"article": null,
"headings": [{ "level": 1, "text": "Example Domain" }],
"links": { "internal": 0, "external": 1, "items": [ … ] },
"images": [],
"wordCount": 27,
"text": "Example Domain This domain is for use in …",
"ms": 346,
"credits_used": 2
}robots.txt and identifies itself as NebulixBot. Pages that disallow automated access return 403 blocked_by_robots. Private, local and internal addresses are always blocked.Errors
Errors use standard HTTP status codes and a consistent JSON body:
{ "error": { "code": "out_of_credits", "message": "You've used all 1,000 credits for this month." } }| Status | Code | Meaning |
|---|---|---|
| 400 | missing_query · invalid_url · blocked_target | Something is wrong with the request. |
| 401 | invalid_api_key | Key missing, wrong or revoked. |
| 402 | out_of_credits | Monthly credits used up. |
| 403 | blocked_by_robots | The site's robots.txt disallows this page. |
| 429 | rate_limited | Too many requests. Wait for Retry-After seconds. |
| 502 / 504 | target_error · fetch_failed | The target site failed or timed out. Not charged. |
Credits & limits
- /v1/search = 1 credit, /v1/extract = 2 credits. Failed requests are free.
- Credits reset on the 1st of each month.
- Rate limits per account: Free 30/min, Starter 120/min, Pro 600/min.
- Extraction reads at most 3 MB per page and times out after 12 seconds.
See Pricing for plan details.
Agents & tools
Both endpoints are plain JSON over HTTPS, so they plug straight into any agent framework as tools. Describe them to your model like this:
[
{ "name": "web_search", "description": "Search the live web. Returns ranked results.",
"input_schema": { "type": "object", "properties": { "q": { "type": "string" }, "geo": { "type": "string" } }, "required": ["q"] } },
{ "name": "web_extract", "description": "Fetch a URL and return structured page data.",
"input_schema": { "type": "object", "properties": { "url": { "type": "string" } }, "required": ["url"] } }
]A hosted MCP server is on the roadmap.