# `AshBilling.Provider`
[🔗](https://github.com/sfelixalejandro/ash_billing/blob/v0.1.3/lib/ash_billing/provider.ex#L1)

Defines the behavior for billing providers (Stripe, Paddle, LemonSqueezy, etc.).

# `customer_id`

```elixir
@type customer_id() :: String.t()
```

# `opts`

```elixir
@type opts() :: keyword()
```

# `session_id`

```elixir
@type session_id() :: String.t()
```

# `session_url`

```elixir
@type session_url() :: String.t()
```

# `subscription_id`

```elixir
@type subscription_id() :: String.t()
```

# `cancel_subscription`

```elixir
@callback cancel_subscription(subscription_id(), opts :: opts()) ::
  {:ok, map()} | {:error, term()}
```

Cancels a subscription in the billing provider.

# `create_checkout_session`

```elixir
@callback create_checkout_session(params :: map(), opts :: opts()) ::
  {:ok, %{url: session_url(), id: session_id()}} | {:error, term()}
```

Creates a checkout session for subscriptions or one-time payments.

# `create_customer`

```elixir
@callback create_customer(params :: map(), opts :: opts()) ::
  {:ok, customer_id()} | {:error, term()}
```

Creates a customer in the billing provider.

# `create_portal_session`

```elixir
@callback create_portal_session(params :: map(), opts :: opts()) ::
  {:ok, %{url: session_url()}} | {:error, term()}
```

Creates a billing portal session where customers can manage their payment methods and subscriptions.

# `get_subscription`

```elixir
@callback get_subscription(subscription_id(), opts :: opts()) ::
  {:ok, map()} | {:error, term()}
```

Retrieves a subscription from the billing provider.

# `resume_subscription`

```elixir
@callback resume_subscription(subscription_id(), opts :: opts()) ::
  {:ok, map()} | {:error, term()}
```

Resumes a subscription that was scheduled to cancel at period end.

# `swap_plan`

```elixir
@callback swap_plan(subscription_id(), new_price_id :: String.t(), opts :: opts()) ::
  {:ok, map()} | {:error, term()}
```

Swaps an active subscription to a new price/plan, with optional proration behavior.

# `verify_webhook`

```elixir
@callback verify_webhook(
  payload :: binary(),
  signature_header :: String.t() | nil,
  secret :: String.t(),
  opts :: opts()
) :: {:ok, map()} | {:error, term()}
```

Verifies an incoming webhook payload and signature.
Returns `{:ok, event_map}` if valid, or `{:error, reason}` if invalid.

---

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