# Credits

The rate for every endpoint, and why a not-found target (422) is billed everywhere.

## How billing works

Up2Data charges by credit, one currency for every operation. Every successful response carries a `meta` block reporting exactly what that call cost; an error response skips `meta` and returns just `{"error": {"type", "message", "requestId"}}` instead, but a `requestId` is there either way:

```json
"meta": {
  "creditsUsed": 1,
  "creditsRemaining": 98420,
  "billed": true,
  "reason": "profile_found",
  "requestId": "req_8f2ka91x"
}
```

## Rates

| Endpoint | Rate |
|---|---|
| [`POST /v1/profiles/enrich`](https://up2data.ai/docs/v1/api/profiles-enrich/) | 1 credit, or 4 credits with `with_followers_and_connections`, `with_full_skills_and_endorsements`, or by listing `followers_count`, `connections_count`, or `skill_endorsements` in `fields` (none of these stack) |
| [`POST /v1/companies/enrich`](https://up2data.ai/docs/v1/api/companies-enrich/) | 1 credit |
| [`POST /v1/companies/jobs-count`](https://up2data.ai/docs/v1/api/companies-jobs-count/) | 1 credit |
| [`POST /v1/companies/posts`](https://up2data.ai/docs/v1/api/companies-posts/) | 1 credit per returned post; empty pages are free |
| [`POST /v1/companies/headcount`](https://up2data.ai/docs/v1/api/companies-headcount/) | 1 credit |
| [`POST /v1/posts/enrich`](https://up2data.ai/docs/v1/api/posts-enrich/) | 1 credit |
| [`POST /v1/jobs/enrich`](https://up2data.ai/docs/v1/api/jobs-enrich/) | 1 credit |
| [`POST /v1/posts/engagement/comments`](https://up2data.ai/docs/v1/api/posts-engagement-comments/) | 1 credit per returned comment; empty pages are free |
| [`POST /v1/posts/engagement/reactions`](https://up2data.ai/docs/v1/api/posts-engagement-reactions/) | 1 credit per returned reaction; empty pages are free |
| [`POST /v1/posts/engagement/reposts`](https://up2data.ai/docs/v1/api/posts-engagement-reposts/) | 1 credit per returned repost; empty pages are free |
| [`POST /v1/profiles/activity`](https://up2data.ai/docs/v1/api/profiles-activity/) | 2 credits per call (one `kind` per call) |
| [`POST /v1/profiles/recommendations`](https://up2data.ai/docs/v1/api/profiles-recommendations/) | 1 credit per non-empty direction (`both` is up to 2); empty results are free |
| [`POST /v1/profiles/interests`](https://up2data.ai/docs/v1/api/profiles-interests/) | 1 credit per non-empty category (`all` is up to 5); empty results are free |
| [`POST /v1/search/people`](https://up2data.ai/docs/v1/api/search-people/), [`POST /v1/search/people/sales-nav`](https://up2data.ai/docs/v1/api/search-people-sales-nav/), [`POST /v1/search/people/standard`](https://up2data.ai/docs/v1/api/search-people-standard/) | 1 credit per page of up to 25 results; empty pages are free |
| [`POST /v1/search/companies`](https://up2data.ai/docs/v1/api/search-companies/), [`POST /v1/search/companies/sales-nav`](https://up2data.ai/docs/v1/api/search-companies-sales-nav/), [`POST /v1/search/companies/standard`](https://up2data.ai/docs/v1/api/search-companies-standard/) | 1 credit per page of up to 25 results; empty pages are free |
| [`POST /v1/search/jobs`](https://up2data.ai/docs/v1/api/search-jobs/) | 1 credit per job returned; zero results are free |
| [`POST /v1/search/posts`](https://up2data.ai/docs/v1/api/search-posts/) | 1 credit per page of up to 25 posts; empty pages are free |
| [`POST /v1/batch`](https://up2data.ai/docs/v1/api/batch-create/) items | `profile`, `company`, `post`, and Sales Navigator search items: 1 credit each (search items reserve `max_results` credits, refunded for any shortfall) - never refunded for a failed item. Every other operation item reserves the worst case at submission, matching its own sync rate above, and refunds down to what it actually billed once its queue settles - see the [full table](https://up2data.ai/docs/v1/api/batch-create/) for exact numbers |
| [`GET /v1/batch/{job_id}`](https://up2data.ai/docs/v1/api/batch-get/), [`GET /v1/batch/{job_id}/results`](https://up2data.ai/docs/v1/api/batch-results/) | Free |
| [`GET /v1/account`](https://up2data.ai/docs/v1/api/account-get/) | Free |

## The billing rule

**A not-found target is billed everywhere.** Whenever Up2Data scrapes a target and finds it missing, private, deleted, or unreachable (422 `unprocessable_target`), that counts as billable work - on synchronous enrich ([`profiles/enrich`](https://up2data.ai/docs/v1/api/profiles-enrich/), [`companies/enrich`](https://up2data.ai/docs/v1/api/companies-enrich/), [`posts/enrich`](https://up2data.ai/docs/v1/api/posts-enrich/), [`jobs/enrich`](https://up2data.ai/docs/v1/api/jobs-enrich/)), on [`profiles/activity`](https://up2data.ai/docs/v1/api/profiles-activity/), on [`companies/jobs-count`](https://up2data.ai/docs/v1/api/companies-jobs-count/), [`companies/posts`](https://up2data.ai/docs/v1/api/companies-posts/) and [`companies/headcount`](https://up2data.ai/docs/v1/api/companies-headcount/) (1 credit), on the post engagement endpoints and on [`profiles/recommendations`](https://up2data.ai/docs/v1/api/profiles-recommendations/) and [`profiles/interests`](https://up2data.ai/docs/v1/api/profiles-interests/) (1 credit), on [`search/posts`](https://up2data.ai/docs/v1/api/search-posts/) when the `author_url` or `author_urn` profile is unreachable (1 credit), and on every batch item. Outside a batch job, only 400, 401, 402, 429, 500, and 504 are never billed.

This is deliberately stricter than a pure pay-on-success model: the scrape ran and returned an answer, so it's billed like a hit. Only requests that return no data because of our failure (500, 504) or were rejected before any work started (400, 401, 402, 429) are free.

> **Info:** A `POST /v1/batch` job reserves the worst case for every item at submission. A `profile`, `company`, `post`, or Sales Navigator search item never refunds for a failed item: a `422 unprocessable_target` item bills at its type's rate just like a successful one, and so does an item that fails with a retryable error like `500` or `504`. A Sales Navigator search item's unused `max_results` reservation is the only thing on those items that refunds, once that search runs. Every other operation item settles differently: it reserves the same worst case at submission, but refunds down to what it actually billed once its queue finishes, so a failed or empty item on those operations costs 0. See [Batch jobs](https://up2data.ai/docs/v1/guides/batch-jobs/).

See [Errors](https://up2data.ai/docs/v1/guides/errors/) for the complete status table and [Rate limits](https://up2data.ai/docs/v1/guides/rate-limits/) for what happens when you're throttled.

