Observe once.
Call the workflow.
Turn your authenticated web workflows into private API tools. Discover by intent, run a saved tool, or use a remote browser to observe a new one.
$10 / 100,000 calls
Start with $1 free: 10,000 calls, granted once per account. Then prepaid, with one credit for each admitted search, indexing, compilation or execution request. Retrying the same operation key does not debit again. Accepted failed or uncertain operations consume their credit. Account management and catalog inspection are free. Search, indexing and execution are separate requests: one of each uses three credits. Manual compilation adds another credit. Check your balance at GET /v1/usage. Buy another pack in your account; Stripe payment confirmation adds the credits.
Connect
Use an owner token from registration or login to manage your account. Register a public OAuth client at POST /oauth/clients, then use authorization code with S256 PKCE. Clients request only the scopes they need. Access tokens expire after one hour; OAuth refresh tokens rotate and expire after 30 days.
API: https://api.unbrowse.ai OpenAPI: https://api.unbrowse.ai/openapi.json OAuth metadata: https://api.unbrowse.ai/.well-known/oauth-authorization-server
Search for a tool with Jev
Create an account, then use Copy API token. Your owner token expires after one hour. The examples below use curl with your token in UNBROWSE_TOKEN. Replace the intent with the task you want to perform.
curl https://api.unbrowse.ai/v1/tools/search \
-H "Authorization: Bearer $UNBROWSE_TOKEN" \
-H "Idempotency-Key: search-orders-001" \
-H "Content-Type: application/json" \
-d '{"intent":"list recent orders","domain":"example.com"}'
intent is required, with 1–2,000 characters. domain is optional: supply a hostname such as example.com, without a scheme or path. It restricts the result endpoint to that host and its subdomains. Omit it to search all tools in your account.
Jev compares your intent with verified workflows and their output fields. It returns up to ten callable matches, ordered by confidence, with a minimum score of 0.9. Each match includes id, score, endpoint and typed inputs. Search uses your private tools and observed traffic. It does not search other accounts or browse the web.
Read the search result
The response is a receipt. Check both status and result.status: an outer completed means the search finished, not that it found a callable tool. This abbreviated response shows a match; actual results also include tool schemas and Jev evidence.
{
"status": "completed",
"cost": 1,
"result": {
"status": "matched",
"tools": [{
"id": "01234567-89ab-4cde-8fab-0123456789ab",
"score": 0.96,
"endpoint": "/v1/tools/01234567-89ab-4cde-8fab-0123456789ab/execute"
}],
"index_endpoint": "/v1/index"
}
}
| result.status | What to do next |
|---|---|
matched | Choose a returned tool, supply its input slots and call its execution endpoint. |
candidate | Jev selected observed traffic and compiled an untested candidate. Inspect result.candidate; its first authorized execution must pass validation before reuse. |
needs_observation | No confident match. Use remote indexing to observe the requested workflow, then inspect its routing result. |
unavailable | Jev could not produce valid evidence. Inspect the reason. Replaying this key returns the same receipt; a later fresh attempt requires a new key and credit. |
An outer uncertain means the operation's outcome is unknown. Inspect the stored result and browser before starting another operation. Search never executes a website workflow or substitutes keyword matching.
Update an existing tools integration
GET /v1/tools now performs Jev search. It requires intent and an Idempotency-Key header. Move raw catalog inspection to GET /v1/tools/catalog, which is free and returns traces, tools and verification status.
| Endpoint | Input | Cost |
|---|---|---|
POST /v1/tools/search | JSON intent and optional domain; recommended | 1 credit |
GET /v1/tools | Query intent and optional domain | 1 credit |
POST /v1/tool-router | Same JSON as search | 1 credit |
GET /v1/tools/catalog | No search input; unranked inspection | Free |
All three search forms require tools:read or an owner token. They share the same result and idempotency ledger. Reusing the same key and inputs across these forms costs one credit total. Prefer POST to keep intent text out of URLs.
Observe, compile, execute
| Endpoint | Result |
|---|---|
POST /v1/index | Send url, intent, and optional browser: "remote". The remote browser captures observed requests in your private trace. Jev then selects a relevant API target and compiles a candidate when the evidence supports one. |
POST /v1/tools/prepare | Send the returned trace_id, target request ID, intent, and optional observed dependency IDs. Returns a candidate or an explanation of missing evidence. |
POST /v1/tools/{id}/execute | Supply intent and input slot values. A real execution validates a candidate before it becomes callable. Mutating workflows also require allow_mutation: true. |
GET /v1/tools/catalog | Inspect traces, tools, inputs, and verification status. No search ranking; free. |
Try the public demo
Index synthetic demo orders using your remote browser. A new account needs this observation before it has tools to search.
curl https://api.unbrowse.ai/v1/index \
-H "Authorization: Bearer $UNBROWSE_TOKEN" \
-H "Idempotency-Key: index-demo-orders-001" \
-H "Content-Type: application/json" \
-d '{
"url":"https://api.unbrowse.ai/demo/orders",
"intent":"Read the demo order count shown after this page loads. Stay on this page.",
"browser":"remote"
}'
Inspect result.routing. If it contains a candidate, use its id and supply all declared inputs. The demo captures the string query parameter limit; use the following body only if your returned schema maps it to p0. Replace your_tool_id_here with the returned ID.
curl https://api.unbrowse.ai/v1/tools/your_tool_id_here/execute \
-H "Authorization: Bearer $UNBROWSE_TOKEN" \
-H "Idempotency-Key: execute-demo-orders-001" \
-H "Content-Type: application/json" \
-d '{"intent":"Read the public demo order count","inputs":{"p0":"7"}}'
After successful validation, search for How many demo orders are there? with domain api.unbrowse.ai and a new operation key. Stop the browser with POST /v1/browser/stop when finished; its profile remains saved.
Every metered request requires an Idempotency-Key containing 8–128 letters, digits, dots, underscores, colons or hyphens. Use a new key for each new operation and preserve it across network timeouts. An uncertain outcome must be inspected before you start a new operation. Browser sessions maintain authenticated cookies during replay; this release does not promise browserless execution.
Keep credentials private
PUT /v1/accounts/example-password accepts {"value":"…"}. Use {{secret:example-password}} in a browser intent. List names with GET /v1/accounts; update with PUT; delete with DELETE on the name. Values are encrypted for your tenant and never returned. Clear existing sessions separately with DELETE /v1/browser.
Never put credential values in tool intents. Save them through the credential endpoint or the account form.
Limits and errors
401: sign in again. 402: buy credits. 403: missing scope or mutation confirmation. 409: operation key reused with different inputs. 429: retry later. 503: provider configuration required. Workflow execution is serialized per account. Some sites require owner sign-in or human verification.