> ## Documentation Index
> Fetch the complete documentation index at: https://docs-consumer.voucher.allride.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Prices and price acceptance

> Read your Price Terms per voucher set, accept them in the consumer dashboard before you redeem, and handle price changes and the price gate.

AllRide decides which voucher sets are available to you and at what price per redemption. You see your own price for every voucher set in your catalog and must **accept** it before you can redeem from that set. No consumer is ever billed at a price it has not accepted.

## Price terms

For every voucher set visible to you, your **Price Terms** state what one redemption costs you:

| Field | Meaning |
| - | - |
| `pricingModel` | `per-unit` (one price per redemption) or `graduated` (tiers, each with its own price) |
| `unitPrice` | For `per-unit`: a `UnitPrice` `{value, scale: 4, label}` with `value` in ten-thousandths of a euro (`1000` = €0.10, `1250` = €0.1250). A price of zero is possible |
| `tiers` | For `graduated`: the tiers in order, each with `upTo` (the last redemption number it covers, `null` on the last tier) and `unitPrice` |

Prices change over time, so the terms come in **Price Terms Periods**: a `current` period (the one in force now, `null` when the set has no price yet) and up to 5 `upcoming` periods, each with `startsAt`, `endsAt` (`null` when open-ended), `terms`, a `termsDigest` (a SHA-256 fingerprint of the terms) and your `acceptance`.

| Operation | Endpoint |
| - | - |
| [List Price Terms](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-voucher-sets-list.md) | `GET /consumer/v1/pricing/voucher-sets` (filter by `providerPartnerId`, `voucherSetId`, `status`, `hasUpcomingChange`) |
| [Get Price Terms of a voucher set](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-voucher-sets-get.md) | `GET /consumer/v1/pricing/voucher-sets/{voucherSetId}` |
| [Get the pricing summary](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-summary-get.md) | `GET /consumer/v1/pricing/summary`: how many sets need acceptance, have a pending change or have no price, and the next change |
| [List Price Acceptances](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-acceptances-list.md) | `GET /consumer/v1/pricing/acceptances`: everything you have accepted |

```bash theme={null}
curl "$VOUCHER_API_BASE_URL/consumer/v1/pricing/voucher-sets/2030" \
  -H "Authorization: Bearer $VOUCHER_API_KEY"
```

```json theme={null}
{
  "data": {
    "id": 2030,
    "resource": "voucher-set-price-terms",
    "voucherSetId": 2030,
    "providerPartnerId": 1030,
    "provider": {
      "id": 1030,
      "resource": "partner",
      "name": "Acme Scooters",
      "_links": { "self": { "href": "https://api.voucher.allride.io/consumer/v1/catalog/providers/1030", "type": "application/json" } }
    },
    "voucherSetName": { "de": "Acme Starter Pass", "en": "Acme Starter Pass" },
    "status": "change-pending",
    "nextChangeAt": "2026-11-30T23:00:00Z",
    "current": {
      "startsAt": "2025-12-31T23:00:00Z",
      "endsAt": "2026-11-30T23:00:00Z",
      "terms": { "pricingModel": "per-unit", "unitPrice": { "value": 800, "scale": 4, "label": "€0.08" }, "tiers": null },
      "termsDigest": "4f0c2a9e7b13d5c8e1f6a0b2c4d6e8f0a1b3c5d7e9f1a3b5c7d9e1f3a5b7c9d1",
      "acceptBy": "2025-12-31T23:00:00Z",
      "acceptance": {
        "status": "accepted",
        "priceAcceptanceId": 61017,
        "acceptedAt": "2026-01-03T09:12:00Z",
        "acceptedBy": { "type": "partner-user", "id": 4069, "label": "finance@example.com" }
      }
    },
    "upcoming": [
      {
        "startsAt": "2026-11-30T23:00:00Z",
        "endsAt": null,
        "terms": { "pricingModel": "per-unit", "unitPrice": { "value": 1000, "scale": 4, "label": "€0.10" }, "tiers": null },
        "termsDigest": "9a17e3c5b7d9f1a3c5e7a9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1",
        "acceptBy": "2026-11-30T23:00:00Z",
        "acceptance": { "status": "pending" }
      }
    ],
    "_links": {
      "self": { "href": "https://api.voucher.allride.io/consumer/v1/pricing/voucher-sets/2030", "type": "application/json" },
      "voucherSet": { "href": "https://api.voucher.allride.io/consumer/v1/catalog/voucher-sets/2030", "type": "application/json" }
    }
  }
}
```

Instants are UTC; `2026-11-30T23:00:00Z` is midnight on 1 December in Berlin. You see only the price that applies to you, never how AllRide derived it, and never the prices of other consumers. Providers never see prices, and end customers never see prices on landing pages.

