walletmcppass: Apple Wallet passes

com.walletmcppass由 walletmcppass.com 發布官方發布者v1.1.0更新於 Oct 25, 2026

Create signed Apple Wallet passes (.pkpass): boarding passes, tickets, coupons, store cards.

已驗證Streamable HTTP可網頁執行效率與工作流媒體與設計

概覽

AI 產生的概覽

遠端 MCP 伺服器,讓助理產生已簽章的 Apple 錢包票卡(.pkpass)並可事後更新,不需 Apple 開發者帳號。

可以做什麼
  • 建立已簽章的 Apple 錢包票卡,支援登機證、活動票券、優惠券、儲值卡與一般樣式,可設定欄位、顏色、條碼與圖片,並回傳一小時內有效的下載連結
  • 更新以可更新方式建立的票卡,整批取代已儲存的值,讓已加入該票卡的 iPhone 重新整理,或將其作廢
  • 使用自備的 PNG 圖檔或圖片網址,或由服務自動產生圖示與標誌
  • 設定鎖定畫面地點、相關時間與到期時間、語意標籤以及 iOS 27 海報版型
適用情境
適合讓助理把 PDF 登機證、票券、優惠券或會員卡轉成錢包票卡,或為活動、會員發行票卡並在之後修改,而不必自行處理 Apple 憑證。
執行需求
遠端 Streamable HTTP 端點;不需帳號、API 金鑰或標頭。每次呼叫需提供聯絡電子郵件與 x402 就緒標記。免費額度依 IP 與全域每日上限計算,超出後以 x402 在 Base 上以 USDC 付費。
安裝前請注意
票卡內容與圖片會傳送到第三方託管服務;請求日誌保留時間、IP、票卡樣式、組織名稱與聯絡電子郵件。下載連結一小時後失效。可更新票卡會在其更新期間內被儲存,編輯權杖是修改該票卡的唯一憑據,持有者即擁有該票卡。超出免費額度後呼叫可能產生少量 USDC 費用。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 walletmcppass: Apple Wallet passes,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.walletmcppass%2Fwallet-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "walletmcppass-apple-wallet-passes": {
      "type": "http",
      "url": "https://walletmcppass.com/mcp"
    }
  }
}

README

wallet-mcp: free Apple Wallet pass generator for Claude, ChatGPT and any MCP client

Turn a PDF boarding pass, ticket, coupon or loyalty card into a signed Apple Wallet pass (.pkpass) from an AI assistant, with no Apple Developer account. wallet-mcp is the open-source server behind walletmcppass.com: an MCP server with two tools, create_wallet_pass and update_wallet_pass, and the same pass builder as a REST API.

MCP endpointhttps://walletmcppass.com/mcp (Streamable HTTP)
REST APIPOST https://walletmcppass.com/api/passes, PATCH .../api/passes/{serial}
Sign-inNone. No account or API key, just a contact email on each call
PriceFree for 30 calls (creates + updates) a day per IP address, 20 from 2026-11-18; past that $0.01 per call in USDC on Base, paid with x402
Limits500 free calls a day in total; paid: 1,000 a day per IP, 10,000 in total; passes up to 10 MB
Pass typesBoarding pass, event ticket, coupon, store card, generic (+ iOS 27 poster layout)
Works withClaude, ChatGPT, Codex, the OpenAI Responses API, Claude Code, any Streamable HTTP MCP client
OutputA download link, valid for 1 hour, that opens "Add to Apple Wallet" on an iPhone
UpdatesOptional: updatable=True passes can be changed for 1 hour, or up to 30 days with updatable_hours, and installed copies refresh

Quick start

Claude (web, desktop and mobile; any plan, Free allows one custom connector): open Customize → Connectors, click + Add → Add custom connector, name it walletmcppass, paste https://walletmcppass.com/mcp, choose No sign in and click Add. In a chat, click + → Connectors and switch it on. Full steps.

ChatGPT: go to chatgpt.com/plugins, select + → Add custom MCP server, name it walletmcppass, enter https://walletmcppass.com/mcp under Connection, set authentication to none and select Create as a plugin. In a chat, type @ and pick walletmcppass. Availability depends on your plan and workspace settings. Full steps.

Codex

sh
codex mcp add walletmcppass --url https://walletmcppass.com/mcp

Claude Code

sh
claude mcp add --transport http walletmcppass https://walletmcppass.com/mcp

OpenAI Responses API

