# Pricing

> Price a route in solana-pay-kit — a fixed dollar string or a per-request closure. There is no catalogue type; each route names its own price inline.

Unlike a catalogue-based SDK, `solana-pay-kit` takes the price **inline** at the gate. `paid_get` / `paid_post` accept anything that converts into a `Price`: a `&str` (or `String`) for a fixed amount, or `Price::dynamic` for a per-request closure.

## Fixed price

A dollar string converts straight into a price:

```rust
use solana_pay_kit::paid_get;

let app = Router::new()
    .route("/report", paid_get(report, "0.10", &pay))
    .route("/api/data", paid_get(api_data, "0.001", &pay));
```

## Per-request price

`Price::dynamic` takes a closure that sees the request (method, URI, headers) and returns the dollar amount. The resolved amount is what the payment credential is pinned against, so dynamic pricing is replay-safe.

```rust
use solana_pay_kit::{paid_get, Price};

let app = Router::new().route(
    "/quote",
    paid_get(
        quote,
        Price::dynamic(|ctx| match ctx.query_param("tier").as_deref() {
            Some("premium") => "5.00".to_string(),
            _ => "0.10".to_string(),
        }),
        &pay,
    ),
);
```

The currency and decimals are set once on `PayKitConfig` (`currency` defaults to `"USDC"`, `decimals` to `6`); prices are quoted against them.
