# Pricing & credits (/docs/pricing)



LinkFetch is metered in **credits**. Pricing is **flat per request** —
a call returning one row and a call returning fifty rows cost the same.
We never debit per result and never split a single request into
multiple billing units.

## Credit cost per endpoint [#credit-cost-per-endpoint]

| Endpoint                                | Credits | Notes                                       |
| --------------------------------------- | ------- | ------------------------------------------- |
| `GET /v1/profiles`                      | **5**   | One profile, typed and provenance-stamped   |
| `GET /v1/profiles/:slug/posts`          | **3**   | Recent activity for one person              |
| `POST /v1/profiles/ingest`              | **5**   | Extension write-path; same cost as the read |
| `GET /v1/companies/:slug`               | **3**   | One company record                          |
| `GET /v1/companies/by-id/:id`           | **3**   | Same shape, addressed by numeric ID         |
| `GET /v1/companies/:slug/posts`         | **3**   | One page of the company timeline            |
| `GET /v1/companies/:slug/employees`     | **5**   | Flat per page, not per employee             |
| `GET /v1/posts/:id`                     | **3**   | One post + counts + reaction breakdown      |
| `GET /v1/posts/:id/reactions`           | **2**   | One page of reactors                        |
| `GET /v1/groups/:id`                    | **3**   | One group                                   |
| `GET /v1/groups/:id/members`            | **3**   | One page of members                         |
| `GET /v1/search/people`                 | **5**   | Flat per query, not per hit                 |
| `GET /v1/search/companies`              | **3**   | Same                                        |
| `GET /v1/search/groups`                 | **2**   | Same                                        |
| `GET /v1/search/posts`                  | **2**   | Same                                        |
| `GET /v1/jobs`                          | **1**   | One filtered page from our dataset          |
| `GET /v1/jobs/:id`                      | **1**   | One job detail row                          |
| `GET /v1/jobs/by-url`                   | **1**   | Same                                        |
| `GET /v1/locations/search`              | **1**   | Geo-id resolution                           |
| `POST /v1/outbound/connections`         | **10**  | LinkedIn-side weekly cap; high-risk         |
| `POST /v1/outbound/messages`            | **10**  | Same; 1st-degree only                       |
| `POST /v1/outbound/posts/:id/reactions` | **5**   | Public engagement                           |
| `POST /v1/outbound/posts/:id/comments`  | **5**   | Same                                        |
| `POST /v1/outbound/follows/member`      | **5**   | Same                                        |
| `POST /v1/outbound/follows/company`     | **5**   | Same                                        |
| `POST /v1/outbound/posts/:id/save`      | **2**   | Self-state change                           |
| Empty response                          | **0**   | Zero rows are never charged                 |

These are list prices; Scale-tier customers get custom bands. The
`meta.credits_charged` field on every response is authoritative — read
it instead of hardcoding.

## Why "flat per request" [#why-flat-per-request]

Per-result billing breaks two things you actually want:

1. **Predictable cost in agent loops.** An agent that runs a search
   and iterates through 50 hits should pay the same as one that gives
   up after 5 — otherwise your bill swings on the model's reasoning
   step.
2. **Honest cache pricing.** Cache hits cost the same as cache misses,
   because if cache hits were cheaper, the incentive is to depend on
   stale data. The right answer is to charge once and let you cache
   *yourself* if you don't need fresh.

## Empty rows are free [#empty-rows-are-free]

If a profile URL resolves to no data, or a search returns zero hits,
we don't charge. This is contractual — if you're getting charged for
404s, email [info@linkfetch.io](mailto:info@linkfetch.io) and we'll
refund plus double the difference.

## How credits are debited [#how-credits-are-debited]

Per-request, atomically, in a Postgres transaction alongside the cache
write. The response includes:

* `meta.credits_charged` — the integer cost of this call
* `X-Credits-Remaining` header — your balance after the call
* A row in `credit_ledger` — visible on the [usage page](/usage)

Insufficient balance returns `402 insufficient_credits` with a link to
top up; we never silently overdraft.

## Tiers [#tiers]

| Tier        | Price  | What you get                                                        |
| ----------- | ------ | ------------------------------------------------------------------- |
| **Free**    | $0     | $5 credit (≈1,000 jobs lookups), 1 req/sec, community support       |
| **Starter** | $29/mo | \~6,000 lookups, 10 req/sec, email support                          |
| **Pro**     | $99/mo | \~25,000 lookups, 50 req/sec, priority support, GDPR + CCPA posture |
| **Scale**   | Custom | Custom throughput, private MCP cluster, DPA, SSO, invoice           |

Full table at [linkfetch.io/#pricing](/#pricing).

## Jobs dataset (flat price, no credits) [#jobs-dataset-flat-price-no-credits]

The index behind `/v1/jobs` is also sold outright for teams that want
bulk access without a meter:

* **Snapshot** — $199 one-time. Every public posting since April 2026
  (8M+ rows, 218 regions) as a PostgreSQL dump, CSV and JSONL, built
  fresh at purchase. Includes `job_applicant_history`.
* **Live access** — $49/mo. Read-only Postgres role on a replica
  refreshed nightly; unlimited queries.
* **Free sample** — 1,000 rows with the full schema at
  [/linkedin-jobs-sample-1000.json](/linkedin-jobs-sample-1000.json).

Details at [linkfetch.io/linkedin-jobs-data](/linkedin-jobs-data).
There is no webhook or push-delivery product today.

## Billing [#billing]

API credits and plans are processed by Paddle as Merchant of Record;
dataset purchases are processed by Dodo Payments. Upgrade, downgrade, or cancel any time on the
[billing page](/billing). Refunds on cancellation are pro-rated to the
day.

## What to read next [#what-to-read-next]

<Cards>
  <Card title="Rate limits" href="/docs/rate-limits" description="Per-tier limits, headers, retries." />

  <Card title="Errors" href="/docs/errors" description="When calls fail, what to do." />

  <Card title="Provenance" href="/docs/provenance" description="What ships on every row." />
</Cards>
