# POST /api/v1/idempotency-keys/:key/resolve

Auth: Bearer

HTML: https://cooperemail.com/docs/reference/resolve-idempotency-key

## Summary

Mark an unknown Idempotency-Key done and link a message the agent found. Requires message_send. Body is {message_id}. The id is a message, draft, phone number, or chat reply on the key's inbox. Later retries replay it. The done window is 24 hours from this call. A done key is HTTP 409 idempotency_key_done. A fresh in_progress key is HTTP 409 idempotency_request_in_progress. An unknown message is HTTP 404 message_not_found. A missing key is HTTP 404 idempotency_key_not_found. MCP: cooper_resolve_idempotency_key.

## Request

```json
{
  "message_id": "msg_…"
}
```

## Response

The OpenAPI document does not declare a JSON response schema for this call. The summary is the contract.

## Errors

- HTTP 409 idempotency_key_done
- HTTP 409 idempotency_request_in_progress
- HTTP 404 message_not_found
- HTTP 404 idempotency_key_not_found

The live `message` is the sentence for that code. Branch on `code`.

```json
{
  "error": {
    "type": "conflict",
    "code": "idempotency_key_done",
    "docs_url": "https://cooperemail.com/docs#idempotency_key_done"
  }
}
```

## Idempotency

Idempotency-Key is 1 to 256 characters of letters, digits, and - . _ ~. The same key and the same request within 24 hours returns the original response with HTTP 200 and Idempotent-Replayed: true. A different request is HTTP 409 idempotency_key_conflict. A second call while the first is running is HTTP 409 idempotency_request_in_progress. An empty or invalid key is HTTP 400 invalid_idempotency_key. A definitive refusal removes the key. An ambiguous failure keeps it and the same request returns HTTP 409 idempotency_outcome_unknown. client_id is checked first when both are set. Done keys expire after 24 hours. Unknown keys are kept for 7 days.