python
from openai import OpenAI
client = OpenAI()response = client.responses.create(    model="gpt-6-astra",    tools=[{        "type": "mcp",        "server_label": "walletmcppass",        "server_description": "Creates signed Apple Wallet passes.",        "server_url": "https://walletmcppass.com/mcp",        "require_approval": "never",    }],    input="Make an Apple Wallet coupon for 20% off at Harbor Café, valid until 31 December, with the QR code CAFE20.",)print(response.output_text)

Any other MCP client: add a remote Streamable HTTP server at https://walletmcppass.com/mcp, with no headers. No MCP client? Use the REST API.

Then ask for a pass:

  • "Make an Apple Wallet boarding pass from this PDF." (with the PDF attached)
  • "Turn my climbing gym card into a Wallet pass. Member number 004217, Code 128 barcode."
  • "Create an event ticket for Blue Note on Friday at 9pm, seat B12, with this QR code text: TICKET-0042."

PDF boarding pass to Apple Wallet

Give your assistant the airline's PDF or a screenshot and it builds a Wallet boarding pass. Boarding passes are built from your real airline-issued barcode: the pass carries the same barcode data as your PDF (usually a PDF417 or Aztec code holding an IATA BCBP string), which is what security and gate scanners read. The service doesn't issue tickets, check you in or contact airlines, and the pass won't receive gate changes. Assistants read a PDF's printed text reliably but can't always decode the barcode image; if yours can't, scan it with a barcode scanner app and paste the text.

Compared with Create a Pass in iOS 27

Wallet in iOS 27 can scan a card or fill in a Standard, Membership or Event template on the iPhone, which covers a single simple card. wallet-mcp adds:

  • boarding pass, coupon and store card layouts, Apple's iOS 26 semantic boarding pass and the iOS 27 poster layout;
  • passes built by an assistant or app from a PDF, an email or a sentence, instead of a form on the phone;
  • control over the barcode format (QR, PDF417, Aztec, Code 128 everywhere; Code 39, Codabar, EAN-13, ITF on iOS 27), colors, logo, images and back-of-pass text;
  • a signed .pkpass file you can share, or add on an iPhone that isn't running iOS 27.

Privacy, terms and support

walletmcppass.com is an independent project, not affiliated with Apple. Pass contents aren't written to the request log, and pass files are deleted when their link expires after 1 hour; the request log keeps only the time, IP address, pass style and organization name, plus the contact email and x402 status every call must send. Updatable passes are stored for their update window (1 hour by default, at most 30 days) and then deleted. Questions and bug reports: GitHub issues.

Why this exists

Building a .pkpass by hand means writing pass.json, generating icon/logo art, hashing every file into a manifest, signing it with an Apple Pass Type ID certificate, and zipping it up flat — a fiddly, easy-to-get-wrong process (see the "gotchas" below). This wraps that whole pipeline behind a single MCP tool call, so an LLM agent (or you, through one) can just ask for a pass.

How it works

One process, one port, four things on it:

  • The MCP endpoint (Streamable HTTP) at /mcp — the create_wallet_pass tool.
  • The REST API at POST /api/passes — the same pass builder for non-MCP callers. It shares the rate limits and request log with the tool; each logged request records which one it came through (source = mcp or api).
  • A usage dashboard at / and /api/stats — request counts, success/error rate, recent activity, all read from a local SQLite log. The hosted instance doesn't expose these publicly.
  • Short-lived download links at /download/{token} — built passes are served with the correct application/vnd.apple.pkpass content type (required for Wallet to recognize the file) and expire after 1 hour, swept by file mtime so a crash/restart can't leak files.
server.py        MCPServer instance: the tool + custom HTTP routes (REST API, dashboard, stats, downloads)pass_builder.py  Builds pass.json per style, signs the manifest with openssl smime, zips the .pkpassimage_gen.py     Pillow-based icon/logo generation (colored square + initials / wordmark)db.py            SQLite request log + per-IP and global daily rate limitsdashboard.html   Static dashboard page, polls /api/stats every 15swallet-mcp.service   Example systemd unit (Restart=on-failure, boots enabled)

The tool: create_wallet_pass

Annotated with title: "Create Apple Wallet pass", readOnlyHint: false and destructiveHint: false: it only ever creates a new pass file.

