---
api: 'Revolut Wallet Partner Callbacks'
---

# Retrieve a pass

Return the latest state of the pass identified by `partner_reference` (the reference you
assigned). Revolut calls this on a schedule and on demand to refresh what the customer sees.

**Support conditional requests.** You generate and return an `ETag` header with every `200`
response. It is an opaque token representing the current state of the pass. Revolut stores
it and sends it back as `If-None-Match` on subsequent calls. If the pass is unchanged since
that `ETag`, reply `304 Not Modified` (no body). If it has changed, return `200` with the
full pass and a fresh `ETag`.

**Status semantics:**
- `200`: pass returned.
- `304`: unchanged since the supplied `ETag`.
- `404` / `410`: pass gone. Revolut stops polling it.

:::note
Validate Revolut's credentials (mTLS, JWS, or OAuth 2.0) and reject any unauthenticated request with `401`.
:::

:::info
See [Update a pass](https://developer.revolut.com/docs/guides/revolut-wallet/operations/update-pass) for the push-vs-poll model and polling cadence.
:::

## Endpoint

GET `/passes/{partner_reference}`

## Parameters

### header parameters

- `Revolut-Api-Version` (string, required)
  Contract version Revolut is calling with, e.g. `2026-07-01`.
  
  :::note
  If you receive a version you do not implement, respond with `400`.
  :::

- `Request-Id` (string, optional)
  Revolut's correlation id for this request. Echo it back in your response.

- `If-None-Match` (string, optional)
  An `ETag` previously returned by your `200` response to this endpoint. Revolut sends it
  back so you can skip re-sending an unchanged pass. Return `304 Not Modified` if the
  pass state is the same as when you issued this `ETag`.

### path parameters

- `partner_reference` (string, required)
  Your own reference for the pass, as set when you created it (Partner API `POST /passes`)
  or returned in a transaction-outcomes response. Send the **bare value** here — do not use
  the `ref:` prefix (that form is only for the Partner API `PUT /passes/{id}`).

## Returns

### 200

Current pass state. Excludes `template_id` (immutable, set at creation).

#### Response attributes


## Error responses

| HTTP status code | Description |
| --- | --- |
| 401 | Missing or invalid Revolut credentials: no or failed mTLS certificate, an invalid JWS signature, or a missing/invalid OAuth 2.0 access token. |
| 403 | Authenticated, but the credential lacks the required scope/permission (e.g. an OAuth token without `passes.read`). |
| 404 | Pass not found. Revolut stops polling it. |
| 410 | Pass permanently gone. Revolut stops polling it. |
| 429 | Rate limit exceeded. Revolut retries, honouring `Retry-After`. |
| 503 | Temporary capacity issue. Revolut retries, honouring `Retry-After`. |
