---
title: "Prepare the acceptance of a received contact request"
method: POST
path: "/contact-requests/accept/prepare"
tags: ["Contacts"]
---

# Prepare the acceptance of a received contact request

`POST /contact-requests/accept/prepare`

## Request

- Base URL: `https://api.primitive.dev/v1`
- URL: `https://api.primitive.dev/v1/contact-requests/accept/prepare`
- Auth: HTTP bearer

Validates a received contact request (authenticated sender, valid unexpired primitive.contact/1 request, delivered to you) and returns the POST /send-mail call that accepts it, threaded to the request and addressed to its authenticated sender (never to a Reply-To). Nothing is sent and no contact preference changes. Preparing twice returns the same message and Idempotency-Key.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `email_id` string, uuid, required: The received contact request email.

## Response `200`

Success

- object
  - `success` true, required
  - `data` object, required
    - `request` object, required: Identity of the prepared step. Keep interaction_id, step_id and expires_at to match a later acceptance.
      - `interaction_id` string
      - `step_id` string, uuid
      - `prev_step_id` string, uuid, nullable
      - `expires_at` string, date-time
    - `send` object, required: The exact request to make next, unchanged: method, path, headers (including Idempotency-Key) and JSON body.
      - `method` 'POST'
      - `path` string
      - `headers` object
      - `body` object

## Other responses

- `400`: Invalid request parameters
- `401`: Invalid or missing API key
- `403`: Authenticated caller lacks permission for the operation
- `404`: Resource not found
- `409`: The email is still being processed; retry shortly.
- `422`: Not a valid, unexpired contact request from an authenticated sender.
- `429`: Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.

## Changes

> 32 revisions in range; 1 not diffed.

- **2026-11-03** `bce409c97acb`: 217 warning
  - added the new `access_mode_unavailable` enum value to the `error/code` response property for the response status `400`
  - added the new `access_mode_unavailable` enum value to the `error/code` response property for the response status `401`
  - added the new `access_mode_unavailable` enum value to the `error/code` response property for the response status `403`
  - added the new `access_mode_unavailable` enum value to the `error/code` response property for the response status `404`
  - …213 more
  - …this revision’s changelog is incomplete
- **2026-10-21** `0360ea8d4f3d`: 91 warning
  - added the new `agent_changed` enum value to the `error/code` response property for the response status `400`
  - added the new `agent_changed` enum value to the `error/code` response property for the response status `401`
  - added the new `agent_changed` enum value to the `error/code` response property for the response status `403`
  - added the new `agent_changed` enum value to the `error/code` response property for the response status `404`
  - …87 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/primitive/apis/primitive-api/changes/contact-requests/accept/prepare/post.md)

---

[API](https://skmtc.dev/primitive/apis/primitive-api.md) - [All operations](https://skmtc.dev/primitive/apis/primitive-api/llms.txt) - [OpenAPI document](https://skmtc.dev/primitive/apis/primitive-api/revisions/bce409c97acb?raw)