style: "boardingPass" | "eventTicket" | "coupon" | "generic" | "storeCard"organization_name, description        # requiredlogo_text, transit_type               # transit_type only applies to boardingPass ("Air" default)barcode_message, barcode_format       # format name or ordered list, e.g. ["EAN13", "Code128"]; omit message for no barcode                                       # "QR" (default) | "PDF417" | "Aztec" | "Code128"; iOS 27+: "Code39" | "Codabar" | "EAN13" | "ITF"                                       # Wallet shows the first listed format the device supports; no fallback is addedbarcode_alt_text                      # human-readable text under the barcodebackground_color, foreground_color, label_color   # hex "#1a1a19" or "rgb(26, 26, 25)"relevant_date, expiration_date        # ISO 8601locations                              # up to 10 of {latitude, longitude, altitude?, relevantText?}: show on the lock screen nearbymax_distance                           # meters; can only shrink Wallet's default radius around each locationvoided                                 # stamps the pass VOIDprimary_fields, secondary_fields, auxiliary_fields, header_fields, back_fields                                       # lists of {key?, label?, value}serial_number                         # auto-generated UUID if omittedicon_color, icon_text, logo_color     # control the auto-generated articon_png_b64, logo_png_b64            # supply your own PNG instead of auto-generated artgenerate_logo                          # False = no logo image (e.g. when logo_text alone is enough)
# iOS 27+poster                                 # Poster Generic layout; style must be generic/storeCard/coupon (kept as fallback)footer_fields                          # up to 2, poster onlybackground_png_b64                     # poster background (1035x1515 px); gradient auto-generated if omittedfeatured_actions                       # up to 2 of {type, url}, e.g. {"type": "membershipBenefits", "url": "https://..."}
# Semantic tags and layoutssemantics                              # Apple SemanticTags dict, emitted as given; unknown keys and bad types rejectedsemantic_layout                        # boardingPass (airline, iOS 26+) -> semanticBoardingPass; eventTicket -> posterEventTicket                                       # required tags are checked; the classic style stays as the fallback, so keep its fieldsinfo_links                             # top-level event-guide / airline-page links: bagPolicyURL, changeSeatURL, ...
# Extra images (base64 PNG); which one shows depends on style and iOS version, see the tool docstringprimary_logo_png_b64, secondary_logo_png_b64, strip_png_b64, thumbnail_png_b64, artwork_png_b64

Returns { download_url, expires_in_seconds, serial_number, pass_type_identifier }. The download link is valid for one hour. Open it in Safari on the iPhone; Wallet won't add a .pkpass handed over by another app. Google Wallet on Android imports the same file.

The REST API: POST /api/passes

The JSON body takes exactly the tool's parameters above. The request model is generated from the same function signature, so the two can't drift apart. Unknown keys are rejected.

