API

Wallet passes, REST-API native.

Issue, update, and revoke Apple Wallet and Google Wallet passes from your stack, send push notifications and manage templates, all through one REST API.

Code samples

Create your first pass in three lines.

Pick your stack. Each example issues a pass against a saved template — the most common starting point.

cURL

bash
curl -X POST https://api.shakewellwallet.com/api/public/v1/wallet-passes \
  -H "Authorization: Bearer $SHAKEWELL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
  "template_id": 38,
  "person": {
    "forename": "Ada",
    "surname": "Lovelace",
    "emailAddress": "ada@example.com"
  }
}'

Node.js

js
// Node 18+ (built-in fetch)
const res = await fetch("https://api.shakewellwallet.com/api/public/v1/wallet-passes", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SHAKEWELL_API_KEY}`,
    "Content-Type": "application/json",
    Accept: "application/json",
  },
  body: JSON.stringify({
    template_id: 38,
    person: { forename: "Ada", surname: "Lovelace", emailAddress: "ada@example.com" },
  }),
});
const body = await res.json();
if (!res.ok) throw new Error(`${res.status} ${body.error_code ?? body.error}: ${body.message}`);
console.log(body.data.pass_id, body.data.install_urls.universal);

Python

python
import os
import requests

res = requests.post(
    "https://api.shakewellwallet.com/api/public/v1/wallet-passes",
    headers={
        "Authorization": f"Bearer {os.environ['SHAKEWELL_API_KEY']}",
        "Accept": "application/json",
    },
    json={
        "template_id": 38,
        "person": {"forename": "Ada", "surname": "Lovelace", "emailAddress": "ada@example.com"},
    },
    timeout=30,
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {body.get('error_code') or body.get('error')}: {body['message']}")
print(body["data"]["pass_id"], body["data"]["install_urls"]["universal"])

Authentication, rate limits and error codes are in the developer docs, with an OpenAPI spec.

What you can do

Every product surface, available via API.

If you can do it in the dashboard, you can do it from your stack.

Issue passes

One API call creates a pass from a template. The response includes the install link for Apple Wallet and Google Wallet.

Update in real time

Update a pass's status, expiry and field values from your own system and the change reaches the wallet.

Push by segment

Send a lock-screen message to one pass, a list of passes or every pass on a template.

Track installs

Read is_installed on a pass to see whether the customer added it. Outbound webhooks are not available yet.

Manage templates

List, create, update and delete card templates, including image uploads, through the same REST surface.

List and filter passes

Page through passes by template, search and sort order to feed your own reporting.

Developer experience

Built the way you'd build it yourself.

The defaults a senior engineer would want, without having to ask for them.

RESTful endpoints with JSON requests and responses, authenticated by API key.

Every free trial includes API access to try the integration before you pay.

Documented rate limit: 60 requests per minute per IP address.

A consistent JSON error envelope with stable error codes, one troubleshooting page per error.

OpenAPI 3 spec and a Postman collection to import and explore the API in minutes.

Quickstarts in cURL, Node, PHP and Python in the developer docs.

Tooling

Plain HTTP, plus a spec and a collection.

There is no SDK to install: the API is plain HTTPS and JSON. The docs have working examples in cURL, Node.js, PHP and Python, an OpenAPI 3 spec to generate a client from, and a Postman collection.

Use cases

What developers build with us.

A few of the most common patterns. The API surface supports plenty more.

Integrate with your POS

Issue a wallet pass the moment a customer completes checkout, then update it as their status changes.

Sync with your CRM

Keep wallet pass content current as customer records change, without a manual export.

Build a custom flow

Passes, updates and push messages are separate calls, so you can compose the workflow your business needs.

Ship it

Read the docs. Start a trial. Talk to an engineer.

Three doors, depending on where you are. Pick the one that gets you unblocked fastest.