---
title: "Issue a free-tier API key"
method: POST
path: "/v1/keys"
tags: ["Keys"]
---

# Issue a free-tier API key

`POST /v1/keys`

## Request

- Base URL: `https://api.attestwire.com`
- URL: `https://api.attestwire.com/v1/keys`
- Auth: none required

No authentication. One free key per email address — the plaintext key is returned exactly once and is not recoverable afterwards. Send YOUR address: whatever you post here is claimed permanently (we keep only its hash, so it can never be re-issued), and the example below is a placeholder on the reserved `.example` TLD, not an address to send as-is.

## Request body

- object
  - `email` string, email, required

## Response `201`

Key created. Store `key` now; it is never shown again.

- object
  - `key` string, required
  - `tier` 'free' | 'solo' | 'starter' | 'scale', required
  - `monthly_limit` integer, required
  - `created` string, date-time, required
  - `warning` string, required

## Other responses

- `400`: Missing or malformed email address (`invalid_email`), or a body that is not a JSON object (`bad_request`). Checked BEFORE the per-IP limiter, so a typo does not spend one of your five daily signups.
- `409`: A free key already exists for this email address, and we store only its hash — it cannot be shown again. If you still hold it, replace it with POST /v1/keys/rotate.
- `413`: The request body is over 1 MB. Nothing was read and nothing was charged.
- `429`: Too many key requests from this IP address today.
- `500`: Unhandled fault while issuing the key. Never expected; the body carries no detail on purpose (a fault message can quote the offending value). Retry, and email hello@attestwire.com if it persists.

---

[API](https://skmtc.dev/attestwire/apis/attestwire-api.md) · [All operations](https://skmtc.dev/attestwire/apis/attestwire-api/llms.txt) · [OpenAPI document](https://skmtc.dev/attestwire/apis/attestwire-api/revisions/0036f8e043b2?raw)
