# idempotency_outcome_unknown

- HTTP status: 409
- Retry: No
- Execution: may have started
- Admin needed: no

**Outcome of the earlier request unknown.** The first request with this key was interrupted before its result was recorded. It may or may not have taken effect, so the API refuses to run it a second time under the same key. What is stored: the unfinished claim. For 24 hours from the first attempt, every request with this key answers this same error; after that the key is free again. A `POST /v1/calls` sent WITHOUT a key can also get this answer when the call may have started but could not be confirmed: nothing is stored then, and a retry places another call.

## What it means

The API returns HTTP 409 with `error.code` set to `idempotency_outcome_unknown`. The default message is: "An earlier request with this Idempotency-Key did not finish, and its outcome is unknown."

## Common causes

- The earlier request was interrupted by a server restart or a lost connection mid-operation.

## How to identify it

Check the response status (`409`) and `error.code` (`idempotency_outcome_unknown`). Branch on `error.code`, not on the message text: messages can be reworded, codes do not change within v1. Log `error.request_id` (also sent as the `X-Request-Id` header) so support can find the request.

## How to fix it

- List or retrieve the resource (for a call, list calls filtered by `to` and `created_after`) to see whether the operation took effect.
- Only if it did not, send the operation again (with a NEW key if you use keys).

## Retry guidance

Do not resend yet. First find out whether the operation took effect (see How to fix it), then act on what you find.

## Did anything happen?

The work may have started before this error was returned. Do not assume nothing happened: read the resource (for a call, list calls filtered by `to` and `created_after`; for a campaign, retrieve it) before you send anything again. A charge may have been recorded for work that started; check the call or campaign before you act.

## Idempotency

If you sent a key: keep the SAME key for any retry; for 24 hours from the first attempt it answers this same error, so it can never run the request twice. Never send the request with a new key (or without one) until you know it did not happen. If you sent no key, nothing protects a retry: it runs the request again. Either way, learn the outcome first: GET the resource, or list by `to` or your `metadata`; only if it did not happen, send it again.

## Who can fix it

The developer who sends the request can fix it; no administrator action is normally needed.

## When to contact support

If the state you read is still ambiguous after a few minutes, write to [support@relationsai.com](mailto:support@relationsai.com) with the request_id. See [Support](/resources/support) for what to include (the `request_id`, the time in UTC, the operation, and whether you used a test or live key) and what never to send (API keys, Authorization headers, webhook signing secrets, recording links, transcripts or customer data).

## Example error response

```json
{
  "error": {
    "code": "idempotency_outcome_unknown",
    "message": "An earlier request with this Idempotency-Key did not finish, and its outcome is unknown.",
    "details": {},
    "request_id": "req_ai4vrzgioj36wznhcobglbkh",
    "retry": "no",
    "doc_url": "https://docs.relationsai.com/errors/idempotency_outcome_unknown"
  }
}
```

## Operations that can return this error

- [`POST /calls`](/api/calls#place-a-call): Place a call
- [`POST /campaigns`](/api/campaigns#create-a-campaign): Create a campaign
- [`POST /campaigns/{campaign_id}/recipients`](/api/campaigns#add-recipients): Add recipients
- [`POST /campaigns/{campaign_id}/start`](/api/campaigns#start-a-campaign): Start a campaign
- [`POST /campaigns/{campaign_id}/pause`](/api/campaigns#pause-a-campaign): Pause a campaign
- [`POST /campaigns/{campaign_id}/resume`](/api/campaigns#resume-a-campaign): Resume a campaign
- [`POST /campaigns/{campaign_id}/stop`](/api/campaigns#stop-a-campaign): Stop a campaign
- [`POST /contacts`](/api/contacts#create-a-contact): Create a contact
- [`POST /contacts/upsert`](/api/contacts#create-or-update-a-contact-by-phone-number): Create or update a contact by phone number
- [`DELETE /contacts/{contact_id}`](/api/contacts#delete-a-contact): Delete a contact
- [`POST /dnc-entries`](/api/do-not-call-list#add-a-number-to-the-do-not-call-list): Add a number to the do-not-call list
- [`DELETE /dnc-entries/{dnc_entry_id}`](/api/do-not-call-list#remove-a-number-from-the-do-not-call-list): Remove a number from the do-not-call list
- [`POST /webhook-endpoints`](/api/webhook-endpoints#create-a-webhook-endpoint): Create a webhook endpoint
- [`DELETE /webhook-endpoints/{webhook_endpoint_id}`](/api/webhook-endpoints#delete-a-webhook-endpoint): Delete a webhook endpoint
- [`POST /webhook-endpoints/{webhook_endpoint_id}/rotate-secret`](/api/webhook-endpoints#rotate-a-webhook-signing-secret): Rotate a webhook signing secret
- [`POST /webhook-endpoints/{webhook_endpoint_id}/test`](/api/webhook-endpoints#send-a-test-event): Send a test event
- [`POST /webhook-deliveries/{webhook_delivery_id}/retry`](/api/webhook-endpoints#retry-a-delivery): Retry a delivery

See all codes in the [error-code reference](/fundamentals/error-codes).