sh
curl https://walletmcppass.com/api/passes \  -H 'Content-Type: application/json' \  -d '{"style": "generic", "organization_name": "Harbor Climbing Gym", "description": "Day pass",       "contact_email": "[email protected]", "x402_ready": false,       "primary_fields": [{"label": "Guest", "value": "Ada L."}], "barcode_message": "DAY-0042"}'
StatusBody
200Same as the tool: { download_url, expires_in_seconds, serial_number, pass_type_identifier }
400{"error": "invalid request", "details": [...]} for a malformed body or wrong types; {"error": "..."} when the pass itself is invalid
402Past a free limit (per-IP or global): an x402 PaymentRequired body (also base64'd in the PAYMENT-REQUIRED header). Retry with a payment, see below
429{"error": "rate limit exceeded: ..."} or "service is at its daily request limit ..." — only when payments are off
500{"error": "internal error building the pass"}

As with the tool, bodies that fail schema validation are rejected before the rate limiter and aren't logged; pass-builder errors are logged and do count.

Updating a pass: update_wallet_pass / PATCH /api/passes/{serial}

Create the pass with updatable=True, and optionally updatable_hours (1 to 720, default 1) for how long it can be updated. The response adds updatable_until and an edit_token, a secret that is the only way to change that pass (no accounts; whoever holds the token owns the pass). The pass carries a webServiceURL ({PUBLIC_BASE_URL}/passkit) and its own authenticationToken, so every iPhone that adds it registers with the server.

An update takes serial_number, edit_token and any of the create parameters. Given parameters replace the stored ones whole (a fields list replaces the list); omitted ones are kept. The server re-signs the pass, stores it, and sends an empty APNs push to each registered device. Wallet then fetches the new version. voided=True is how you cancel a pass. A field's changeMessage (for example "You now have %@ points") shows on the lock screen when that field's value changes. Wallet matches fields by key, so give changing fields an explicit key.

sh
curl -X PATCH https://walletmcppass.com/api/passes/$SERIAL \  -H "Authorization: Bearer $EDIT_TOKEN" -H 'Content-Type: application/json' \  -d '{"contact_email": "[email protected]", "x402_ready": false,       "primary_fields": [{"key": "points", "label": "Points", "value": "150", "changeMessage": "You now have %@ points"}]}'

It returns the create response plus notified_devices and updatable_until (pushes APNs accepted, not devices that have refreshed yet). The status codes are 200, 400, 401 (no bearer token), 402, 404 (unknown serial, wrong token, or update window over, deliberately the same) and 429. Updates count towards the same daily limits as creates.

Notes:

  • Only updatable passes store their contents (in the passes table, with the edit token as a SHA-256 hash). The window is counted from creation and updates don't extend it. When it ends, the pass is treated as gone at once, and the download sweeper deletes the row and its device registrations within 30 seconds. Copies in Wallet keep their last version. Image URLs are fetched once and stored as PNG, so an update never refetches them.
  • The PassKit web service (/passkit/v1/...) implements Apple's protocol: register and unregister a device, list changed serials (passesUpdatedSince is the pass's integer updated time), fetch the latest pass (If-Modified-Since gives 304), and log. Each pass accepts up to 100 devices.
  • APNs uses the pass-signing certificate over HTTP/2 via curl, because the venv has no HTTP/2 client. WALLET_MCP_APNS_URL overrides the endpoint, and the tests use that to point it at a fake. A push that gets 400 or 410 removes that device's token.
  • nginx must forward /passkit/ and /api/passes/ to the backend, alongside /mcp, /download/ and = /api/passes.
  • Tests: tests/test_updates.py.

Image URLs

Every *_png_b64 parameter also accepts an https:// URL. image_fetch.py fetches it with SSRF guards: https only; every resolved address must be globally routable (so no loopback, private, link-local or CGNAT/tailnet addresses); the connection is pinned to the checked IP; redirects are re-checked (at most 3); and the limits are 5 MB, 25 megapixels and 10 s per read. JPEG, WebP, GIF and ICO are converted to PNG. Base64 input keeps its old rule, which is PNG only.

Deploying your own instance

You need your own Apple Developer Pass Type ID certificate — the one in this repo's design (pass_builder.py) is not included, and can't be, since it's a private key tied to a specific Apple Developer account. To stand this up:

  1. Issue a Pass Type ID certificate in the Apple Developer portal, export the private key + signed cert as PEM, and download Apple's WWDR G4 intermediate cert.
  2. In pass_builder.py, point SIGNING_DIR/PASSKEY/CERT/WWDR at your files, and set PASS_TYPE_IDENTIFIER/TEAM_IDENTIFIER to your own.
  3. Set up the Python environment (this project has no pip/venv assumptions baked in beyond standard tooling):
    uv venv .venvuv pip install --python .venv/bin/python "mcp[cli]" pillow uvicorn starlette "x402[evm,httpx]==2.25.0"
  4. Run it:
    PORT=8400 WALLET_MCP_PUBLIC_URL=https://your-domain/wallet-mcp \  WALLET_MCP_PUBLIC_HOST=your-domain \  .venv/bin/python server.py
    WALLET_MCP_PUBLIC_HOST matters: the MCP SDK has DNS-rebinding protection on by default and will reject every request with a 421 unless the request's Host header is in the allowed list — set this to whatever hostname the server is actually reached at.
  5. Put a reverse proxy (nginx, Caddy, etc.) in front of it with TLS, exposing /mcp, /download/ and /api/passes (but not / or /api/stats, which are the private dashboard). If you use nginx, the Streamable HTTP transport needs:
    proxy_http_version 1.1;proxy_set_header Connection "";proxy_buffering off;proxy_read_timeout 3600s;
    Buffering has to be off or the SSE stream stalls through the proxy.
  6. Run it under a process supervisor so it survives crashes and reboots — wallet-mcp.service in this repo is a working example (systemd, Restart=on-failure, WantedBy=multi-user.target).

Rate limiting

