---
title: Data tools
description: Pay-per-result scrapers, search and enrichment tools your code or agent can call with the same key and balance as the Models API.
---

Data tools return structured data from the web: web search results, any web page as Markdown, Google Maps places, TikTok comments, LinkedIn profiles, Amazon reviews, job listings. You find a tool, send it a JSON input, and get JSON results back. Each run is billed from your prepaid balance: a per-call fee plus a per-result fee, never more than the cap you set.

There is no separate account or subscription. The API key you use for models works for tools, and tool spend counts toward the same balance and [key spend limits](/docs/account/api-keys).

:::cards
- :search: [Find the right tool](/docs/tools/find) Browse the catalog, search by keyword, or describe a task and get a plan with costs.
- :tool: [Run a tool](/docs/tools/run) Start a run, wait for it or poll, page through results, stop early.
- :plug: [MCP server](/docs/tools/mcp) Give Claude Code, Cursor or any MCP client the whole catalog in one config line.
- :code: [API reference](/docs/api/tools) Every `/v1/tools` endpoint, parameter and field.
:::

## Try it

The catalog is public. List it without a key:

```bash title="cURL"
curl https://lovelyrouter.com/v1/tools
```

Running a tool needs a key. This run finds up to 20 coffee shops in Austin and costs at most $0.00551:

```bash title="cURL"
curl https://lovelyrouter.com/v1/tools/google-maps-places/run \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "input": {"searchTerms": ["coffee shop"], "location": "Austin, Texas, USA"},
    "max_results": 20
  }'
```

The response holds the run's status, what it cost and the results in `items`. [Run a tool](/docs/tools/run) covers long runs, polling and pagination.

## What's in the catalog {#categories}

Every tool belongs to one category. Filter by its id with `GET /v1/tools?category=reviews`, or browse them on the [tools page](/tools).

| Category | Id | Example tools |
| --- | --- | --- |
| Social media | `social-media` | `tiktok-search`, `instagram-posts`, `youtube-transcript`, `x-search`, `reddit-search`, `linkedin-posts` |
| Search & SEO | `search` | `google-search`, `google-maps-places`, `google-news`, `google-trends`, `facebook-ads`, `website-traffic` |
| E-commerce | `ecommerce` | `amazon-product`, `amazon-bestsellers`, `ebay-sold`, `aliexpress-products`, `facebook-marketplace` |
| Leads & enrichment | `lead-generation` | `linkedin-profile`, `linkedin-company`, `google-maps-leads`, `website-contacts`, `email-verify` |
| Reviews | `reviews` | `google-maps-reviews`, `amazon-reviews`, `trustpilot-reviews`, `app-store-reviews`, `g2-reviews` |
| Jobs | `jobs` | `linkedin-jobs`, `indeed-jobs`, `glassdoor-jobs`, `upwork-jobs`, `career-site-jobs` |
| Travel & real estate | `travel` | `booking-hotels`, `airbnb-listings`, `zillow-listings`, `tripadvisor-places`, `google-flights` |
| Web extraction | `web` | `web-fetch`, `website-crawl`, `website-screenshot`, `browser-agent` |

Tools are added over time. `GET /v1/tools` and the [tools page](/tools) always show the current list.

## How pricing works {#pricing}

Each tool has two prices, either of which can be zero:

- **Per-call fee**, charged once for a run that succeeds.
- **Per-result fee**, charged for each result the run returns. The unit depends on the tool: a place, a review, a page, a profile.

A run costs:

```text
per-call fee + per-result fee × results returned
```

Some examples at today's prices:

| Tool | Price | Example run |
| --- | --- | --- |
| `google-maps-places` | $0.000238 / place + $0.00075 / call | 20 places: $0.00551 |
| `trustpilot-reviews` | $0.0015 / review + $0.0075 / call | 20 reviews: $0.0375 |
| `google-trends` | $0.039 / call | Any successful run: $0.039 |

Prices can change. The [tools page](/tools) and `GET /v1/tools` show the live price of every tool in its `price` object.

### Cap the cost with max_results

Every run has a result cap, `max_results`. A run never returns or bills more results than its cap. When you leave it out, the tool's `default_results` applies, and you can raise it up to the tool's own `max_results`.

So the most a run can cost is known before it starts: `per-call fee + per-result fee × max_results`.

### Hold, then settle

1. **Hold.** When a run starts, its maximum cost is reserved from your balance. If your balance or the key's spend limit can't cover it, the run is refused with `402` and nothing is charged. Lower `max_results` or [top up](/docs/account/billing).
2. **Settle.** When the run ends, it is charged for what it actually returned, and the rest of the hold goes back to your balance.

A Google Maps search capped at 20 places holds $0.00551. If 14 places come back, you pay $0.004082 and $0.001428 returns to your balance.

### Failed and stopped runs

| Outcome | You pay |
| --- | --- |
| `succeeded` | Per-call fee + per-result fee × results |
| `failed` or `timed_out` | Per-result fee for results delivered before it ended. No per-call fee. |
| `stopped` (you stopped it) | Per-result fee for results delivered before it stopped. No per-call fee. |
| Refused at start (bad input, tool unavailable) | Nothing |

A failed run that returned no results costs nothing. Every run and its charge appears in [Tools](/app/tools) in your dashboard.

## The life of a run

:::steps
### Find a tool
List or search the catalog, or describe your task to the planner. See [Find the right tool](/docs/tools/find).

### Read its input schema
`GET /v1/tools/{id}` returns the tool's `input_schema`, an `example_input` and its price.

### Start the run
`POST /v1/tools/{id}/run` with your `input` and a `max_results` cap. The maximum cost is held from your balance.

### Wait or poll
The request waits up to 60 seconds by default. A run that finishes in time comes back with `200` and its results. A longer run comes back with `202`, and you poll `GET /v1/tools/runs/{run_id}` until it finishes.

### Settle and read results
The finished run reports `results`, `charge_usd` and the data in `items`. Runs nobody polls are settled automatically within minutes, so a hold is never stuck.
:::

## Browser agent

The [browser agent](/docs/browser-agent) is in the same catalog under the id `browser-agent`. Give it a goal and a start URL and it works through the task in a real browser. It is billed per step instead of per result: `max_results` sets the maximum number of steps. For its full API, including logins, structured output and human approval, see [Browser agent](/docs/browser-agent).

## Limits

| Limit | Value |
| --- | --- |
| Runs in progress per account | 10 (including browser-agent runs) |
| `input` size | 50,000 characters of JSON |
| `wait` per request | Up to 300 seconds |
| Results per run | Up to the tool's `max_results` |
| Planner requests | 100 per minute per key |

A run over the concurrency limit is refused with `429`. Start it again once another run finishes.

## Next steps

:::cards
- :search: [Find the right tool](/docs/tools/find) Search the catalog or plan a whole task.
- :tool: [Run a tool](/docs/tools/run) A complete example in cURL, Python and Node.js.
- :plug: [MCP server](/docs/tools/mcp) Let your agent search and run tools on its own.
- :browser: [Browser agent](/docs/browser-agent) For sites and tasks no tool covers.
:::
