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 分

    请在仓库或注册中心条目中声明许可证。