No API key — anyone with the URL can call the tool or the REST API. Protected only by daily caps in db.py: 30 requests/day per caller IP (dropping to 20 on 2026-11-18, set by IP_LIMIT_DROP_DAY in db.py; setting WALLET_MCP_IP_LIMIT pins the limit and cancels the drop), 500 free calls/day globally as a backstop (paid calls excluded), counted across MCP and REST calls combined (override with WALLET_MCP_IP_LIMIT / WALLET_MCP_GLOBAL_LIMIT; WALLET_MCP_DB moves the sqlite file, which the tests use). If you put this behind a hosted MCP client (e.g. a claude.ai connector) rather than direct calls, be aware many end users can share one apparent IP on the server side, so the per-caller cap won't isolate them individually — the global cap is what actually protects you in that case.

Paying past the free limit: x402

Both tools and the REST API also require two inputs that are only logged, as requests columns: contact_email (the user's address, so the operator can reach them about the service; a missing, malformed or placeholder one is a 400 that is logged as refused but doesn't count as a call) and x402_ready (true, false or "unknown", which shows how many clients could pay past the free limit; separate from the x402 column, which records whether a call actually sent a payment).

Set WALLET_MCP_X402_PAY_TO to a Base address and a caller past either free limit (per-IP or global) is offered the call for $0.01 in USDC instead of being refused. Paid calls don't count towards the global free budget. They have their own caps: 1,000 a day per IP and 10,000 in total (WALLET_MCP_PAID_IP_LIMIT / WALLET_MCP_PAID_GLOBAL_LIMIT), past which it's a plain 429. Without it, they get the plain 429 as before. payments.py uses the x402 SDK:

  • MCP: the refused call is a tool error whose structuredContent is an x402 v2 PaymentRequired (resource mcp://tool/create_wallet_pass or update_wallet_pass). The client retries the same call with the signed payment in _meta["x402/payment"]. The result then carries the receipt in _meta["x402/payment-response"] and as a payment key.
  • REST: a 402 with the PaymentRequired body and PAYMENT-REQUIRED header. The client retries with a PAYMENT-SIGNATURE (or legacy X-PAYMENT) header and gets the receipt in PAYMENT-RESPONSE and as payment.

The facilitator verifies the payment before any work. It settles it on-chain after the pass is built but before the pass is handed over, stored or pushed. So a failed build is never charged, and a failed settlement (402 again) gets nothing and changes nothing. Payments sent while under the limit are ignored, not charged. Each settled call is logged with its payment_tx. The server never holds a key; the USDC goes straight to the payout address.

Env varDefault
WALLET_MCP_X402_PAY_TOunset = payments off
WALLET_MCP_X402_FACILITATORhttps://facilitator.payai.network (settles Base mainnet without an account)
WALLET_MCP_X402_NETWORKeip155:8453 (Base mainnet)
WALLET_MCP_X402_PRICE$0.01

Coinbase's CDP facilitator also needs CDP API-key auth headers, which aren't wired in. tests/test_x402.py runs against a fake facilitator. --live also sends an unfunded payment to PayAI on mainnet, which must be refused for lack of balance.

Capacity guards

These stop any caller, paying or not, from taking the box down:

  • A built pass over 10 MB is refused with a 400 (WALLET_MCP_MAX_PASS_KB). Without images a pass is ~16 KB; the size comes from images.
  • Under 5 GB of free disk, every new create or update gets a 503 (WALLET_MCP_MIN_FREE_DISK_GB).
  • At most 4 builds run at once (BUILD_LIMITER), and the rest queue. Image decoding is the memory-heavy part.
  • systemd backstop in wallet-mcp.service: MemoryHigh=1G, MemoryMax=1536M, CPUQuota=200%. A runaway build gets this service OOM-killed and restarted, not the box.

The usage watcher (a separate cron) emails when any of these trip, when systemd restarts the service, or when free disk drops under 10 GB.

Gotchas worth knowing before you touch pass_builder.py or image_gen.py

  • barcodes is a top-level key in pass.json, a sibling of boardingPass/eventTicket/etc — not nested inside the style dict. Nesting it there is silently ignored: the pass installs fine, but there's no barcode anywhere on the card.
  • Serve .pkpass files with Content-Type: application/vnd.apple.pkpass explicitly. Both Python's mimetypes module and most static file servers don't know this extension and fall back to application/octet-stream, which makes Wallet (and Mail/browsers) treat it as a generic download instead of offering "Add to Apple Wallet."
  • Field keys must be unique across a pass's sections. Auto-generated keys used to restart at field0 in every section; iOS rejects many such passes outright (the pass just won't open), though some combinations slip through, which hides the bug. Keys are now section-prefixed (primary0, secondary0, ...) with collisions suffixed.
  • The Interleaved 2 of 5 barcode format string is PKBarcodeFormatI2of5, not PKBarcodeFormatITF as several WWDC26 write-ups claim. apple/pass-builder is the authoritative reference for the iOS 27 keys.
  • Apple's docs and Apple's own pass-builder code disagree on the semantic boarding pass time-zone keys: departureLocationTimeZone (docs) vs departureAirportTimeZone (code), same for destination. Both are accepted and emitted as given; send both.
  • Apple's Pass Builder validator flags a poster event ticket without NFC as an error, and the docs say the design isn't meant for barcode entry. NFC needs an Apple entitlement this deployment doesn't have, so those passes may show as classic event tickets.
  • Some barcodes (e.g. many airline boarding passes) are Aztec codes, not QR — visually similar but with one bullseye finder pattern instead of three corner squares. Match barcode_format to what you're actually encoding.

