> ## Documentation Index
> Fetch the complete documentation index at: https://docs.primevault.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a Blockchain Contact

> Save a blockchain address as a contact. The contact needs your API user's approval before it takes effect.

**POST** `/api/external/contacts/`

## Request body

<ParamField body="name" type="string" required>
  Contact display name.
</ParamField>

<ParamField body="subOrgId" type="string">
  Sub-org that owns the contact.
</ParamField>

<ParamField body="address" type="string" required>
  Destination address on the selected chain.
</ParamField>

<ParamField body="blockChain" type="string" required>
  REST field. The SDK accepts this as `chain`.
</ParamField>

<ParamField body="tags" type="string[]">
  Searchable contact tags.
</ParamField>

<ParamField body="externalId" type="string">
  Client-controlled reference.
</ParamField>

<ParamField body="assetList" type="string[]">
  Assets permitted for the contact. The SDK serializes an omitted value as an empty array.
</ParamField>

<ParamField body="contactGroupIds" type="string[]">
  Organization-scoped contact groups to attach.
</ParamField>

## Response

Returns the new [Contact](/api-basics/data-models#contact) with `status: "PENDING"`.

<ResponseField name="id" type="string">
  Contact ID.
</ResponseField>

<ResponseField name="orgId" type="string">
  Organization that owns the contact.
</ResponseField>

<ResponseField name="subOrgId" type="string">
  [Sub-org](/sub-orgs/overview) that owns the contact, if any.
</ResponseField>

<ResponseField name="name" type="string">
  Contact display name.
</ResponseField>

<ResponseField name="blockChain" type="string">
  Chain of the address.
</ResponseField>

<ResponseField name="address" type="string">
  Blockchain address.
</ResponseField>

<ResponseField name="status" type="ContactStatus">
  `PENDING`, `APPROVED`, or `DECLINED`. A new contact stays `PENDING` until it's [approved](/approvals/overview). See [ContactStatus](/api-basics/data-models#contactstatus).
</ResponseField>

<ResponseField name="isSmartContractAddress" type="boolean">
  Whether the address is a smart contract.
</ResponseField>

<ResponseField name="tags" type="string[]">
  Searchable contact tags.
</ResponseField>

<ResponseField name="createdById" type="string">
  User or API user that created the contact.
</ResponseField>

<ResponseField name="isSanctioned" type="boolean">
  Whether the address is flagged by sanctions screening.
</ResponseField>

<ResponseField name="externalId" type="string">
  Your own reference, if you set one.
</ResponseField>

<ResponseField name="assetList" type="string[]">
  Assets permitted for the contact.
</ResponseField>

<ResponseField name="createdAt" type="string">
  Creation timestamp (ISO 8601).
</ResponseField>

<ResponseField name="updatedAt" type="string">
  Last update timestamp (ISO 8601).
</ResponseField>

<ResponseField name="isDeleted" type="boolean">
  Whether the contact is deleted.
</ResponseField>

## Approve the contact

A new contact comes back with `status: "PENDING"` and needs your API user's approval. Call [Get Approval Message](/approvals/get-approval-message) with `entityId` set to the contact `id`, sign the `message`, and send the signature to [Submit Approval Action](/approvals/submit-approval-action). See [Approvals](/approvals/overview) for the full flow.

With the SDK, approve separately or in one call:

```typescript theme={null}
const contact = await apiClient.createContact(request);
const approvedContact = await apiClient.createContactApproval(contact);

// Convenience helper: create, then approve.
const approved = await apiClient.createContactWithApproval(request);
```

<RequestExample dropdown>
  ```json REST request body theme={null}
  {
    "name": "Operations Wallet",
    "subOrgId": "sub_org_123",
    "address": "0xAbC123...",
    "blockChain": "ETHEREUM",
    "tags": ["vendor", "priority"],
    "externalId": "vendor-1001",
    "assetList": ["USDC", "ETH"],
    "contactGroupIds": ["contact_group_123"]
  }
  ```

  ```bash cURL theme={null}
  # Sample only. Generate a new signed token for each request
  # (see Authentication). Tokens expire after 120 seconds.
  curl --request POST \
    --url "https://api.primevault.com/api/external/contacts/" \
    --header "Authorization: Bearer <signed JWT>" \
    --header "Api-Key: <API key>" \
    --header "Content-Type: application/json" \
    --data '{
      "name": "Operations Wallet",
      "subOrgId": "sub_org_123",
      "address": "0xAbC123...",
      "blockChain": "ETHEREUM",
      "tags": ["vendor", "priority"],
      "externalId": "vendor-1001",
      "assetList": ["USDC", "ETH"],
      "contactGroupIds": ["contact_group_123"]
    }'
  ```

  ```typescript JavaScript SDK theme={null}
  interface CreateContactRequest {
    name: string;
    subOrgId?: string;
    address: string;
    chain: string;
    tags?: string[];
    externalId?: string;
    assetList?: string[];
    contactGroupIds?: string[];
  }

  createContact(request: CreateContactRequest): Promise<Contact>
  ```
</RequestExample>

<ResponseExample dropdown>
  ```json Response example theme={null}
  {
    "id": "contact_123",
    "orgId": "org_456",
    "subOrgId": "sub_org_123",
    "name": "Operations Wallet",
    "blockChain": "ETHEREUM",
    "address": "0xAbC123...",
    "status": "PENDING",
    "tags": ["vendor", "priority"],
    "createdById": "api_user_123",
    "externalId": "vendor-1001",
    "assetList": ["USDC", "ETH"],
    "createdAt": "2026-08-04T10:30:00Z",
    "updatedAt": "2026-08-04T10:30:00Z",
    "isDeleted": false
  }
  ```

  ```typescript JavaScript SDK theme={null}
  interface Contact {
    id: string;
    orgId: string;
    subOrgId?: string;
    name: string;
    blockChain: string;
    address: string;
    status: ContactStatus;
    isSmartContractAddress: boolean;
    tags?: string[];
    createdById: string;
    isSanctioned: boolean;
    externalId?: string;
    createdAt: string;
    updatedAt: string;
    isDeleted: boolean;
    assetList?: string[];
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.