**Availability.** Which voucher sets you see at all is also decided by AllRide, per provider and per voucher set. A set you have no access to is absent from your catalog and from the pricing endpoints (404 [`voucher-set-not-found`](https://docs-consumer.voucher.allride.io/errors/catalog#voucher-set-not-found)). See [Catalog and toggles](https://docs-consumer.voucher.allride.io/consumer/catalog.md).

## Accepting prices

Accepting a price is a commercial commitment, so a person in your team makes it:

* Accept on the **Prices** page of the consumer dashboard. It lists the sets that need acceptance and the terms you accept.
* The member needs the permission `accept-consumer-pricing` and a sign-in within the last 15 minutes. The default groups `owners`, `administrators` and `billing` have it.
* **API keys cannot accept prices**: `accept-consumer-pricing` cannot be delegated, and an API key calling the accept operation gets 403 [`missing-permission`](https://docs-consumer.voucher.allride.io/errors/catalog#missing-permission). AllRide cannot accept on your behalf either.

The dashboard calls [Accept Price Terms](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-acceptances-create.md) (`POST /consumer/v1/pricing/acceptances`) with the periods it showed, identified by voucher set, `periodStartsAt` and `termsDigest`. Up to 200 periods are accepted in one all-or-nothing request. You can accept the current period or any upcoming one in advance. Accepting the same terms again changes nothing.

Every acceptance is immutable and recorded in your [audit log](https://docs-consumer.voucher.allride.io/workspace/audit-log.md) with the exact terms, who accepted and when. If the terms changed while you were deciding, the request fails with 409 [`price-terms-changed`](https://docs-consumer.voucher.allride.io/errors/catalog#price-terms-changed) and nothing is recorded; reload the Prices page and accept again.

A suspended partner cannot accept prices.

## Price changes

When AllRide changes a price you have accepted, the new price starts **at least 14 days later** (the platform notice period). Only in exceptional cases, with a recorded reason, can AllRide schedule a change at shorter notice, never earlier than the next day. You hear about a change through:

* an email to your members with `accept-consumer-pricing`, with reminders 7 days and 1 day before the start;
* the webhook [`price-terms-change-scheduled`](https://docs-consumer.voucher.allride.io/webhooks/events/price-terms-change-scheduled);
* a banner in the consumer dashboard and the counts of the [pricing summary](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-summary-get.md).

Until the new price starts you keep redeeming, and are billed, at the price you accepted. **From the start date the voucher set pauses for you until you accept the new price**; you then receive [`price-terms-acceptance-required`](https://docs-consumer.voucher.allride.io/webhooks/events/price-terms-acceptance-required). Accept before the start date (`acceptBy`) to avoid a pause.

The `status` of a voucher set (also shown on [catalog entries](https://docs-consumer.voucher.allride.io/consumer/catalog.md) as `priceAcceptance.status`) tells you where you stand:

| `status` | Redeemable | Meaning |
| - | - | - |
| `accepted` | Yes | You accepted the terms in force, and no unaccepted change is coming |
| `change-pending` | Yes, until `nextChangeAt` | A new price starts at `nextChangeAt` and you have not accepted it yet |
| `acceptance-required` | No | You have not accepted the terms in force now |
| `not-priced` | No | AllRide has not set a price for you yet |
| `exempt` | Yes | No acceptance is needed for your partner |

## Redeeming and the price gate

A voucher set is redeemable for you only when you have accepted the Price Terms in force at the moment of the redemption. Otherwise:

* [Create a redemption](https://docs-consumer.voucher.allride.io/api-reference/consumer-redemptions-create.md) and [batch redemptions](https://docs-consumer.voucher.allride.io/api-reference/consumer-redemptions-batch.md) answer 409 [`price-acceptance-required`](https://docs-consumer.voucher.allride.io/errors/catalog#price-acceptance-required). `more` names the `voucherSetId` and the `priceAcceptanceStatus` (`acceptance-required` or `not-priced`). Accept the price in the dashboard, then retry with a **new** `Idempotency-Key` (the 409 is stored for the old key).
* When you redeem by `providerId`, sets you have not accepted are skipped; the 409 occurs only when nothing else blocks the redemption.
* On [landing pages](https://docs-consumer.voucher.allride.io/consumer/landing-pages.md) a set without an accepted price is absent, as if it were switched off. End customers never see prices or an acceptance message.

Watch `priceAcceptance.status` on your catalog entries, or the [pricing summary](https://docs-consumer.voucher.allride.io/api-reference/consumer-pricing-summary-get.md), to find sets that need attention before your customers notice.

## Pricing webhooks

These consumer-only webhook types require `view-consumer-pricing` on the member or API key that subscribes the endpoint.

| Type | Sent when | `payload` |
| - | - | - |
| [`price-terms-change-scheduled`](https://docs-consumer.voucher.allride.io/webhooks/events/price-terms-change-scheduled) | AllRide schedules a change to terms you have accepted | The price change (`resource: price-change`, `id`), `startsAt` and the affected `voucherSets` with their Price Terms |
| [`price-terms-acceptance-required`](https://docs-consumer.voucher.allride.io/webhooks/events/price-terms-acceptance-required) | A change started and some of your sets are paused until you accept | The price change (`resource: price-change`, `id`), `startsAt`, `voucherSetIds` |
| [`price-terms-accepted`](https://docs-consumer.voucher.allride.io/webhooks/events/price-terms-accepted) | A member of your team accepted Price Terms | The Price Acceptance |

## Permissions

| Permission | Grants | API keys |
| - | - | - |
| `view-consumer-pricing` | Read Price Terms, the pricing summary and your Price Acceptances; subscribe to pricing webhooks | Yes (delegable) |
| `accept-consumer-pricing` | Accept Price Terms (dashboard users with a recent sign-in) | No |

The default groups `owners`, `administrators` and `billing` hold both. `developers`, `viewers` and `redemption-operators` hold neither, because prices are finance data.

## Related

* [Billing](https://docs-consumer.voucher.allride.io/consumer/billing.md)
* [Catalog and toggles](https://docs-consumer.voucher.allride.io/consumer/catalog.md)
* [Redeeming vouchers](https://docs-consumer.voucher.allride.io/consumer/redeeming.md)
* [Members and groups](https://docs-consumer.voucher.allride.io/workspace/members-and-groups.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.