# `Chimeway.Webhooks.Ingress`
[🔗](https://github.com/jonlunsford/chimeway/blob/v1.0.0/lib/chimeway/webhooks/ingress.ex#L1)

Durable inbound webhook fact: a verified provider callback has been received,
normalized, and queued for async processing. One ingress row per accepted
callback; duplicate provider retries with the same `(adapter_module,
provider_event_id)` collapse to the existing row via the partial unique index.

Ingress rows are NOT a payload archive (Phase 33 D-04). They store
explainability-first fields only — adapter identity, correlation keys,
normalized status, processing state, and (when applicable) an ignored reason.
Raw provider bodies and headers stay out of this surface by design.

Replay protection seam (Phase 33 D-05): the partial unique index on
`(adapter_module, provider_event_id) WHERE provider_event_id IS NOT NULL`
collapses duplicate provider retries that expose a stable event id.
Adapters without a stable event id get best-effort dedup only.

# `t`

```elixir
@type t() :: %Chimeway.Webhooks.Ingress{
  __meta__: term(),
  adapter_module: term(),
  delivery_id: term(),
  id: term(),
  ignored_reason: term(),
  ingress_state: term(),
  inserted_at: term(),
  normalized_status: term(),
  processed_at: term(),
  provider_event_id: term(),
  provider_message_id: term(),
  updated_at: term()
}
```

# `changeset`

---

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