# `IdempotencyKit.Core`
[🔗](https://github.com/metacircu1ar/idempotency_kit/blob/main/lib/idempotency_kit/core.ex#L1)

Backend-agnostic idempotency flow helpers.

# `claim_for_payload`

```elixir
@spec claim_for_payload(module(), integer(), String.t(), String.t(), term()) ::
  IdempotencyKit.Store.claim_result()
```

Convenience helper that hashes payload and then delegates to `claim_request/5`.

Useful for callers that prefer a single-step API.

# `claim_request`

```elixir
@spec claim_request(module(), integer(), String.t(), String.t(), String.t()) ::
  IdempotencyKit.Store.claim_result()
```

# `complete_request`

```elixir
@spec complete_request(module(), term(), String.t(), pos_integer(), map()) ::
  {:ok, term()} | {:error, :idempotency_unavailable}
```

# `purge_stale_requests`

```elixir
@spec purge_stale_requests(module()) :: {non_neg_integer(), nil | [term()]}
```

# `replay_candidate?`

```elixir
@spec replay_candidate?(module(), integer(), String.t(), String.t(), term()) ::
  boolean()
```

Delegate an exact-retry pre-check to the configured store.

Returns `true` when the store already has a record for the same
`(user_id, scope, idempotency_key)` and equivalent payload hash.

# `request_hash`

```elixir
@spec request_hash(module(), term()) :: String.t()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
