# How HappyFetch bills: pay for answers

Every call has one public price. Calls we can't complete are refunded in the same request, and asking how old our data is costs nothing.

## One public price per call

Every call has a fixed price in credits, the same for every customer, and it's on our
[pricing page](/pricing):

| What you send | Fetched now | From our cache | Confirmed "no such company" |
|---|---|---|---|
| A LinkedIn company URL | 2 credits: $1.00 to $0.50 per 1,000 | 1 credit | 1 credit, free from our cache |
| A website domain | 4 credits: $2.00 to $1.00 per 1,000 | 2 credits | 4 credits, free from our cache |
| A web search | 1 credit: $0.50 to $0.25 per 1,000 | 1 credit | n/a |

The per-1,000 prices run from our smallest pack to our biggest.

Credits come in prepaid packs, from 20,000 credits for $10 to
2,000,000 for $500. They stay in your workspace until you use them.

## What you pay for

- **A company profile by LinkedIn company URL:** 2 credits when we fetch it now,
  1 credit when it comes from our cache.
- **A company profile by website domain:** 4 credits when we fetch it now,
  2 credits from our cache.
- **A completed web search:** 1 credit, even when it finds nothing. The search ran, and an
  empty list is its answer.
- **A confirmed "no such company":** 1 credit by LinkedIn company URL,
  4 credits by website domain. That's an answer too: we looked, and there is none. When
  the same answer comes from our cache, it's free.

## What you never pay for

- **A call we can't complete.** When something goes wrong on our side, the charge is refunded in the
  same request. The error you get back already shows that nothing was charged.
- **Input we reject before doing any work:** an invalid LinkedIn company URL or domain, a missing key, an
  empty balance, a rate limit.
- **A retry of a call that already worked.** Give each call a retry key (see
  [idempotency](/docs/idempotency)), and a retry gets the stored answer back instead of running again.
- **Asking how old our copy is.** The cache check is free, and it tells you what a lookup would cost
  right now:

```json title="200 OK"
{
  "data": {
    "lookup": "company",
    "cached": true,
    "answer": "company",
    "fetched_at": "2026-09-20T09:14:02.000Z",
    "age_seconds": 259200,
    "max_age_seconds": 604800,
    "from_cache": true,
    "price_credits": 1,
    "fetch_price_credits": 2
  },
  "meta": {
    "request_id": "5d0a9c3e-71f2-4b86-a4e0-c29b8f1d6a37",
    "endpoint": "cache",
    "credits_charged": 0,
    "credits_remaining": 200
  }
}
```

## Every credit points at a request

Every answer says what it cost. Calls that reach billing also carry it in these headers:

| Header | What it tells you |
|---|---|
| `X-Request-Id` | Ties the call to its charge and to the data it returned |
| `X-Credits-Charged` | What this call cost |
| `X-Credits-Remaining` | What's left in your workspace |

In the console, every call in your ledger links to the request behind it. When your balance runs low we
email you, and you choose the level in the console. Every purchase comes with an invoice with your
company details and VAT number.

## Why we bill this way

Code that calls an API usually runs unattended: a nightly job, a signup hook, an agent. When a call fails
at three in the morning, nobody should have to file a ticket to get a credit back. So the refund is part
of the request: you see it in the response, and your books stay right without anyone checking.

Prepaid packs follow the same idea. You decide what to spend up front, the balance never runs past zero,
and there's no renewal to cancel.

## In short

| What happened | What it costs |
|---|---|
| A company profile, or a completed search | The call's price, or the cache price |
| A confirmed "no such company" | 1 credit by LinkedIn company URL, 4 credits by website domain, and nothing from our cache |
| A call we couldn't complete | Nothing: refunded in the same request |
| Rejected input, a missing key, an empty balance, a rate limit | Nothing |
| A retry of a call that already worked, or a cache check | Nothing |
