# Upvera Value API

A read-only API for Upvera Value: every startup's value, its series, the receipt that explains each change, and the Upvera Index. Values come from the server exactly as they are shown on [app.upvera.co/value](https://app.upvera.co/value). Nothing in the API is a price quote or an offer.

```text
https://app.upvera.co/api/v1
```

## Quick start

```bash
curl -s https://app.upvera.co/api/v1/startups/upvera-mthgaif7 | jq '.data | {name, rank, value, changes}'
```

```bash
curl -s "https://app.upvera.co/api/v1/startups?window=7d" | jq '.data[0:3] | map({name, rank, value})'
```

## The envelope

Every response has the same shape, so one parser handles them all.

```json
{
  "v": "upvera/api/v1",
  "kind": "startup",
  "as_of": "2026-10-20T09:00:00Z",
  "state": "v3",
  "data": { }
}
```

| Field | Meaning |
|---|---|
| `v` | API version. Fields are only ever added; a breaking change ships as `/api/v2`. |
| `kind` | What `data` holds: `startups`, `startup`, `series`, `receipt`, `index`, `me` or `deliveries`. |
| `as_of` | When Upvera computed the numbers. |
| `state` | The value method in force: `v3` is Value Engine 3.0. |

Errors use `{ "v": "upvera/api/v1", "error": { "code", "message" } }` with one of `bad_request`, `unauthorized`, `plan_required`, `not_found`, `rate_limited` or `unavailable`.

## Without a key

Public reads need no key.

| | |
|---|---|
| Rate limit | 60 requests per minute per IP, with `X-RateLimit-*` headers. A `429` carries `Retry-After`. |
| Cache | `public, max-age=30, s-maxage=60, stale-while-revalidate=300`. Values move on an hourly grid. |
| CORS | Any origin, so you can call it from a browser. |

## With a key

Keys are part of the Scale plan. Create one in Upvera under **Connections › Value API**.

```bash
curl -s https://app.upvera.co/api/v1/me \
  -H "Authorization: Bearer $UPVERA_API_KEY"
```

- Keys start with `upv_live_`. Send them only in the `Authorization` header, only from your server. A key in the URL is rejected, and browsers cannot send the header.
- 600 requests per minute per key. Keyed responses are private and never shared-cached.
- Keys open `/api/v1/me` and `/api/v1/me/deliveries`, and webhooks.
- Rotate a key and the old one keeps working for 24 hours. Revoke it and it stops at once.

## Show numbers honestly

- Show the number Upvera returns. Never recompute a value or a percentage on your side.
- When you explain a change, use the receipt (`/startups/{slug}/receipt`): each row is one reason, with its exact integer in millionths.
- Link back to the startup's value page (`urls.value`) so readers can check it.

Every endpoint and field is on the [Reference](/api/reference/) page, and the machine-readable [OpenAPI document](/openapi.json) is the same source.

---
Source: https://upvera.dev/api/ · Markdown: https://upvera.dev/api.md
