# Free API for agents

> Detect and compare faces with no API key. Free to test under fair use; for regular use, sign up and use an API key.

Source: https://sightradar.com/docs/free-api

The two free tools on [sightradar.com/tools](https://sightradar.com/tools) are also a public HTTP API. AI agents, scripts and quick tests can call them **without a key**.

**Free to test under a fair-use policy.** For regular or production use, [sign up](https://sightradar.com/login?next=%2Fdashboard%2Fkeys) and use an API key: there is no free-tier cap on a key, and usage is billed per photo on prepaid credits ([pricing](https://sightradar.com/pricing)).

| Endpoint                                       | Body (`multipart/form-data`) | Result                                           |
| ---------------------------------------------- | ---------------------------- | ------------------------------------------------ |
| `POST https://sightradar.com/api/free/detect`  | `file`                       | faces found, quality-gated count, a box per face |
| `POST https://sightradar.com/api/free/compare` | `source`, `target`           | similarity 0 to 1, `match`, `threshold`          |

Images must be JPG, PNG or WebP, up to 10 MB each. They are processed in memory and never stored.

## Detect

```bash
curl -X POST https://sightradar.com/api/free/detect -F "file=@photo.jpg"
```

```json
{
  "data": {
    "detected_face_count": 1,
    "gated_face_count": 1,
    "faces": [
      { "det_score": 0.86, "min_px": 305.8, "quality_passed": true,
        "bbox": { "left": 0.29, "top": 0.19, "width": 0.38, "height": 0.53 } }
    ]
  },
  "usage": "Free to test under a fair-use policy. ..."
}
```

## Compare

```bash
curl -X POST https://sightradar.com/api/free/compare -F "source=@a.jpg" -F "target=@b.jpg"
```

```json
{
  "data": { "face_found": true, "similarity": 0.66, "match": true, "threshold": 0.42,
            "source_bbox": null, "target_bbox": null },
  "usage": "Free to test under a fair-use policy. ..."
}
```

When a photo holds several faces, the largest, most confident one is compared. Choose your own threshold for real decisions: see [Choosing a similarity threshold](/docs/guides/thresholds).

## When you reach the fair-use limit

The free API answers `429` with a pointer to an API key:

```json
{
  "error": "You have reached the free fair-use limit. Sign up at https://sightradar.com and use an API key to keep going; there is no free-tier cap on a key.",
  "code": "free_limit_reached",
  "signup_url": "https://sightradar.com/login?next=%2Fdashboard%2Fkeys",
  "paid_endpoint": "https://api.sightradar.com/v1/detect",
  "how_to_continue": "Sign up at https://sightradar.com, create an API key, then call POST https://api.sightradar.com/v1/detect with the header \"Authorization: Bearer <your-api-key>\" and the same multipart \"file\" field. Same result."
}
```

To keep going, [create an API key](/docs/authentication) and call the paid endpoints. Detect takes the same `file` upload:

```bash
curl -X POST https://api.sightradar.com/v1/detect \
  -H "Authorization: Bearer $SR_API_KEY" \
  -F "file=@photo.jpg"
```

Paid compare takes image URLs (`sourceUrl`, `targetUrl`) or precomputed embeddings. See [Compare two faces](/docs/api/faces/compare-two-faces) and [Detect faces](/docs/api/faces/detect-faces). Pricing is per photo processed: [pricing](https://sightradar.com/pricing).

## Errors

| Status        | `code`                  | Meaning                                                                  |
| ------------- | ----------------------- | ------------------------------------------------------------------------ |
| 400, 411, 415 | `bad_request`           | Missing field, no `Content-Length`, not multipart, or not a JPG/PNG/WebP |
| 413           | `too_large`             | Image over 10 MB                                                         |
| 422           | `unreadable`            | The image could not be decoded                                           |
| 429           | `rate_limited`          | More than a few requests a minute; wait `Retry-After` seconds            |
| 429           | `free_limit_reached`    | Free fair-use limit reached; sign up and use an API key                  |
| 429           | `free_capacity_reached` | The free API is at capacity right now; use an API key                    |
| 503           | `busy` / `unavailable`  | Try again shortly, or use an API key                                     |

Each endpoint also answers `GET` with a short JSON description of itself, so an agent that finds the URL can learn how to call it.
