プライバシーポリシー
Aifuda(合札)は、メールに届いた予約情報を、必要な瞬間に取り出せるようにする iOS アプリです。
このアプリの設計方針は一言で言えば「メール本文を Aifuda のサーバへ送らない」ことです。以下はその具体的な内訳です。
1. 要約
| 開発者自身が保持する個人情報のデータベース | ありません |
| 分析 / 広告 / トラッキング SDK | 広告・トラッキング SDK は無し(サブスク用に RevenueCat のみ) |
| 広告 | 表示しません |
| ユーザー登録・アカウント作成 | 必要ありません(Apple ID による App Store 課金は除く) |
| メール本文の送信先 | Aifuda のサーバには送りません。端末内で読み取ります。Outlook とサンプルでは、予約として認識したメールの本文を端末内に残し、アプリの中で見返せます(2-6)。Gmail の本文は残しません。予約と認識できなかったメールはその場で破棄します |
| 開発者のサーバが受け取るもの | Apple Wallet パスの manifest.json(ファイル名とハッシュ値の辞書)/端末確認と Live Activity 用の値(3-5)。「Wallet リンク」で他の人に渡したときだけ、パスのファイルそのものを最長 48 時間預かります(3-4)。「Aifuda のリンク」での共有はサーバを通りません(3-4a) |
| サブスクリプション | Aifuda Pro は Apple / RevenueCat 経由。購入履歴は App Store のプライバシー表示どおり申告します |
2. 端末の中だけに保存されるもの
2-1. 予約情報(iOS の SwiftData / アプリ専用領域)
メールから取り出した構造化済みの予約情報を保存します。Outlook とサンプルでは、予約として認識したメールの本文も、その予約に紐づけて端末内に保存します(下記 2-6)。Gmail から届いたメールの本文は保存しません。
保存する項目:
- 乗車区間(発駅・着駅)、列車名、発時刻・着時刻
- 号車・座席番号、人数
- お預かり番号(予約番号)
- 金額(発売額 / 領収額 / 払戻額)
- 情報の基準時刻(メール本文の「※…時点」の値、または受信日時)
- 元メールのテンプレート種別(予約完了・リマインド等の内部識別子)
保存しない項目 — ここでいう「保存しない」は構造化フィールドとしては保存しないという意味です。以下の値がメール本文にそのまま書かれている場合、Outlook とサンプルではその本文自体が予約として認識できれば下記 2-6 のとおり端末内に残ります。Gmail では本文を残さないので、本文の一部としても残りません:
- 予約と認識できなかったメールの本文・件名(その場で破棄します。Outlook とサンプルで予約として認識したメールの本文は下記 2-6 のとおり保存します。Gmail の本文は保存しません)
- メールの HTML 版と、通常の添付ファイル(PDF・ICS・画像など)。保存するのはプレーンテキストの本文だけです。例外は
.pkpassです — 予約として認識したメールに発行者署名済みの Apple Wallet パスが添付されていた場合、後から Wallet に追加できるよう端末内に保存します(最大8枚、予約開始後最長7日で自動的に消去、iCloud バックアップの対象外) - 会員 ID は構造化フィールドとしては保存しません。一意キーを組み立てるためだけに SHA-256 でハッシュ化し、先頭 16 桁だけを使います
- 乗車用 IC カード番号は構造化フィールドとしては保存しません(解析時に読み捨てます)
- 氏名、連絡先は構造化フィールドとしては保存しません。自分で入力する自己紹介カードは別枠です(下記 2-5)
- メールアドレスは構造化フィールドとしては保存しません。キーチェーンに残るのは接続したアカウント自身のアドレスだけです(下記 2-2)。ただし各メールの送信元アドレスは、元メール本文のメタデータとして下記 2-6 のとおり保存します
会員 ID・IC カード番号・氏名・連絡先は、Outlook とサンプルでは予約として認識したメールの本文にそのまま書かれていれば、本文の一部として端末内に残ります(下記 2-6)。Gmail では本文を残さないので、これらも本文としては残りません。
これらは iPhone のアプリ専用領域に保存され、iOS のデータ保護(端末の暗号化)の対象です。開発者はアクセスできません。
2-2. アクセストークン(iOS キーチェーン)
Gmail / Outlook と連携した場合、アクセストークンとリフレッシュトークンを iOS のキーチェーンにのみ保存します。設定ファイル・ログ・サーバのいずれにも書き出しません。
あわせて、接続したアカウントのメールアドレスを同じキーチェーンに保存します。用途は連携画面に「どのアカウントに接続しているか」を表示することだけで、端末外には送信しません(開発者のサーバにもログにも渡しません)。連携を解除すると削除します。
2-3. アプリの設定(iOS の UserDefaults)
秘密でない設定値のみを保存します。OAuth クライアント ID、Wallet 署名サーバの URL、Pass Type ID、Team ID など。署名サーバの認証トークンだけは例外的にキーチェーンに保存します。
2-4. ウィジェット用のスナップショット(App Group 共有領域)
ホーム画面 / ロック画面のウィジェットと Live Activity に表示するため、表示に必要な最小項目だけを JSON ファイルとして端末内の共有領域に書き出します。
含まれるもの: 列車名、発駅・着駅、発時刻・着時刻、先頭 1 名分の座席、人数
含まれないもの: お預かり番号、金額、会員 ID ハッシュ(ロック画面に出る面には機微な情報を載せない方針のため)
2-5. 自己紹介カード(ユーザーが入力したもの)
Aifuda には、名刺のように渡せる自己紹介カードを作る機能があります。ここだけは、メール由来ではなくユーザーが入力した情報を保存します。
保存する項目: 表示名、ユーザーが追加した項目(タイトルと内容。個数と文言はユーザーが設定します)、カードに設定した画像(帯とアイコン)、および QR に「連絡先」を選んだ場合のメールアドレスと電話番号。
- 保存先は他の予約と同じ端末内のアプリ専用領域です。開発者はアクセスできません
- 開発者のサーバには送信しません。カードを Apple Wallet に入れるときも、サーバへ渡すのは
manifest.json(ファイル名とチェックサムの辞書)だけです(下記 3-2) - 項目に URL を入れると、アプリの画面ではそのサービス(GitHub・X など)のマークと ID で表示します。判定は端末内で URL の綴りを見ているだけで、そのサービスに問い合わせることはありません
- メールアドレスと電話番号が出るのはカードの QR コードの中だけで、券面には印字されません。読み取らせる相手はユーザーが選びます
- 設定した画像はパスの中に入ります。カードは渡すために作るものなので、Wallet からカードを共有すると画像も一緒に相手へ渡ります(予約のパスとは逆の扱いです。下記 6 章)。開発者のサーバを経由せず、Wallet から直接渡ります
- 「Wallet リンク」による共有(下記 3-4)の対象は予約のパスだけです。自己紹介カードは共有リンクになりません
- 「Aifuda のリンク」による共有(下記 3-4a)も予約だけが対象で、サーバを 1 度も通りません
- ウィジェット・Live Activity・「次の1件」には出ません
- カードを削除すると、設定した画像も含めて端末から消えます。Wallet に入れたパスは、Wallet 側で削除してください
2-6. 元のメールの本文
Outlook とサンプルでは、予約として認識できたメールについてその本文を端末内に保存し、予約の詳細画面から見返せるようにしています。いまの予約情報と一致する値(時刻・号車・座席・予約番号・駅名など)には、本文中で黄色の印が付くことがあります。表記の揺れなどで一致しない場合は印が付きません。
Gmail から届いたメールの本文は保存しません。予約や荷物として読み取った構造化情報だけが残ります。以前のビルドで残っていた Gmail 由来の本文は、同期のたびに消します。
- 保存するのはプレーンテキストの本文と、表示・重複排除・元メールを開くために使うメタデータ(件名、送信元アドレス、受信日時、メールの識別子、取得元アカウント)です。HTML 版と通常の添付ファイルは保存しません(
.pkpassの例外は上記 2-1 のとおりです) - 本文は1通あたり最大 256K 文字まで保存し、それを超える部分は保存しません
- 保存先は予約情報と同じ端末内のアプリ専用領域です。開発者のサーバには送信しません
- Wallet のパス・ロック画面・Live Activity・ウィジェット・共有したテキストへ自動で送信することはありません。アプリの詳細画面から選択してコピーすることはできます。iOS のバックアップ設定に従い、端末のバックアップに含まれる場合があります
- 1件の予約に複数のメールが届くことがあります(予約完了・座席確定・リマインドなど)。届いた順に最大 16 通まで保存し、それを超えると古いものから消えます
- 予約と認識できなかったメールは、本文も件名もその場で破棄します。Outlook とサンプルで本文が残るのは、予約として認識したメールだけです。Gmail の本文は残しません
- 予約を削除すると、その予約に紐づく本文も一緒に消えます
- アプリ内の「連携を解除」を選ぶと、そのアカウントから取り込んだ本文はすべて消えます(予約情報そのものは残ります)。Google / Microsoft 側だけで権限を取り消した場合、端末内の本文は自動では消えません(下記 4 章・5 章)
- この機能が入る前に取り込んだ予約には本文が付いていません。その場合は詳細画面に「元のメール」の欄自体が出ません
3. 端末から外に出る通信
アプリが通信する先は以下がすべてです。
| 通信先 | 何のために | 何を送るか |
|---|---|---|
Google(accounts.google.com / oauth2.googleapis.com / gmail.googleapis.com) |
Gmail 連携(ユーザーが有効にした場合のみ) | 認可リクエストと、from:expy.jp 等の送信元の検索条件および subject:予約確認 等の件名の検索条件(下記 3-1)。取得したメールは端末上で処理し、Aifuda がメール本文を開発者のサーバその他のサービスへ送信することはありません(iOS バックアップについては上記 2-6) |
Microsoft(login.microsoftonline.com / graph.microsoft.com) |
Outlook 連携(ユーザーが有効にした場合のみ) | 同上 |
| Apple(App Store / StoreKit) | Aifuda Pro の購入・復元・領収書検証 | Apple の課金フローに必要な情報(決済は Apple が処理) |
| RevenueCat | 購読状態(entitlement)の確認と不正防止 | 匿名のアプリユーザー ID、購入トークン / 領収書に相当する情報。メール本文や予約内容は送りません |
| Aifuda の署名サーバ | Apple Wallet パスの署名(ユーザーが機能を使った場合のみ) | manifest.json のバイト列だけ(下記 3-2) |
| Aifuda の共有サーバ(署名サーバと同じホスト) | 「Wallet リンク」で共有したときだけ(共有シートで選んだ場合のみ) | 組み上がった .pkpass そのもの(相手が Wallet に追加するファイル。下記 3-4)。最長 48 時間で自動削除 |
| Aifuda のサーバ(端末確認 / Live Activity) | 署名・共有の要求が本物の端末からであることの確認(App Attest)と、Live Activity の自動開始(Aifuda Pro) | 端末ごとの鍵 ID と公開鍵、APNs のプッシュトークン、開始予定時刻と鍵付きハッシュにした予約の識別子(下記 3-5)。駅名・座席・確認番号は送りません |
DuckDuckGo(html.duckduckgo.com) |
画像からの取り込みで、オンデバイスモデルが空港コードや便名などを短い事実確認をする場合のみ | モデルが生成した短い検索クエリだけ(下記 3-3)。画像・OCR 全文・氏名・座席は送らない |
Amazon の画像配信(m.media-amazon.com) |
荷物の商品サムネイル画像の取得 | 注文メールに記載された画像 URL への取得リクエストを送ります。画像の取得に伴い、通信元の IP アドレスなどの通常の通信情報も送信されます。注文番号・追跡番号・氏名・住所を追加して送ることはありません。商品画像の取得は設定でオフにできます |
分析ビーコン・広告ネットワーク・クラッシュレポート SDK は組み込んでいません。第三者 SDK は RevenueCat(Purchases)のみです。
3-0. Aifuda Pro(サブスクリプション)について
- 決済とサブスクの契約当事者は Apple です。価格・トライアル・解約は App Store / iOS の設定に従います
- アプリは RevenueCat SDK を使い、匿名 ID で entitlement(
pro)の有無を確認します。氏名・メールアドレスなどのアカウントを Aifuda 側で作りません - App Store Connect の App Privacy では、Purchases(Purchase History)(RevenueCat の案内どおり、用途: App Functionality / Analytics)、Other User Content(Wallet リンクで共有する
.pkpass、用途: App Functionality)、Device ID(App Attest と Live Activity、用途: App Functionality)、および Search History(画像取り込み時の短い検索クエリ、用途: App Functionality)を申告します。Purchases と Search History は身元に紐付けず、予約内容を含み得る Other User Content と端末を継続して識別する Device ID は Apple の定義で端末に紐付くものとして申告します。いずれもトラッキングには使いません
3-1. メール本文について
Gmail API / Microsoft Graph へのリクエストは端末から直接行います。開発者のサーバは経由しません。取得したメール本文を Aifuda のサーバへ送ることはありません。Outlook とサンプルでは、予約として読み取れたメールの本文を端末内のデータベースに保存し、アプリの中で見返せるようにします(上記 2-6)。Gmail の本文は保存しません。予約と認識できなかったメールは、その場で破棄します。
アプリは次の2種類の検索条件を使います。(1) 対応している予約サービスの送信元による条件と、(2) 送信元を限定しない subject:予約確認 のような件名による条件です。件名の条件で取得する候補メールの通数には、1回の同期ごとに上限があります。これらの条件に一致したメールは端末へ取得し、端末上で予約かどうかを判定します。
件名の条件で対応していない送信元から取得したメールを保存するのは、本文に Aifuda が対応する schema.org 形式の予約用構造化データが含まれ、予約として認識できた場合だけです。予約と認識できなかったメールは、本文も件名も判定後すぐに破棄し、保存しません。
Aifuda Pro の設定(既定はオフ)を明示的にオンにした場合に限り、こうしたメールの本文をオンデバイスモデルも読みます。この場合は schema.org の構造化データが無いメールでも、モデルが予約と読み取れたものは保存します。モデルが読んだ予約には「端末で読取」の印が付き、アプリ内で元のメールと見比べられます。
3-2. Apple Wallet パスの署名について
Apple Wallet のパス(.pkpass)には、Apple が発行した証明書による署名が必要です。この署名鍵をアプリに同梱することは Apple の規約上も安全上も許されないため、署名だけを開発者のサーバに依頼します。
このときサーバに送るのは manifest.json だけです。これは「ファイル名 → そのファイルの SHA-1 ハッシュ値」の辞書で、予約の内容(駅名・座席・時刻・お預かり番号)は含まれません。パス本体(pass.json)も画像も、署名のときには送りません。
ここで説明しているのは自分の Wallet にパスを入れるときの話です。パスを他の人に渡す「Wallet リンク」を作ったときだけは、パスのファイルそのものをサーバに預けます — 下記 3-4 を必ずお読みください。
サーバは受け取った manifest.json の中身をログに記録しません。記録するのはバイト数・ファイル数・エラー理由コードだけです。署名を返した後、リクエストの内容は保持しません。
正確を期すための注記: SHA-1 ハッシュは「送っていない」ことの説明であって、暗号学的な秘匿の保証ではありません。パスのテンプレートと候補値を知っている者が総当たりを行えば、元の値を推測できる可能性は理論上あります。私たちは「予約の内容をサーバに送らない」と述べているのであって、「サーバから復元不可能である」とは述べていません。
3-3. 画像からの取り込みでの事実確認検索について
画像からの取り込みでは、画像の OCR と構造化は端末内のオンデバイス言語モデルで行います。画像そのものと OCR 全文は端末から出しません。
モデルが空港コードや便名などを解釈するために、短い検索クエリだけを DuckDuckGo へ送ることがあります(例: NGS airport Japan)。氏名・座席・確認番号・OCR 全文はクエリに含めないよう指示・長さ制限しています。この経路は画像からの取り込みに限り、メール本文のオンデバイス抽出には使いません(Gmail Limited Use との整合)。検索クエリの取り扱いは DuckDuckGo のプライバシーポリシーに従います。
3-4. 「Wallet リンク」で他の人にパスを渡すときについて
予約を共有するとき、共有シートで 「Wallet リンク」を選んだ場合だけ、アプリは組み上がった .pkpass ファイルを Aifuda のサーバに預け、相手がそこから開ける短い URL を作ります。これは「相手の iPhone の Wallet に、予約の控えを追加してもらう」ための唯一の方法です(Wallet はファイルを URL から取得するため)。
したがって、この操作をしたときに限り、パスの中身がサーバに置かれます。中身には共有相手に見せるための情報 — 区間や施設名・日時・列車名や便名・座席・予約番号・住所・電話番号など、券面と裏面に出る値 — が含まれます。共有シートで「テキスト」だけを選んだ場合、この経路は発生しません。
- 保存期間は最長 48 時間です。期限が来るとサーバから自動的に削除され、URL は無効になります(期限前に手元から取り消す手段はありません)
- URL には推測できない乱数のトークンが入っています。この URL を持っている人は誰でも中身を取得できます — 送り先を選んでください
- サーバはファイルを不透明なデータとしてだけ扱います。中身を解析せず、ログにも記録しません(記録するのはバイト数と結果コードだけです)
- 券面に載せた写真は共有リンクに含めません(写真は自分の Wallet に入れるパスにだけ焼き込まれます)
- 受け取った人がパスを Wallet に追加した後は、そのパスは相手の端末にあります。Aifuda から消すことはできません
3-4a. 「Aifuda のリンク」で他の人に予約そのものを渡すときについて
共有シートには「Wallet リンク」とは別に 「Aifuda のリンク」 があります。こちらを選ぶと、相手が Aifuda を入れていれば自分の fuda として取り込めるリンクができます。
このリンクは開発者のサーバを 1 度も通りません。 予約の要約そのものが、リンクの # から後ろ(フラグメント)に圧縮して入っています。フラグメントはウェブの仕組み上サーバへ送られない部分なので、開発者はこのリンクが作られたことも、渡されたことも知りません。上記 3-4 の「最長 48 時間サーバに預かる」は 「Wallet リンク」だけの話です。
- リンクに入るのは、券面と共有テキストに既に出ている値だけです — 種別・区間や施設名・日時・座席・予約番号・住所や電話などの連絡先
- 入らないもの: メール本文、会員 ID とその変換値、IC カード番号、同行者や宿泊代表者の氏名、支払い手段、金額、メモ。これらはリンクの形式そのものに欄がありません(「消し忘れ」が起こらない作りです)
- リンクを受け取った側では、取り込む前に中身の要約が表示され、「取り込む」を押したときだけ保存されます
- リンクは転送できます。リンクを入手した人は誰でも中身を読めます — 送り先を選んでください。取り消す手段はありません(サーバに置いていないため、消しに行く先がありません)
- 受け取った側の Aifuda では、この予約は「共有リンクで受け取った予約」と表示されます。元のメールは付きませんし、元の予約内容が変わっても相手には届きません
3-5. 端末確認(App Attest)と Live Activity の自動開始について
署名と共有のサーバは、要求が本物の iPhone 上の本物の Aifuda から来ていることを Apple の App Attest で確認します。これは第三者にサーバを踏み台にされないための措置です。このときサーバは、端末ごとの鍵の ID・その公開鍵・署名回数のカウンタ・最後に使われた日時を保存します。氏名・メールアドレス・Apple ID とは結び付けませんが、同じ端末を継続して区別するため、App Store の表示では Device ID を「端末に紐付く」ものとして申告します。接続元 IP アドレスは不正利用を防ぐレート制限にも使います。
Live Activity の自動開始(Aifuda Pro)を使うと、サーバは加えて、APNs のプッシュトークンと、「いつ Live Activity を出すか」の予定表を保持します。予定表に入るのは発火時刻と、端末内の秘密で鍵付きハッシュにした予約の識別子だけで、駅名・座席・列車名・確認番号は含まれません(Apple の APNs を通るペイロードにも入りません)。予定は発火したら即座に削除されます。この機能を使わない場合、予定表は空のまま送られ、サーバ側の記録も消えます。
4. Google ユーザーデータの取り扱い(Limited Use)
Gmail 連携は現在配信中のビルドでは利用できません。 Google 側の OAuth 審査(restricted scope verification)が完了するまでの間、意図的に無効化しています。この章は Gmail を有効化する時点で適用される取り扱いを説明したものです。
Gmail 連携を使う場合、Aifuda は https://www.googleapis.com/auth/gmail.readonly(読み取り専用)スコープのみを要求します。メールの送信・変更・削除は行いません。
Aifuda が Google API から受け取った情報の利用および他のアプリへの転送は、Google API Services User Data Policy(Limited Use 要件を含む)に準拠する方針です。
具体的には、Aifuda は Google ユーザーデータについて次を行わない方針です:
- 広告目的での利用・転送・販売(リターゲティング、パーソナライズ広告、興味関心ベース広告を含む)
- 人による閲覧(セキュリティ目的、法令遵守、ユーザーの明示的な同意がある場合を除く。現時点でそのような閲覧の仕組みは存在しません)
- AI / 機械学習モデルの学習・改善への利用
- 第三者への提供・販売
- 機能提供に必要な期間を超える永続的なコピーの保持。Gmail から届いたメールの本文は保存しません(上記 2-6)。読み取った予約や荷物の構造化情報は、削除・全削除・16通の上限のいずれかまで端末内に残ります
Gmail から取得したメール本文は端末内でのみ扱い、開発者のサーバには一切送信しません。本文は保存せず、取り出された予約情報と荷物の情報だけが端末内に残ります。以前のビルドで残っていた Gmail 由来の本文は、同期のたびに消します。
連携の取り消し: アプリ内の「連携」画面から「連携を解除」を選ぶと、端末に保存されたトークン・接続アドレス・そのアカウント由来の保存本文を削除します(予約情報は残ります)。Google アカウントのセキュリティ設定からだけアクセス権を取り消した場合、端末内に保存されたトークンや本文は自動では消えません。確実に消すにはアプリ内の「連携を解除」も行ってください。
5. Microsoft Graph(Outlook)の取り扱い
Outlook 連携を使う場合、Aifuda は Mail.Read(読み取り専用)、User.Read、offline_access、openid のスコープのみを要求します。User.Read は接続したアカウントのメールアドレスを1回だけ読み、連携画面の表示に使うためのものです(上記 2-2)。メールの送信・変更・削除は行いません。
Microsoft Graph へのリクエストは端末から直接行い、メール本文を Aifuda のサーバへ送ることはありません。予約として認識したメールの本文は、上記 2-6 のとおり端末内に残します(Gmail とはここが違います)。取得したデータを広告に利用すること、第三者に提供すること、モデルの学習に使うことはありません。
連携の取り消し: アプリ内の「連携」画面から解除できます。この操作は端末に保存されたトークン・接続アドレス・そのアカウント由来の保存本文を削除します(予約情報は残ります)。Microsoft アカウントのアプリとサービス(職場・学校アカウントの場合は My Apps)からだけ権限を取り消した場合、端末内に保存されたトークンや本文は自動では消えません。確実に消すにはアプリ内の「連携を解除」も行ってください。
6. 位置情報・写真・連絡先・カレンダー
現在地は取得しません。 端末の位置を読む仕組み(CLLocationManager)を使っておらず、位置情報の権限も要求しません。連絡先とカレンダーにも触れません。
ただし地図を描くために、予約に書かれた場所を Apple の地図サービスへ送ります。 送るのは次の 2 つの場面だけです。
- Wallet パスに「その場所に近づいたら出す」条件を入れるとき、予約に書かれた住所の文字列を Apple のジオコーダ(
CLGeocoder)で緯度経度に変換します - パスの地図サムネイルと、共有する地図の画像を描くとき、発着地の緯度経度を Apple の地図サービス(
MKMapSnapshotter)へ渡します
いずれも送り先は Apple で、開発者のサーバは経由しません。送るのは予約に書かれた場所だけで、現在地は含まれません。Apple 側での取り扱いは Apple のプライバシーポリシーによります。
写真ライブラリへのアクセス権も要求しません。 スクリーンショットからの取り込みと、Wallet パスの券面に使う写真は、iOS の写真ピッカーで選んだ 1 枚だけがアプリに渡る仕組みです(アプリはライブラリを見られません)。選んだ写真は端末内だけで処理され、券面用に切り取った画像は端末内にのみ保存されます(iCloud バックアップからは除外)。サーバには送りません — Wallet パスの署名でサーバへ送るのは manifest.json(ファイル名とチェックサムの辞書)だけで、画像そのものは 1 バイトも出ません。他の人に渡す共有リンクにも、この写真は含めていません。
カメラは、「写真を撮る」を選んだときだけ使います。 紙のチケットやほかの端末の画面をその場で撮って読み取るための導線で、許可を求めるのはそのボタンを選んだ瞬間です(断ってもアプリの他の機能は変わりません)。撮った写真の扱いはピッカーで選んだ写真とまったく同じで、読み取りは端末内で行い、写真そのものはサーバへ送りません。カメラを裏で開くことも、動画や音声を録ることもありません。
自己紹介カードの画像だけは扱いが逆です。 カードは渡すために作るものなので、設定した画像はパスの中に入り、Wallet からカードを共有すると相手にも渡ります(上記 2-5)。この受け渡しも Wallet が直接行うもので、開発者のサーバは経由しません。
7. トラッキングと広告
トラッキングは行いません。 広告識別子(IDFA)を取得せず、App Tracking Transparency の許可も求めません。広告は表示しません。他社のトラッキング SDK は組み込んでいません。
8. 子どもの個人情報
Aifuda は子どもを対象としたアプリではありません。開発者がメール本文を受け取ることはなく、子どもの個人情報を意図的に開発者側へ収集することもありません。
9. データの削除
| 消したいもの | 方法 |
|---|---|
| 保存された予約情報 | 予約ごとの削除、設定の「すべての予約を削除」、またはアプリの削除 |
| 保存された元メールの本文 | その予約を削除すると一緒に消えます。連携を解除すると、そのアカウントから取り込んだぶんがすべて消えます。1予約あたり16通を超えた分は、古いものから自動的に消えます |
| アクセストークン | アプリ内「連携」画面の「連携を解除」。またはアプリ削除 |
| Google / Microsoft 側のアクセス権 | 上記 4 章・5 章のリンクから取り消し(端末内のトークンやコピーは別。上記 2 行の操作が必要です) |
| 開発者が保持しているデータ | 恒久的な予約データベースはありません。「Wallet リンク」の .pkpass は48時間で削除します。端末確認・Live Activity・不正利用防止の値は機能とセキュリティに必要な間保持します(3-5、11章) |
Aifuda はユーザー登録を必要としないため、削除すべきアカウントも存在しません。
10. 第三者への提供
個人情報を広告・販売目的で第三者に提供することはありません。提供するのは、ユーザーが明示的に選んだ共有(「Wallet リンク」/「Aifuda のリンク」。後者はサーバを通らず、渡す相手をユーザー自身が選びます)と、上記 3 章に記載した処理先への送信だけです。法令に基づく開示請求があった場合、開発者が開示できるのは 3-4・3-5 に記載したデータに限られます。
11. データの保存場所と期間
予約情報はすべてユーザーの iPhone 内にあります。開発者側に恒久的な予約のデータベースはありません。予約情報は、個別削除・「すべての予約を削除」・アプリの削除のいずれかまで端末内に保存されます。元メールの本文はこれに加えて、1予約あたり16通の上限を超えたときと、アカウントの連携を解除したときにも削除されます。
開発者のサーバ(Cloudflare)に置かれるものは次のとおりです。恒久的な予約データベースはありません。
- 「Wallet リンク」で共有したパス — 最長 48 時間で自動削除(上記 3-4)
- 「Aifuda のリンク」で共有した予約 — サーバに保存されません(リンク自体に入っています。上記 3-4a)
- 端末確認と Live Activity のための値 — 端末ごとの鍵 ID・公開鍵・署名回数・最終利用日時・プッシュトークン・開始予定(上記 3-5)。予定は発火時に削除されます。端末確認の鍵と有効なプッシュトークンには現在固定の保持期限を設けておらず、機能・不正利用防止に必要な間保持します
- 不正利用防止のレート制限状態 — 接続元 IP アドレスをキーにした利用回数・最終更新時刻。現在固定の保持期限を設けておらず、レート制限に必要な間保持します
- 画像取り込み時の短い検索クエリ — 開発者のサーバには保存せず、DuckDuckGo へ直接送られます(3-3)
12. ポリシーの変更
内容を変更する場合は、このページの「最終更新日」を更新します。重要な変更がある場合はアプリの更新情報でもお知らせします。
13. お問い合わせ
- メール:
biwashi.dev@gmail.com - 開発者: Shota Iwami
Privacy Policy
Aifuda is an iOS app that surfaces reservations buried in your mailbox at the moment you need them.
The design principle in one sentence: mail bodies are not sent to Aifuda’s servers. The details follow.
1. Summary
| Personal data database kept by the developer | None |
| Analytics / advertising / tracking SDKs | No ads or tracking SDKs (RevenueCat only, for subscriptions) |
| Advertising | None |
| Sign-up or account creation | Not required (except Apple ID for App Store purchases) |
| Where mail bodies are sent | Not to Aifuda’s servers. They are read on device. Outlook and the sample keep the body of a recognized reservation on the device so you can read it again in the app (2-6). Gmail bodies are not kept. Mail that is not recognized as a reservation is discarded on the spot |
| What the developer's server receives | The manifest.json of an Apple Wallet pass (a dictionary of file names and hashes) and the values needed for the device check and Live Activities (3-5). Only when you hand a pass to someone else as a “Wallet link” is the pass file itself held, for at most 48 hours (3-4). An Aifuda link shares its payload directly and does not use the server (3-4a) |
| Subscriptions | Aifuda Pro via Apple / RevenueCat. Purchase history is disclosed in the App Store privacy label |
2. What is stored on your device only
2-1. Reservations (SwiftData, app-private container)
The structured reservation extracted from the mail is stored. Outlook and the sample also keep the body of the mail it came from, linked to that reservation (see 2-6). Bodies from Gmail are not stored.
Stored fields:
- Route (departure and arrival stations), train name, departure and arrival times
- Car number, seat number, number of seats
- Confirmation number
- Fare amounts (face value / charged / refunded)
- The "as of" timestamp of the information
- An internal identifier for the mail template the data came from
Not stored — "not stored" here means not extracted into a structured field. If a value below appears verbatim in the mail body, Outlook and the sample keep that body per 2-6 whenever the mail is recognized as a reservation. Gmail does not keep the body, so those values do not remain as part of a stored email either:
- The body or subject of mail that is not recognized as a reservation (discarded on the spot; Outlook and the sample keep a recognized body per 2-6; Gmail bodies are not stored)
- The HTML version of a mail, and ordinary attachments (PDF, ICS, images, etc.). Only the plain-text body is stored. The exception is
.pkpass— when a recognized email carries an issuer-signed Apple Wallet pass, it is stored on device so it can be added to Wallet later (up to 8, deleted automatically at most 7 days after the reservation starts, excluded from iCloud backup) - The membership ID is not extracted into a structured field. It is only hashed with SHA-256 to build a unique key; only the first 16 hex digits are kept
- IC card numbers are not extracted into a structured field (discarded during parsing)
- Names or contacts are not extracted into a structured field. The intro card you fill in yourself is separate; see 2-5
- Email addresses are not extracted into a structured field. The only address kept in the Keychain is the one for the account you connect (see 2-2); the sender address of each mail is stored as metadata under 2-6
If a membership ID, IC card number, name, or contact detail appears verbatim in an Outlook or sample email that was recognized as a reservation, it remains in the stored body as part of that email (see 2-6). Gmail does not keep the body, so those values do not remain that way.
This data lives in the app's private container and is covered by iOS Data Protection. The developer cannot access it.
2-2. Access tokens (iOS Keychain)
If you connect Gmail or Outlook, the access and refresh tokens are stored only in the iOS Keychain. They are never written to preferences, logs, or any server.
The email address of the account you connect is stored in the same Keychain. It is used only to show which account is connected on the Accounts screen, it is not sent to Aifuda’s servers or written to logs, and it is deleted when you disconnect.
2-3. App settings (UserDefaults)
Only non-secret values: OAuth client IDs, the Wallet signing server URL, Pass Type ID, and Team ID. The signing server's auth token is the one exception and is stored in the Keychain.
2-4. Widget snapshot (App Group container)
To render the home screen / lock screen widget and the Live Activity, the app writes a JSON file containing only what is displayed: train name, departure and arrival stations, departure and arrival times, the first seat, and the seat count.
It deliberately excludes the confirmation number, fare amounts, and the membership ID hash, because that data would otherwise appear on the lock screen.
2-5. Your intro card (what you type in yourself)
Aifuda lets you build an intro card you can hand over like a business card. This is the one place where the app stores information you typed, rather than anything read from mail.
Stored: display name, the fields you arranged (a title and its content — how many, and what they are called, is up to you), the images you set on the card (the band and the icon), and — only if you set the QR code to “contact” — an email address and a phone number.
- It lives in the same app-private container on your device as the reservations. The developer has no access to it
- It is never sent to the developer’s server. Adding the card to Apple Wallet still sends only
manifest.json, a dictionary of file names and checksums (§3-2) - Put a URL in a field and the app shows the mark and handle of that service (GitHub, X, and so on). That is decided on the device by reading the URL; the service itself is never contacted
- The email address and phone number appear only inside the card’s QR code, never printed on the face of the card. You choose who gets to scan it
- The images you set are embedded in the pass. A card is made to be handed over, so sharing it from Wallet hands the images over too (the opposite of how reservation passes are treated — see §6). That happens directly from Wallet, never through the developer’s server
- Sharing by “Wallet link” (§3-4) covers reservation passes only. An intro card never becomes a share link
- It does not appear in widgets, Live Activities, or Next fuda
- Deleting the card removes it — images included — from the device. A pass you already added is removed from within Wallet
2-6. The original mail
For Outlook and the sample, when mail is recognized as a reservation, the body is stored on your device and can be read again from the reservation’s detail screen. Values in the body that match the current reservation may be highlighted in yellow; wording differences can keep a value from being highlighted.
Bodies from Gmail are not stored. Only the structured reservation or package Aifuda read remains. Any Gmail body left by an earlier build is deleted on each sync.
- What is stored is the plain-text body, plus metadata used to display it, deduplicate it, and open the original mail (subject, sender address, received time, mail identifiers, and the source account). The HTML version and ordinary attachments are not stored (the
.pkpassexception is described in 2-1) - Up to 256K characters are stored per email; any remainder is not stored
- It lives in the same app-private container as the reservations. It is never sent to the developer’s servers
- Aifuda never automatically sends it to a Wallet pass, the Lock Screen, a Live Activity, a widget, or shared text. You can select and copy it from the detail screen inside the app. Depending on your iOS backup settings, it may be included in your device backup
- A reservation may have multiple source emails (booking, seat assignment, reminders). Up to 16 are kept per reservation; beyond that the oldest are dropped
- Mail that is not recognized as a reservation has neither its body nor its subject stored. Outlook and the sample keep only mail from which a reservation was extracted. Gmail bodies are not kept
- Deleting a reservation deletes the bodies linked to it
- Choosing “Disconnect” in the app deletes every body taken from that account (the reservations themselves remain). If you only revoke access from Google’s or Microsoft’s own settings, the locally stored copies are not deleted automatically (see sections 4 and 5)
- Reservations imported before this feature existed have no body attached. For those, the “Original mail” section does not appear at all
3. Network traffic that leaves your device
These are the only destinations the app contacts:
| Destination | Purpose | What is sent |
|---|---|---|
Google (accounts.google.com, oauth2.googleapis.com, gmail.googleapis.com) |
Gmail integration, only if you enable it | Authorization requests, sender filters such as from:expy.jp, and subject filters such as subject:reservation (see 3-1). Retrieved messages are processed on device, and Aifuda does not transmit their bodies to the developer's servers or any other service (see 2-6 regarding iOS backups) |
Microsoft (login.microsoftonline.com, graph.microsoft.com) |
Outlook integration, only if you enable it | Same as above |
| Apple (App Store / StoreKit) | Purchase, restore, and receipt validation for Aifuda Pro | What Apple’s billing flow requires (Apple processes payment) |
| RevenueCat | Entitlement checks and fraud prevention | Anonymous app user ID and purchase / receipt material. Mail bodies and reservation contents are never sent |
| Aifuda signing server | Signing an Apple Wallet pass, only if you use that feature | Only the bytes of manifest.json (see 3-2) |
| Aifuda share server (same host as the signing server) | Only when you share a reservation and pick “Wallet link” | The assembled .pkpass itself — the file the other person adds to Wallet (see 3-4). Deleted automatically within 48 hours |
| Aifuda server (device check / Live Activity) | Verifying that a signing or sharing request comes from a genuine device (App Attest), and starting Live Activities automatically (Aifuda Pro) | A per-device key ID and public key, an APNs push token, a start time, and a keyed hash of the reservation identifier (see 3-5). Station names, seats, and confirmation numbers are never sent |
DuckDuckGo (html.duckduckgo.com) |
During image import only, when the on-device model needs a short factual lookup (airport codes, flight numbers, etc.) | Only a short search query generated by the model (see 3-3). The image, full OCR text, passenger names, and seats are not sent |
Amazon image CDN (m.media-amazon.com) |
Downloading product thumbnails for parcels | A request to the image URL in the order email, along with standard network information such as your IP address. The app does not add order numbers, tracking numbers, names, or addresses to the request. You can turn off product image downloads in Settings |
There are no analytics beacons, ad networks, or crash-reporting SDKs. The only third-party SDK is RevenueCat (Purchases).
3-0. Aifuda Pro (subscriptions)
- Payment and the subscription contract are with Apple. Price, trials, and cancellation follow the App Store / iOS Settings
- The app uses the RevenueCat SDK with an anonymous ID to check the
proentitlement. Aifuda does not create an account with your name or email - In App Store Connect App Privacy, we declare Purchases (Purchase History) (as RevenueCat documents; App Functionality / Analytics), Other User Content (the
.pkpassshared through a Wallet link; App Functionality), Device ID (App Attest and Live Activities; App Functionality), and Search History (the short query used during image import; App Functionality). Purchases and Search History are not linked to identity. Other User Content may contain reservation details, and Device ID persistently distinguishes the same device, so both are declared as linked under Apple’s definition. None is used for tracking.
3-1. Mail bodies
Requests to the Gmail API and Microsoft Graph are made directly from your device. They do not pass through the developer's servers. Retrieved mail bodies are not sent to Aifuda’s servers. Outlook and the sample store the body of a recognized reservation in the on-device database so you can read it again in the app (see 2-6). Gmail bodies are not stored. Mail that is not recognized as a reservation is discarded on the spot.
The app uses two types of search filters: (1) sender filters for the reservation services Aifuda supports, and (2) subject filters such as subject:reservation, applied whatever the sender. The number of candidate messages retrieved through subject filters is limited per sync. Messages matching either filter are retrieved to your device and evaluated there.
A message retrieved from an unsupported sender through a subject filter is saved only when its body contains reservation structured data in a schema.org format Aifuda supports and Aifuda recognizes it as a reservation. Once Aifuda determines that a message is not a reservation, its body and subject are discarded immediately and never stored.
Only if you explicitly turn on the Aifuda Pro setting (off by default) does the on-device model also read the bodies of these messages; in that case a message without schema.org data can still be saved when the model reads a reservation out of it. A reservation read by the model is marked “On-device” so you can compare it with the original mail inside the app.
3-2. Apple Wallet pass signing
An Apple Wallet pass (.pkpass) must be signed with a certificate issued by Apple. Bundling that signing key inside the app is prohibited by Apple's terms and unsafe in any case, so the signing step alone is delegated to the developer's server.
Only manifest.json is sent. It is a dictionary mapping file names to SHA-1 hashes; it contains none of the reservation's content (stations, seats, times, confirmation number). The pass body (pass.json) and the images are not sent for signing.
This describes adding a pass to your own Wallet. There is one case where the pass file itself does leave the device: when you create a “Wallet link” to hand the pass to someone else. Please read 3-4 below.
The server does not log the contents of manifest.json. It logs only byte counts, file counts, and error reason codes, and it retains nothing after returning the signature.
A precise note: the SHA-1 hashes explain what is not sent; they are not a cryptographic guarantee of secrecy. Someone who knows the pass template and the candidate values could in principle recover them by brute force. Our claim is that reservation content is not sent to the server — not that it would be unrecoverable from what is sent.
3-3. Factual web lookup during image import
For image import, OCR and structuring run with the on-device language model. The image itself and the full OCR text never leave the device.
When the model needs help interpreting an airport code or flight number, it may send only a short search query to DuckDuckGo (for example NGS airport Japan). Prompts and length limits keep passenger names, seats, confirmation numbers, and full OCR out of the query. This path is used only for image import, not for on-device extraction of mail bodies (to stay aligned with Google Limited Use). DuckDuckGo handles the query under its Privacy Policy.
3-4. Handing a pass to someone else with a “Wallet link”
When you share a reservation and pick “Wallet link” in the share sheet — and only then — the app uploads the assembled .pkpass file to Aifuda's server and creates a short URL the other person can open. This is the only way to put a copy of your reservation into someone else's Wallet, because Wallet fetches the file from a URL.
So this action, and only this action, places the contents of the pass on the server. Those contents are what you intend the other person to see: route or venue, date and time, train or flight number, seat, reservation number, address, and phone number — the values printed on the front and back of the pass. Sharing as plain text does not use this path.
- It is kept for at most 48 hours, then deleted automatically and the URL stops working. There is no way to revoke it earlier from your device
- The URL carries an unguessable random token. Anyone who has the URL can fetch the file — choose who you send it to
- The server treats the file as opaque bytes. It does not parse the contents and does not log them (it logs byte counts and result codes only)
- A photo you put on your own pass is not included in the shared copy — it is baked only into the pass added to your own Wallet
- Once the recipient adds the pass, it lives on their device. Aifuda cannot remove it
3-4a. Handing a reservation to another Aifuda user with an “Aifuda link”
The share sheet also offers an “Aifuda link”. If the recipient has Aifuda, they can import the reservation as their own fuda.
This link never passes through the developer’s server. A compressed reservation summary is carried after the # in the link. That fragment is not sent to a web server, so the developer does not know that the link was created or shared. The 48-hour server retention in 3-4 applies only to a Wallet link.
- The link carries only values already shown on the pass and share text: kind, route or venue, date and time, seat, reservation number, address, and phone number
- It has no fields for the mail body, membership ID or its derived value, IC card number, names of companions or hotel guests, payment method, amounts, or notes
- The recipient sees a summary first and nothing is saved until they choose Import
- The link can be forwarded, and anyone who obtains it can read its contents. Choose where you send it. It cannot be revoked because it is not stored on a server
- The imported reservation is marked as received through a shared link. It has no original mail and does not update if the source reservation changes
3-5. Device check (App Attest) and automatic Live Activities
The signing and sharing server verifies with Apple's App Attest that a request comes from a genuine copy of Aifuda on a genuine iPhone, so that the server cannot be abused by third parties. To do that it stores a per-device key ID, its public key, a signature counter, and timestamps. They are not tied to your name, e-mail address, or Apple ID, but they do persistently distinguish the same device; this is why Device ID is declared as linked in the App Store privacy label. The source IP address is also used for anti-abuse rate limits.
If you use automatic Live Activities (Aifuda Pro), the server additionally keeps an APNs push token and a schedule of when to start a Live Activity. The schedule holds only the fire time and a keyed hash of the reservation identifier computed with a secret held on your device; station names, seats, train numbers, and confirmation numbers are not included (and never appear in the payload that passes through Apple's APNs either). Each entry is deleted as soon as it fires. If you do not use the feature, an empty schedule is sent and the server-side record is cleared.
4. Google user data (Limited Use)
The Gmail integration is not available in the currently shipping build. It is intentionally disabled while Google's OAuth review (restricted scope verification) is in progress. This section describes the handling that will apply once it is enabled.
When you use the Gmail integration, Aifuda requests only the https://www.googleapis.com/auth/gmail.readonly scope. It never sends, modifies, or deletes mail.
Aifuda's use and transfer to any other app of information received from Google APIs is intended to adhere to the Google API Services User Data Policy, including the Limited Use requirements.
Specifically, Aifuda's intent is not to:
- Use or transfer Google user data for advertising, including retargeting, personalized advertising, or interest-based advertising
- Allow humans to read the data, except for security purposes, to comply with applicable law, or with your explicit consent (no such mechanism exists today)
- Use the data to train or improve AI/ML models
- Sell or transfer the data to third parties
- Retain persistent copies beyond what is required to provide the feature. Bodies from Gmail are not stored (see 2-6). Structured reservations and packages stay on the device until they are deleted, all items are deleted, or the 16-per-reservation cap is reached
Mail bodies retrieved from Gmail are handled entirely on device and are never transmitted to the developer's servers. The body is not stored; only the extracted reservation or package remains on the device. Any Gmail body left by an earlier build is deleted on each sync.
Revoking access: choosing "Disconnect" on the Accounts screen in the app deletes the stored token, the connected address, and the bodies stored for that account (reservations remain). If you revoke access only from your Google Account permissions page, the locally stored token and bodies are not deleted automatically — use "Disconnect" in the app as well to remove them.
5. Microsoft Graph (Outlook)
When you use the Outlook integration, Aifuda requests only Mail.Read, User.Read, offline_access, and openid. User.Read is used once, to read the address of the account you connected so the Accounts screen can show it (see 2-2). It never sends, modifies, or deletes mail.
Requests to Microsoft Graph go directly from your device. Mail bodies are not sent to Aifuda’s servers. The body of an email from which a reservation was extracted is kept on the device as described in 2-6 (this is the difference from Gmail). The data is never used for advertising, transferred to third parties, or used to train models.
Revoking access: choosing "Disconnect" on the Accounts screen in the app deletes the stored token, the connected address, and the bodies stored for that account (reservations remain). If you revoke access only from Microsoft account apps and services (or My Apps for work or school accounts), the locally stored token and bodies are not deleted automatically — use "Disconnect" in the app as well to remove them.
6. Location, photos, contacts, calendar
Your location is never read. The app does not use the framework that reads the device’s position (CLLocationManager) and never prompts for location permission. Contacts are not touched either.
Your calendar is read only after you ask for it. Two places do it, and both request calendar permission at that moment: the “Import from calendar” screen, where you pick the events, and the “Auto-import events with a place” setting, which is off by default and explained in full before it can be turned on. With that setting on, Aifuda looks at events from yesterday through the next six months while the app is open or coming back to the foreground, and imports only those that have a place, a title, and a start time — never all-day events, invitations you declined, birthdays, or subscribed calendars such as holidays. It never reads your calendar in the background. Only the fields shown on a fuda are stored (title, place, times); event notes and attendees are not. Deleting a fuda keeps that event from being imported again.
Drawing a map does send the places written in your reservation to Apple, in exactly two situations:
- When a Wallet pass is given a “show this when you get there” condition, the address text from the reservation goes to Apple’s geocoder (
CLGeocoder) to be turned into coordinates - When the map thumbnail on a pass, or the map image in a share, is drawn, the coordinates of the origin and destination go to Apple’s map service (
MKMapSnapshotter)
Both go to Apple, not to the developer’s server. What is sent is the place written in the reservation — never where you are now. Apple’s own handling is covered by the Apple Privacy Policy.
The app never asks for photo library access either. Importing a screenshot, and choosing the picture for a Wallet pass, both go through the iOS photo picker: only the single image you pick is handed to the app, which cannot see the rest of your library. That image is processed entirely on the device, and the cropped version is stored only on the device (and excluded from iCloud backup). It is never uploaded — signing a Wallet pass sends only manifest.json, a dictionary of file names and checksums; not one byte of the image leaves the phone. Share links you send to other people do not carry the picture either.
The camera is used only when you tap “Take a photo” and open it. Aifuda asks for permission at that moment, so you can read reservation details straight off a paper ticket or another device’s screen. Declining changes nothing else — importing an image you pick still works. The captured photo is not added to your photo library, and it is handled exactly like an image you pick: text recognition and reservation extraction run on the device, and the photo itself is never uploaded. Aifuda does not open the camera in the background, and does not record video or audio.
Images on an intro card are the one exception, by design. A card is made to be handed over, so the images you set are embedded in the pass and travel with it when you share the card from Wallet (§2-5). That hand-off is Wallet’s own; it does not pass through the developer’s server.
7. Tracking and advertising
No tracking. The app does not read the advertising identifier (IDFA), does not present an App Tracking Transparency prompt, and shows no ads. No third-party tracking SDKs are embedded.
8. Children's privacy
Aifuda is not directed at children. Mail bodies are never transmitted to the developer, and the developer does not knowingly collect children's personal data.
9. Deleting your data
| What | How |
|---|---|
| Stored reservations | Delete a reservation, use “Delete all reservations” in Settings, or delete the app |
| Stored original mail bodies | Deleting a reservation deletes them with it. Disconnecting an account deletes every body taken from that account. Anything beyond the 16-per-reservation cap is dropped automatically, oldest first |
| Access tokens | "Disconnect" on the Accounts screen, or delete the app |
| Google / Microsoft access grants | Use the revocation links in sections 4 and 5 (this is separate from the local token and copies — use the two rows above for those) |
| Data held by the developer | There is no permanent reservation database. A .pkpass shared as a Wallet link is deleted within 48 hours. Values for device checks, Live Activities, and abuse prevention are kept while required for those functions and security (3-5, section 11) |
Aifuda requires no sign-up, so there is no account to delete.
10. Sharing with third parties
Personal data is never sold or shared for advertising purposes. What is shared is limited to what you explicitly choose to share (a "Wallet link") and the destinations described in section 3. In response to a lawful request, the developer can only disclose the data described in 3-4 and 3-5.
11. Storage location and retention
Your reservations live on your iPhone. There is no permanent reservation database on the developer's side. Reservations are kept until you delete them individually, use "Delete all reservations," or delete the app. Original mail bodies are also deleted when the 16-per-reservation cap is reached or when you disconnect the account.
The developer’s server (Cloudflare) holds the following. There is no permanent reservation database:
- A pass you shared as a “Wallet link” — deleted automatically within 48 hours (3-4 above)
- Values needed for the device check and Live Activities — a per-device key ID, public key, signature counter, last-seen time, push token, and pending start times (3-5 above). Schedule entries are deleted when they fire. Attestation keys and valid push tokens currently have no fixed retention period and are kept while needed for the feature and abuse prevention
- Anti-abuse rate-limit state — request counts and last-updated time keyed by source IP address. It currently has no fixed retention period and is kept while needed for rate limiting
- Short search queries during image import — not stored on the developer’s server; sent directly to DuckDuckGo (3-3)
12. Changes to this policy
If this policy changes, the "Last updated" date above is revised. Significant changes are also noted in the app's release notes.
13. Contact
- Email:
biwashi.dev@gmail.com - Developer: Shota Iwami