---
title: "Your API keys and what each may do. Never the keys themselves."
method: GET
path: "/v1/keys"
tags: ["keys"]
---

# Your API keys and what each may do. Never the keys themselves.

`GET /v1/keys`

## Request

- Base URL: `https://api.hookdetector.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.hookdetector.com/v1/keys`
- Auth: none declared

Every key not revoked: in keys, key_id, name, prefix, created_at, last_used_at
(updated at most every 5 minutes) and current (true for the key making this call); in
access, per key_id, its scopes, credit_limit, credits_used (what runs started with it
spent), expires_at and expired. scopes is the calling key's. The signup key is key_id
"original". A key itself is never shown again. Needs admin. MCP: list_keys.

## Headers

- `authorization` string, nullable: Bearer hd_... from POST /v1/accounts or POST /v1/keys

## Response `200`

Successful Response

- KeyList
  - `keys` KeyOut[], required
    - `key_id` string, required
    - `name` string, required
    - `prefix` string, required
    - `created_at` string, required
    - `last_used_at` string, nullable, required
    - `current` boolean, required
  - `scopes` string[], required: what the key making this call may do
  - `access` object, required: per key_id: its scopes, cap, spend and expiry

## Other responses

- `401`: missing, invalid, revoked or expired API key (code key_expired)
- `403`: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
- `413`: request body over the size cap
- `422`: invalid input
- `500`: our fault; names the request id

---

[API](https://skmtc.dev/hookdetector/apis/hook-detector.md) · [All operations](https://skmtc.dev/hookdetector/apis/hook-detector/llms.txt) · [OpenAPI document](https://skmtc.dev/hookdetector/apis/hook-detector/revisions/b136a2804d2b?raw)
