---
title: "Provision a signing key for a chain"
method: POST
path: "/v1/agents/{agent_id}/signing-keys"
tags: ["Signing Keys"]
---

# Provision a signing key for a chain

`POST /v1/agents/{agent_id}/signing-keys`

## Request

- Base URL: `https://api.1claw.co`
- URL: `https://api.1claw.co/v1/agents/{agent_id}/signing-keys`
- Auth: HTTP bearer

## Path parameters

- `agent_id` string, uuid, required

## Request body

- CreateSigningKeyRequest
  - `chain` 'ethereum' | 'bitcoin' | 'solana' | 'xrp' | 'cardano' | 'tron' | 'midnight', required: `midnight` is Preprod-only and requires the midnight-signer sidecar. Note it can be provisioned but not rotated or imported: derivation happens in the sidecar, so there is no local keygen and no raw private key to import. Both of those endpoints refuse it before consuming an approval.

## Response `201`

Signing key created

- SigningKeyResponse
  - `id` string, uuid
  - `agent_id` string, uuid
  - `chain` string
  - `curve` string
  - `public_key` string
  - `address` string, nullable
  - `key_version` integer
  - `is_active` boolean
  - `created_at` string, date-time
  - `rotated_at` string, date-time, nullable
  - `custody` 'server' | 'client_tss': `server` — 1claw holds the whole private key and can sign alone. `client_tss` — 2-of-3 threshold key; its human owner holds shares 2 and 3.
  - `owner_user_id` string, uuid: `client_tss` only: the human who can back up, provision and restore the key.
  - `backup` object: `client_tss` only (list): the key's backup state, as on treasury wallets.

## Other responses

- `400`: Invalid request
- `409`: Resource already exists or conflict

---

[API](https://skmtc.dev/1claw/apis/1claw-api.md) · [All operations](https://skmtc.dev/1claw/apis/1claw-api/llms.txt) · [OpenAPI document](https://skmtc.dev/1claw/apis/1claw-api/revisions/5fa0918f3b41?raw)