MCP Registry

server.json describes the hosted instance for the official MCP Registry as com.walletmcppass/wallet-mcp.

Status

Live at walletmcppass.com. See wallet-mcp.service for the deployment shape it runs under.

來源:README.md,提交 bbb4e67

工具

2

create_wallet_pass

Create Apple Wallet pass

Create a signed Apple Wallet pass (.pkpass) and return a link to download it. Builds one pass in one of the five Wallet styles -- boardingPass, eventTicket, coupon, storeCard or generic -- from the text fields, colors, barcode and optional PNG images given below, signs it with this service's Apple Pass Type ID certificate, and returns an https download_url valid for 1 hour. Opening the link on an iPhone shows "Add to Apple Wallet". Passes install on any iOS version; the iOS 26/27 layouts fall back to the classic style on older iPhones. Barcodes: QR, PDF417, Aztec and Code128 on every iOS version; Code39, Codabar, EAN13 and ITF on iOS 27+. The barcode encodes exactly barcode_message. Gate and till scanners read that data, so a copy of an existing boarding pass, ticket or loyalty card only scans if barcode_message is the original barcode's content (airline boarding passes are usually PDF417 or Aztec, holding an IATA BCBP string such as "M1DOE/JANE ..."). This tool does not issue tickets, check anyone in, or contact airlines or venues. The link must be opened in Safari on the iPhone: Wallet adds a pass from Safari, but not from a .pkpass file handed over by another app. Google Wallet on Android also imports these files. Not supported: NFC passes. With updatable=True the pass can be changed later with update_wallet_pass, and copies already in Wallet refresh themselves. Its contents are then stored on this server for updatable_hours (1 hour by default, at most 30 days), then deleted. Returns {download_url, expires_in_seconds, serial_number, pass_type_identifier}, plus edit_token and updatable_until when updatable=True. Pricing: a call is one create or one update. Free for 30 calls a day per caller IP, while a shared pool of 500 free calls a day lasts; failed calls count too, and counts reset at 00:00 UTC. Past either limit, a call costs $0.01 in USDC on Base, paid with x402;

輸入參數style必填postervoidedicon_textlocationslogo_textsemanticsupdatableicon_colorinfo_linkslogo_colorback_fields另有 30 個

update_wallet_pass

Update Apple Wallet pass

Change a pass made with create_wallet_pass(updatable=True); every iPhone that added it refreshes. Takes the serial_number and edit_token returned when the pass was created, plus any of create_wallet_pass's parameters, with the same meanings. Each parameter given replaces the stored value completely (a fields list replaces the whole list, so resend unchanged fields too); parameters left out keep their current values. Clear a text value with "" and a list with []. To cancel a pass, set voided=True: Wallet marks it void on every iPhone. Wallet asks the server for the new version as soon as Apple delivers the push, usually within seconds. A field's changeMessage is shown on the lock screen when that field's value changes. Only works until the pass's updatable_until time (set by updatable_hours at creation). Returns {download_url, expires_in_seconds, serial_number, pass_type_identifier, notified_devices, updatable_until}. notified_devices counts the iPhones the push was sent to, not ones that have already refreshed. The download_url (valid 1 hour) is only needed to add the pass to a new device.

輸入參數stylepostervoidedicon_textlocationslogo_textsemanticsedit_token必填icon_colorinfo_linkslogo_colorback_fields另有 29 個

版本歷史

1
  1. v1.1.0最新Oct 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。