# `TypeSafeAPISDK.Error`
[🔗](https://github.com/nshkrdotcom/typesafe_api_sdk/blob/v0.1.0/lib/typesafe_api_sdk/error.ex#L1)

Normalized errors from the TypeSafe API and its Pristine transport.

HTTP status mapping follows the TypeSafe client contract: 400, 401, 403, 404,
422, 429, and 5xx receive dedicated error types. Transport, cancellation, and
response-decoding failures remain distinct.

# `error_type`

```elixir
@type error_type() ::
  :invalid_request
  | :runtime_capability
  | :configuration
  | :bad_request
  | :authentication
  | :permission_denied
  | :not_found
  | :unprocessable_entity
  | :rate_limit
  | :internal_server
  | :api_error
  | :connection
  | :timeout
  | :cancelled
  | :response_validation
```

# `t`

```elixir
@type t() :: %TypeSafeAPISDK.Error{
  __exception__: true,
  body: term(),
  cause: term(),
  details: map(),
  endpoint: String.t() | nil,
  field_path: String.t() | nil,
  headers: map(),
  message: String.t(),
  path: [String.t()] | nil,
  raw_http_response: Pristine.Response.t() | nil,
  request_id: String.t() | nil,
  retry_after_ms: non_neg_integer() | nil,
  status: integer() | nil,
  type: error_type()
}
```

# `configuration`

```elixir
@spec configuration(String.t()) :: t()
```

# `extract_message`

```elixir
@spec extract_message(term()) :: String.t() | nil
```

# `invalid_request`

```elixir
@spec invalid_request([String.t()], String.t(), map()) :: t()
```

# `metadata`

```elixir
@spec metadata(t()) :: map()
```

# `parse_retry_after`

```elixir
@spec parse_retry_after(map() | list()) :: non_neg_integer() | nil
```

# `response_validation`

```elixir
@spec response_validation(String.t() | [String.t()], term()) :: t()
```

# `retry_after`

```elixir
@spec retry_after(t()) :: non_neg_integer() | nil
```

# `retryable?`

```elixir
@spec retryable?(t(), TypeSafeAPISDK.RetryPolicy.t() | false) :: boolean()
```

---

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