---
title: "Register a payout address"
method: POST
path: "/x402/payout-addresses"
tags: ["Payments"]
---

# Register a payout address

`POST /x402/payout-addresses`

Register (or update) the default payout address your org receives x402
payments at, for a given network. You prove control of the address with
an org-bound `personal_sign` signature over the message produced by the
SDK helper `buildPayoutRegistrationMessage`. The org id is taken from your
authenticated key, never the body, so a captured signature can't register
an address under another org. Exactly one default address exists per
(org, network); registering again replaces it. A payee MUST register a
payout address before calling `createChallenge`, because the challenge's
`pay_to` is resolved from this directory.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `address` string, required — The payout address (your signer's own EVM address), 0x-prefixed.
  - `network` 'base' | 'base-sepolia', required — The chain the address receives on.
  - `signature` string, required — A `personal_sign` signature over the org-bound message produced by the SDK helper `buildPayoutRegistrationMessage`. Recovered and checked against `address`; the org id is bound into the signed bytes.
  - `issued_at` string, date-time, required — ISO-8601 timestamp embedded in the signed message. Must be within a short freshness window (about 10 minutes) of server time.
  - `label` string — Optional human-readable label.

## Response `201`

Payout address registered (or updated) and set as default

- object
  - `success` true, required
  - `data` object, required
    - `id` string, uuid, required
    - `address` string, required — The checksummed payout address.
    - `network` 'base' | 'base-sepolia', required
    - `label` string, nullable, required
    - `is_default` boolean, required — Exactly one address per (org, network) is the default.
    - `verified_at` string, date-time, required — When ownership of the address was last proven.
    - `created_at` string, date-time

## Other responses

- `400` — Invalid request parameters
- `401` — Invalid or missing API key
- `403` — Authenticated caller lacks permission for the operation
- `422` — The request was well-formed but could not be processed. For Payments this covers a missing payout address, a failed payment verification, a spend-policy decline, or an expired challenge; `error.code` distinguishes them.
- `429` — Rate limit exceeded

---

[API](https://skmtc.dev/primitive/apis/primitive-api.md) · [All operations](https://skmtc.dev/primitive/apis/primitive-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/primitive/primitive-api/revisions/c2299d28022c/schema)
