# `Tipalti.Error`
[🔗](https://github.com/iamkanishka/tipalti/blob/main/lib/tipalti/error.ex#L1)

Base exception raised by every `!` function in this package and returned
(unraised, as the error element of an `{:error, exception}` tuple) by
every non-bang function.

Every module below implements the `Exception` behaviour and shares this
base set of fields:

  * `:message` — human-readable summary.
  * `:reason` — a machine-matchable atom, stable across releases.

## Hierarchy

  * `Tipalti.Error` — generic/unclassified failure.
  * `Tipalti.AuthenticationError` — bad/expired/missing credentials.
  * `Tipalti.ValidationError` — the request was rejected before hitting
    the wire, or the API rejected it as malformed (HTTP 400/422 or a SOAP
    fault whose code indicates bad input).
  * `Tipalti.APIError` — the API returned a well-formed error response
    (any other 4xx/5xx, or a SOAP fault).
  * `Tipalti.RateLimitError` — HTTP 429 or a Procurement API rate-limit
    rejection; carries `:retry_after` in milliseconds when known.
  * `Tipalti.NetworkError` — transport-level failure (timeout, connection
    refused, TLS failure, etc.) after retries were exhausted.
  * `Tipalti.SOAPFaultError` — a parsed `<soap:Fault>` from the legacy API.

# `t`

```elixir
@type t() :: %Tipalti.Error{__exception__: true, message: String.t(), reason: atom()}
```

---

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