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

# Deliver passes

> Send holders a link that adds their pass to Apple Wallet or Google Wallet.

Issuing a pass doesn't put it on a phone. You send the holder a link, and they add the pass from a page hosted by TapAce. The page shows **Add to Apple Wallet**, **Add to Google Wallet** or both, depending on the pass's platforms:

* **iPhone:** the Apple Wallet sheet opens on its own, with the buttons as a fallback.
* **Android:** the page goes straight to Google Wallet's save screen.
* **Computer:** the page shows a QR code to scan with a phone.

There are two kinds of link.

## Permanent link

Every pass has a `distributionUrl`:

```json theme={null}
{
  "object": "pass",
  "id": "pass_7hGk2LmQ9xVt4RnB8cYe",
  "distributionUrl": "https://tapace.lk/p/6BkJLsso1xyB"
}
```

The link never changes, so you can store it and send it at any time, for example in a welcome email or a text message. Anyone with the link can add the pass, so share it only with the holder. After you [void the pass](https://tapace.lk/docs/api-reference/passes/void.md), the page says it's no longer available.

## Your own buttons

To put wallet buttons in your own app or email instead of linking to the page, use the pass's direct links:

* `appleDownloadUrl` downloads the signed Apple Wallet file.
* `googleSaveUrl` opens Google Wallet's save screen.

```json theme={null}
{
  "object": "pass",
  "id": "pass_7hGk2LmQ9xVt4RnB8cYe",
  "appleDownloadUrl": "https://tapace.lk/p/6BkJLsso1xyB/apple",
  "googleSaveUrl": "https://tapace.lk/p/6BkJLsso1xyB/google"
}
```

Each is `null` when the pass wasn't issued for that wallet, can't be signed right now, or is voided. Use the official [Add to Apple Wallet](https://developer.apple.com/wallet/add-to-apple-wallet-guidelines/) and [Add to Google Wallet](https://developers.google.com/wallet/generic/resources/brand-guidelines) buttons.

## Expiring links

For a link that stops working after a set time, [create a download link](https://tapace.lk/docs/api-reference/passes/create-download-link.md):

```bash theme={null}
curl https://api.tapace.lk/v1/passes/pass_7hGk2LmQ9xVt4RnB8cYe/download-links \
  -H "Authorization: Bearer $TAPACE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "expiresInSeconds": 3600 }'
```

```json theme={null}
{
  "object": "download_link",
  "id": "dlink_Vb3Nq8Lm2Xr7Tk4Pz9Wc",
  "passId": "pass_7hGk2LmQ9xVt4RnB8cYe",
  "url": "https://tapace.lk/p/dl/kX2r9QvL7mT4nB8cYe3WpZ",
  "expiresAt": "2026-10-13T11:00:00.000Z",
  "createdAt": "2026-10-13T10:00:00.000Z"
}
```

The `url` is returned only once, so send it straight away. You can [revoke a link](https://tapace.lk/docs/api-reference/passes/revoke-download-link.md) before it expires. Once the pass is in a wallet it stays there after the link expires.

## After the pass is added

* The pass updates itself when you [update it](https://tapace.lk/docs/guides/update-passes.md). You never need to send a new link.
* Subscribe to the [`pass.installed` and `pass.removed` webhooks](https://tapace.lk/docs/guides/webhooks) to find out when a holder adds or removes the pass, or read the pass's [`presence`](https://tapace.lk/docs/api-reference/passes/get) to see where it is now.

## Use the Node.js SDK

`tapace.passes.create()` returns the pass ID, `distributionUrl` and nullable wallet-specific links. Save the pass ID and share the distribution URL through your own application. Issuance does not install the pass automatically. See the [SDK quickstart](https://tapace.lk/docs/sdk/node/quickstart.md).

Expiring download-link creation and revocation use the HTTP API; SDK 0.1.0 has no dedicated methods for them.


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