---
title: "Add a treasury contact"
method: POST
path: "/v1/multisig-wallets/{walletId}/contacts"
tags: ["Multisig Wallets"]
---

# Add a treasury contact

`POST /v1/multisig-wallets/{walletId}/contacts`

## Request

- Base URL: `https://api.prod.keyban.io`
- URL: `https://api.prod.keyban.io/v1/multisig-wallets/{walletId}/contacts`
- Auth: one of:
  - API key in header `X-Api-Key`
  - `bearer` (a scheme the document does not define)

Name a destination so the treasury can transfer to it. Reserved to a signer holding an active key here: naming an address is the durable trust decision, where a transfer is only a proposal that the signature threshold still gates. The address is stored lowercase, and a mixed-case input has its EIP-55 checksum verified — a hand-retyped address fails it. It cannot be changed afterwards: archive the contact and add a new one, which is what puts "never used" back in front of the signers.

## Path parameters

- `walletId` string, uuid, required

## Request body

- CreateMultisigContactDto
  - `label` string, required: Name to give this destination.
  - `address` string, required: Destination address, 0x-prefixed 20 bytes. Stored lowercase; a mixed-case input has its EIP-55 checksum verified on the way in.

## Response `201`

Contact added

- MultisigContactDtoOutput
  - `id` string, uuid, required: Entity UUID
  - `createdAt` string, date-time, required: Creation date (ISO 8601)
  - `updatedAt` string, date-time, required: Last update date (ISO 8601)
  - `label` string, required: Name a signer gave this destination. What one picks in the transfer form, and what the signer app shows instead of a bare address.
  - `address` string, required: Destination address, 0x-prefixed 20 bytes. Stored lowercase; a mixed-case input has its EIP-55 checksum verified on the way in.
  - `archivedAt` string, date-time, nullable, required: When the contact was retired. An archived contact can no longer receive a transfer, but still names the past transfers that went to it. Null while it stands.
  - `lastUsedAt` string, date-time, nullable, required: When a transfer to this contact last EXECUTED — never when one was merely opened, so a cancelled transfer does not make an address look familiar. Null means never used, which the signer app calls out.

## Other responses

- `403`: Session-authenticated signer of this treasury required
- `404`: Multisig wallet not found
- `409`: A live contact already holds this address
- `422`: Malformed address, failed checksum, zero address, or the treasury own address

---

[API](https://skmtc.dev/keyban/apis/keyban-rest-apis.md) · [All operations](https://skmtc.dev/keyban/apis/keyban-rest-apis/llms.txt) · [OpenAPI document](https://skmtc.dev/keyban/apis/keyban-rest-apis/revisions/0bb79a1da961?raw)
