# `X402.Extensions.SIWX.Storage`
[🔗](https://github.com/cardotrejos/x402/blob/v0.9.0/lib/x402/extensions/siwx/storage.ex#L1)

Behaviour for storing SIWX access records.

Storage adapters persist wallet access grants keyed by `{address, resource}`.

# `access_record`

```elixir
@type access_record() :: %{payment_proof: term(), expires_at_ms: non_neg_integer()}
```

Stored access record for a wallet/resource pair.

# `delete`

```elixir
@callback delete(address :: String.t(), resource :: String.t()) :: :ok
```

Deletes an access record by wallet address and resource identifier.

# `get`

```elixir
@callback get(address :: String.t(), resource :: String.t()) ::
  {:ok, access_record()} | {:error, :not_found}
```

Fetches an access record by wallet address and resource identifier.

# `put`

```elixir
@callback put(
  address :: String.t(),
  resource :: String.t(),
  payment_proof :: term(),
  ttl_ms :: non_neg_integer()
) :: :ok | {:error, term()}
```

Stores an access record for a wallet/resource pair with a TTL in milliseconds.

# `validate_module`
*since 0.3.0* 

```elixir
@spec validate_module(term()) :: {:ok, module()} | {:error, String.t()}
```

Validates that a value is a module implementing `X402.Extensions.SIWX.Storage`.

This function is intended for `NimbleOptions` custom validation.

---

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