{"id":"68ec9d72-32df-43fe-bc15-4c26e08229ec","shortId":"YjYuhw","kind":"skill","title":"financekit","tagline":"Access Apple Card, Apple Cash, and Wallet financial data using FinanceKit. Use when querying transaction history, reading account balances, accessing Wallet orders, requesting financial data authorization, or building personal finance features that integrate with Apple's financia","description":"# FinanceKit\n\nAccess financial data from Apple Wallet including Apple Card, Apple Cash, and Apple Card Savings. FinanceKit provides on-device, offline access to accounts, balances, and transactions with user-controlled authorization. Targets Swift 6.3 / iOS 26+. Query APIs are available from iOS 17.4; background delivery requires iOS 26.\n\n## Contents\n\n- [Setup and Entitlements](#setup-and-entitlements)\n- [Data Availability](#data-availability)\n- [Authorization](#authorization)\n- [Querying Accounts](#querying-accounts)\n- [Account Balances](#account-balances)\n- [Querying Transactions](#querying-transactions)\n- [Long-Running Queries and History](#long-running-queries-and-history)\n- [Transaction Picker](#transaction-picker)\n- [Wallet Orders](#wallet-orders)\n- [Background Delivery](#background-delivery)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup and Entitlements\n\n### Requirements\n\n1. **Managed entitlement** -- request `com.apple.developer.financekit` from Apple via the [FinanceKit entitlement request form](https://developer.apple.com/contact/request/financekit/). This is a managed capability; Apple reviews each application.\n2. **Organization-level Apple Developer account** (individual accounts are not eligible).\n3. **Account Holder role** required to request the entitlement.\n\n### Project Configuration\n\n1. Add the FinanceKit entitlement through Xcode managed capabilities after Apple approves the request.\n2. Add `NSFinancialDataUsageDescription` to Info.plist -- this string is shown to the user during the authorization prompt.\n\n```xml\n<key>NSFinancialDataUsageDescription</key>\n<string>This app uses your financial data to track spending and provide budgeting insights.</string>\n```\n\n## Data Availability\n\nCheck whether the device supports FinanceKit before making any API calls. This value is constant across launches and iOS versions.\n\n```swift\nimport FinanceKit\n\nguard FinanceStore.isDataAvailable(.financialData) else {\n    // FinanceKit not available -- do not call any other financial data APIs.\n    // The framework terminates the app if called when unavailable.\n    return\n}\n```\n\nFor Wallet orders:\n\n```swift\nguard FinanceStore.isDataAvailable(.orders) else { return }\n```\n\nData availability returning `true` does not guarantee data exists on the device. Data access can also become temporarily restricted (e.g., Wallet unavailable, MDM restrictions). Restricted access throws `FinanceError.dataRestricted` rather than terminating.\n\n## Authorization\n\nRequest authorization to access user-selected financial accounts. The system presents an account picker where the user chooses which accounts to share and the earliest transaction date to expose.\n\n```swift\nlet store = FinanceStore.shared\n\nlet status = try await store.requestAuthorization()\nswitch status {\ncase .authorized:    break  // Proceed with queries\ncase .denied:        break  // User declined\ncase .notDetermined: break  // No meaningful choice made\n@unknown default:    break\n}\n```\n\n### Checking Current Status\n\nQuery current authorization without prompting:\n\n```swift\nlet currentStatus = try await store.authorizationStatus()\n```\n\nOnce the user grants or denies access, `requestAuthorization()` returns the cached decision without showing the prompt again. Users can change access in Settings > Privacy & Security > Financial Data.\n\n## Querying Accounts\n\nAccounts are modeled as an enum with two cases: `.asset` (e.g., Apple Cash, Savings) and `.liability` (e.g., Apple Card credit). Both share common properties (`id`, `displayName`, `institutionName`, `currencyCode`) while liability accounts add credit-specific fields.\n\n```swift\nfunc fetchAccounts() async throws -> [Account] {\n    let query = AccountQuery(\n        sortDescriptors: [SortDescriptor(\\Account.displayName)],\n        predicate: nil,\n        limit: nil,\n        offset: nil\n    )\n\n    return try await store.accounts(query: query)\n}\n```\n\n### Working with Account Types\n\n```swift\nswitch account {\ncase .asset(let asset):\n    print(\"Asset account, currency: \\(asset.currencyCode)\")\ncase .liability(let liability):\n    if let limit = liability.creditInformation.creditLimit {\n        print(\"Credit limit: \\(limit.amount) \\(limit.currencyCode)\")\n    }\n}\n```\n\n## Account Balances\n\nBalances represent the amount in an account at a point in time. A `CurrentBalance` is one of three cases: `.available` (includes pending), `.booked` (posted only), or `.availableAndBooked`.\n\n```swift\nfunc fetchBalances(for accountID: UUID) async throws -> [AccountBalance] {\n    let predicate = #Predicate<AccountBalance> { balance in\n        balance.accountID == accountID\n    }\n\n    let query = AccountBalanceQuery(\n        sortDescriptors: [SortDescriptor(\\AccountBalance.id)],\n        predicate: predicate,\n        limit: nil,\n        offset: nil\n    )\n\n    return try await store.accountBalances(query: query)\n}\n```\n\n### Reading Balance Amounts\n\nAmounts are always positive decimals. Use `creditDebitIndicator` to determine the sign:\n\n```swift\nfunc formatBalance(_ balance: Balance) -> String {\n    let sign = balance.creditDebitIndicator == .debit ? \"-\" : \"\"\n    return \"\\(sign)\\(balance.amount.amount) \\(balance.amount.currencyCode)\"\n}\n\n// Extract from CurrentBalance enum:\nswitch balance.currentBalance {\ncase .available(let bal):       formatBalance(bal)\ncase .booked(let bal):          formatBalance(bal)\ncase .availableAndBooked(let available, _): formatBalance(available)\n@unknown default: \"Unknown\"\n}\n```\n\n## Querying Transactions\n\nUse `TransactionQuery` with Swift predicates, sort descriptors, limit, and offset.\n\n```swift\nlet predicate = #Predicate<Transaction> { $0.accountID == accountID }\n\nlet query = TransactionQuery(\n    sortDescriptors: [SortDescriptor(\\Transaction.transactionDate, order: .reverse)],\n    predicate: predicate,\n    limit: 50,\n    offset: nil\n)\n\nlet transactions = try await store.transactions(query: query)\n```\n\n### Reading Transaction Data\n\n```swift\nlet amount = transaction.transactionAmount\nlet direction = transaction.creditDebitIndicator == .debit ? \"spent\" : \"received\"\nprint(\"\\(transaction.transactionDescription): \\(direction) \\(amount.amount) \\(amount.currencyCode)\")\n// merchantName, merchantCategoryCode, foreignCurrencyAmount are optional\n```\n\n### Built-In Predicate Helpers\n\nFinanceKit provides factory methods for common filters:\n\n```swift\n// Filter by transaction status\nlet bookedOnly = TransactionQuery.predicate(forStatuses: [.booked])\n\n// Filter by transaction type\nlet purchases = TransactionQuery.predicate(forTransactionTypes: [.pointOfSale, .directDebit])\n\n// Filter by merchant category\nlet groceries = TransactionQuery.predicate(forMerchantCategoryCodes: [\n    MerchantCategoryCode(rawValue: 5411)  // Grocery stores\n])\n```\n\n### Transaction Properties Reference\n\n| Property | Type | Notes |\n|---|---|---|\n| `id` | `UUID` | Unique per device |\n| `accountID` | `UUID` | Links to parent account |\n| `transactionDate` | `Date` | When the transaction occurred |\n| `postedDate` | `Date?` | When booked; nil if pending |\n| `transactionAmount` | `CurrencyAmount` | Always positive |\n| `creditDebitIndicator` | `CreditDebitIndicator` | `.debit` or `.credit` |\n| `transactionDescription` | `String` | Display-friendly description |\n| `originalTransactionDescription` | `String` | Raw institution description |\n| `merchantName` | `String?` | Merchant name if available |\n| `merchantCategoryCode` | `MerchantCategoryCode?` | ISO 18245 code |\n| `transactionType` | `TransactionType` | `.pointOfSale`, `.transfer`, etc. |\n| `status` | `TransactionStatus` | `.authorized`, `.pending`, `.booked`, `.memo`, `.rejected` |\n| `foreignCurrencyAmount` | `CurrencyAmount?` | Foreign currency if applicable |\n| `foreignCurrencyExchangeRate` | `Decimal?` | Exchange rate if applicable |\n\n## Long-Running Queries and History\n\nUse `AsyncSequence`-based history APIs for live updates or resumable sync. These return `FinanceStore.Changes` (inserted, updated, deleted items) plus a `HistoryToken` for resumption.\n\n```swift\nfunc monitorTransactions(for accountID: UUID) async throws {\n    let history = store.transactionHistory(\n        forAccountID: accountID,\n        since: loadSavedToken(),\n        isMonitoring: true  // true = keep streaming; false = terminate after catch-up\n    )\n\n    for try await changes in history {\n        // changes.inserted, changes.updated, changes.deleted\n        saveToken(changes.newToken)\n    }\n}\n```\n\n### History Token Persistence\n\n`HistoryToken` conforms to `Codable`. Persist it to resume queries without reprocessing data:\n\n```swift\nfunc saveToken(_ token: FinanceStore.HistoryToken) {\n    if let data = try? JSONEncoder().encode(token) {\n        UserDefaults.standard.set(data, forKey: \"financeHistoryToken\")\n    }\n}\n\nfunc loadSavedToken() -> FinanceStore.HistoryToken? {\n    guard let data = UserDefaults.standard.data(forKey: \"financeHistoryToken\") else { return nil }\n    return try? JSONDecoder().decode(FinanceStore.HistoryToken.self, from: data)\n}\n```\n\nIf a saved token points to compacted history, the framework throws `FinanceError.historyTokenInvalid`. Discard the token and start fresh.\n\n### Account and Balance History\n\n```swift\nlet accountChanges = store.accountHistory(since: nil, isMonitoring: true)\nlet balanceChanges = store.accountBalanceHistory(forAccountID: accountID, since: nil, isMonitoring: true)\n```\n\n## Transaction Picker\n\nFor apps that need selective, ephemeral access without full authorization, use `TransactionPicker` from FinanceKitUI. Access is not persisted -- transactions are passed directly for immediate use.\n\n```swift\nimport FinanceKitUI\n\nstruct ExpenseImportView: View {\n    @State private var selectedTransactions: [Transaction] = []\n\n    var body: some View {\n        if FinanceStore.isDataAvailable(.financialData) {\n            TransactionPicker(selection: $selectedTransactions) {\n                Label(\"Import Transactions\", systemImage: \"creditcard\")\n            }\n        }\n    }\n}\n```\n\n## Wallet Orders\n\nFinanceKit supports saving and querying Wallet orders (e.g., purchase receipts, shipping tracking).\n\n### Saving an Order\n\n```swift\nlet result = try await store.saveOrder(signedArchive: archiveData)\nswitch result {\ncase .added:        break  // Saved\ncase .cancelled:    break  // User cancelled\ncase .newerExisting: break // Newer version already in Wallet\n@unknown default:   break\n}\n```\n\n### Checking for an Existing Order\n\n```swift\nlet orderID = FullyQualifiedOrderIdentifier(\n    orderTypeIdentifier: \"com.merchant.order\",\n    orderIdentifier: \"ORDER-123\"\n)\nlet result = try await store.containsOrder(matching: orderID, updatedDate: lastKnownDate)\n// result: .exists, .newerExists, .olderExists, or .notFound\n```\n\n### Add Order to Wallet Button (FinanceKitUI)\n\n```swift\nimport FinanceKitUI\n\nAddOrderToWalletButton(signedArchive: orderData) { result in\n    // result: .success(SaveOrderResult) or .failure(Error)\n}\n```\n\n## Background Delivery\n\niOS 26+ supports background delivery extensions that notify your app of financial data changes outside its lifecycle. Requires App Groups to share data between the app and extension.\n\n### Enabling Background Delivery\n\n```swift\ntry await store.enableBackgroundDelivery(\n    for: [.transactions, .accountBalances],\n    frequency: .daily\n)\n```\n\nAvailable frequencies: `.hourly`, `.daily`, `.weekly`.\n\nDisable selectively or entirely:\n\n```swift\ntry await store.disableBackgroundDelivery(for: [.transactions])\ntry await store.disableAllBackgroundDelivery()\n```\n\n### Background Delivery Extension\n\nCreate a background delivery extension target in Xcode (Background Delivery Extension template). Both the app and extension must belong to the same App Group.\n\n```swift\nimport FinanceKit\n\nstruct MyFinanceExtension: BackgroundDeliveryExtension {\n    var body: some BackgroundDeliveryExtensionProviding { FinanceDataHandler() }\n}\n\nstruct FinanceDataHandler: BackgroundDeliveryExtensionProviding {\n    func didReceiveData(for dataTypes: [FinanceStore.BackgroundDataType]) async {\n        for dataType in dataTypes {\n            switch dataType {\n            case .transactions:    await processNewTransactions()\n            case .accountBalances: await updateBalanceCache()\n            case .accounts:        await refreshAccountList()\n            @unknown default:      break\n            }\n        }\n    }\n\n    func willTerminate() async { /* Clean up */ }\n}\n```\n\n## Common Mistakes\n\n### 1. Calling APIs when data is unavailable\n\nDON'T -- skip availability check:\n```swift\nlet store = FinanceStore.shared\nlet status = try await store.requestAuthorization() // Terminates if unavailable\n```\n\nDO -- guard availability first:\n```swift\nguard FinanceStore.isDataAvailable(.financialData) else {\n    showUnavailableMessage()\n    return\n}\nlet status = try await FinanceStore.shared.requestAuthorization()\n```\n\n### 2. Ignoring the credit/debit indicator\n\nDON'T -- treat amounts as signed values:\n```swift\nlet spent = transaction.transactionAmount.amount // Always positive\n```\n\nDO -- apply the indicator:\n```swift\nlet amount = transaction.transactionAmount.amount\nlet signed = transaction.creditDebitIndicator == .debit ? -amount : amount\n```\n\n### 3. Not handling data restriction errors\n\nDON'T -- assume authorized access persists:\n```swift\nlet transactions = try await store.transactions(query: query) // Fails if Wallet restricted\n```\n\nDO -- catch `FinanceError`:\n```swift\ndo {\n    let transactions = try await store.transactions(query: query)\n} catch let error as FinanceError {\n    if case .dataRestricted = error { showDataRestrictedMessage() }\n}\n```\n\n### 4. Requesting full snapshots instead of resumable queries\n\nDON'T -- fetch everything on every launch:\n```swift\nlet allTransactions = try await store.transactions(query: TransactionQuery(\n    sortDescriptors: [SortDescriptor(\\Transaction.transactionDate)],\n    predicate: nil, limit: nil, offset: nil\n))\n```\n\nDO -- use history tokens for incremental sync:\n```swift\nlet history = store.transactionHistory(\n    forAccountID: accountID,\n    since: loadSavedToken(),\n    isMonitoring: false\n)\nfor try await changes in history {\n    processChanges(changes)\n    saveToken(changes.newToken)\n}\n```\n\n### 5. Not persisting history tokens\n\nDON'T -- discard the token:\n```swift\nfor try await changes in history {\n    processChanges(changes)\n    // Token lost -- next launch reprocesses everything\n}\n```\n\nDO -- save every token:\n```swift\nfor try await changes in history {\n    processChanges(changes)\n    saveToken(changes.newToken)\n}\n```\n\n### 6. Misinterpreting credit/debit on liability accounts\n\nBoth asset and liability accounts use `.debit` for outgoing money. But `.credit` means different things: on an asset account it means money received; on a liability account it means a payment or refund that increases available credit. See [references/financekit-patterns.md](references/financekit-patterns.md) for a full interpretation table.\n\n## Review Checklist\n\n- [ ] `FinanceStore.isDataAvailable(.financialData)` checked before any API call\n- [ ] `com.apple.developer.financekit` entitlement requested and approved by Apple\n- [ ] `NSFinancialDataUsageDescription` set in Info.plist with a clear, specific message\n- [ ] Organization-level Apple Developer account used\n- [ ] Authorization status handled for all cases (`.authorized`, `.denied`, `.notDetermined`)\n- [ ] `FinanceError.dataRestricted` caught and handled gracefully\n- [ ] `CreditDebitIndicator` applied correctly to amounts (not treated as signed)\n- [ ] History tokens persisted for resumable queries\n- [ ] `FinanceError.historyTokenInvalid` handled by discarding token and restarting\n- [ ] Long-running queries use `isMonitoring: false` when live updates are not needed\n- [ ] Transaction picker used when full authorization is unnecessary\n- [ ] Only data the app genuinely needs is queried\n- [ ] Deleted data from history changes is removed from local storage\n- [ ] Background delivery extension in same App Group as the main app (iOS 26+)\n- [ ] Financial data deleted when user revokes access\n\n## References\n\n- Extended patterns (predicates, sorting, pagination, currency formatting, background updates): [references/financekit-patterns.md](references/financekit-patterns.md)\n- [FinanceKit framework](https://sosumi.ai/documentation/financekit)\n- [FinanceKitUI framework](https://sosumi.ai/documentation/financekitui)\n- [FinanceStore](https://sosumi.ai/documentation/financekit/financestore)\n- [Transaction](https://sosumi.ai/documentation/financekit/transaction)\n- [Account](https://sosumi.ai/documentation/financekit/account)\n- [AccountBalance](https://sosumi.ai/documentation/financekit/accountbalance)\n- [FinanceKit entitlement](https://sosumi.ai/documentation/bundleresources/entitlements/com.apple.developer.financekit)\n- [Implementing a background delivery extension](https://sosumi.ai/documentation/financekit/implementing-a-background-delivery-extension)\n- [Meet FinanceKit (WWDC24)](https://sosumi.ai/videos/play/wwdc2024/2023/)","tags":["financekit","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-financekit","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/financekit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.684","qualityRationale":"deterministic score 0.68 from registry signals: · indexed on github topic:agent-skills · 468 github stars · SKILL.md body (17,017 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:53:43.039Z","embedding":null,"createdAt":"2026-04-18T22:00:59.452Z","updatedAt":"2026-04-22T00:53:43.039Z","lastSeenAt":"2026-04-22T00:53:43.039Z","tsv":"'-123':1118 '/contact/request/financekit/).':177 '/documentation/bundleresources/entitlements/com.apple.developer.financekit)':1726 '/documentation/financekit)':1700 '/documentation/financekit/account)':1717 '/documentation/financekit/accountbalance)':1721 '/documentation/financekit/financestore)':1709 '/documentation/financekit/implementing-a-background-delivery-extension)':1734 '/documentation/financekit/transaction)':1713 '/documentation/financekitui)':1705 '/videos/play/wwdc2024/2023/)':1740 '0.accountid':674 '1':162,210,1289 '17.4':83 '18245':824 '2':187,224,1329 '26':76,88,1157,1676 '3':199,1361 '4':1407 '5':1466 '50':687 '5411':762 '6':1506 '6.3':74 'access':2,21,40,61,327,339,349,428,442,1013,1021,1371,1683 'account':19,63,105,108,109,112,193,195,200,354,359,366,450,451,481,492,513,517,524,540,548,781,984,1276,1511,1516,1530,1538,1587,1714 'account-bal':111 'account.displayname':498 'accountbal':577,1193,1272,1718 'accountbalance.id':590 'accountbalancequeri':587 'accountchang':990 'accountid':573,584,675,776,883,891,1000,1451 'accountqueri':495 'across':272 'ad':1086 'add':211,225,482,1134 'addordertowalletbutton':1143 'alltransact':1424 'alreadi':1099 'also':329 'alway':608,797,1345 'amount':545,605,606,702,1337,1353,1359,1360,1607 'amount.amount':713 'amount.currencycode':714 'api':78,266,294,860,1291,1564 'app':243,299,1008,1165,1174,1181,1231,1239,1649,1669,1674 'appl':3,5,36,44,47,49,52,168,183,191,220,462,468,1572,1585 'appli':1348,1604 'applic':186,843,849 'approv':221,1570 'archivedata':1082 'asset':460,519,521,523,1513,1529 'asset.currencycode':526 'assum':1369 'async':490,575,885,1260,1284 'asyncsequ':857 'author':27,71,102,103,238,345,347,388,413,833,1016,1370,1589,1595,1643 'avail':80,98,101,256,286,315,561,638,652,654,820,1196,1299,1315,1547 'availableandbook':568,650 'await':383,420,507,599,693,907,1079,1122,1189,1207,1212,1269,1273,1277,1308,1327,1377,1393,1426,1458,1479,1498 'background':84,141,144,1154,1159,1185,1214,1219,1225,1664,1692,1729 'background-deliveri':143 'backgrounddeliveryextens':1246 'backgrounddeliveryextensionprovid':1250,1254 'bal':640,642,646,648 'balanc':20,64,110,113,541,542,581,604,620,621,986 'balance.accountid':583 'balance.amount.amount':629 'balance.amount.currencycode':630 'balance.creditdebitindicator':625 'balance.currentbalance':636 'balancechang':997 'base':858 'becom':330 'belong':1235 'bodi':1044,1248 'book':564,644,741,791,835 'bookedon':738 'break':389,395,400,407,1087,1091,1096,1104,1281 'budget':253 'build':29 'built':721 'built-in':720 'button':1138 'cach':432 'call':267,289,301,1290,1565 'cancel':1090,1093 'capabl':182,218 'card':4,48,53,469 'case':387,393,398,459,518,527,560,637,643,649,1085,1089,1094,1267,1271,1275,1403,1594 'cash':6,50,463 'catch':903,1386,1397 'catch-up':902 'categori':755 'caught':1599 'chang':441,908,1169,1459,1463,1480,1484,1499,1503,1658 'changes.deleted':913 'changes.inserted':911 'changes.newtoken':915,1465,1505 'changes.updated':912 'check':257,408,1105,1300,1561 'checklist':152,155,1558 'choic':403 'choos':364 'clean':1285 'clear':1579 'codabl':922 'code':825 'com.apple.developer.financekit':166,1566 'com.merchant.order':1115 'common':146,149,473,730,1287 'common-mistak':148 'compact':972 'configur':209 'conform':920 'constant':271 'content':89 'control':70 'correct':1605 'creat':1217 'credit':470,484,536,803,1523,1548 'credit-specif':483 'credit/debit':1332,1508 'creditcard':1057 'creditdebitind':612,799,800,1603 'currenc':525,841,1690 'currencyamount':796,839 'currencycod':478 'current':409,412 'currentbal':555,633 'currentstatus':418 'daili':1195,1199 'data':10,26,42,97,100,247,255,293,314,321,326,448,699,930,938,944,952,965,1168,1178,1293,1364,1647,1655,1678 'data-avail':99 'datarestrict':1404 'datatyp':1258,1262,1264,1266 'date':373,783,789 'debit':626,707,801,1358,1518 'decim':610,845 'decis':433 'declin':397 'decod':962 'default':406,656,1103,1280 'delet':872,1654,1679 'deliveri':85,142,145,1155,1160,1186,1215,1220,1226,1665,1730 'deni':394,427,1596 'descript':809,814 'descriptor':666 'determin':614 'develop':192,1586 'developer.apple.com':176 'developer.apple.com/contact/request/financekit/).':175 'devic':59,260,325,775 'didreceivedata':1256 'differ':1525 'direct':705,712,1028 'directdebit':751 'disabl':1201 'discard':978,1473,1621 'display':807 'display-friend':806 'displaynam':476 'e.g':333,461,467,1067 'earliest':371 'elig':198 'els':283,312,956,1321 'enabl':1184 'encod':941 'entir':1204 'entitl':92,96,160,164,172,207,214,1567,1723 'enum':456,634 'ephemer':1012 'error':1153,1366,1399,1405 'etc':830 'everi':1420,1493 'everyth':1418,1490 'exchang':846 'exist':322,1108,1129 'expenseimportview':1036 'expos':375 'extend':1685 'extens':1161,1183,1216,1221,1227,1233,1666,1731 'extract':631 'factori':727 'fail':1381 'failur':1152 'fals':899,1455,1631 'featur':32 'fetch':1417 'fetchaccount':489 'fetchbal':571 'field':486 'filter':731,733,742,752 'financ':31 'financedatahandl':1251,1253 'financeerror':1387,1401 'financeerror.datarestricted':341,1598 'financeerror.historytokeninvalid':977,1618 'financehistorytoken':946,955 'financekit':1,12,39,55,171,213,262,279,284,725,1060,1243,1696,1722,1736 'financekitui':1020,1034,1139,1142,1701 'financestor':1706 'financestore.backgrounddatatype':1259 'financestore.changes':869 'financestore.historytoken':935,949 'financestore.historytoken.self':963 'financestore.isdataavailable':281,310,1048,1319,1559 'financestore.shared':379,1304 'financestore.shared.requestauthorization':1328 'financi':9,25,41,246,292,353,447,1167,1677 'financia':38 'financialdata':282,1049,1320,1560 'first':1316 'foraccountid':890,999,1450 'foreign':840 'foreigncurrencyamount':717,838 'foreigncurrencyexchanger':844 'forkey':945,954 'form':174 'format':1691 'formatbal':619,641,647,653 'formerchantcategorycod':759 'forstatus':740 'fortransactiontyp':749 'framework':296,975,1697,1702 'frequenc':1194,1197 'fresh':983 'friend':808 'full':1015,1409,1554,1642 'fullyqualifiedorderidentifi':1113 'func':488,570,618,880,932,947,1255,1282 'genuin':1650 'grace':1602 'grant':425 'groceri':757,763 'group':1175,1240,1670 'guarante':320 'guard':280,309,950,1314,1318 'handl':1363,1591,1601,1619 'helper':724 'histori':17,124,130,855,859,888,910,916,973,987,1441,1448,1461,1469,1482,1501,1612,1657 'historytoken':876,919 'holder':201 'hour':1198 'id':475,771 'ignor':1330 'immedi':1030 'implement':1727 'import':278,1033,1054,1141,1242 'includ':46,562 'increas':1546 'increment':1444 'indic':1333,1350 'individu':194 'info.plist':228,1576 'insert':870 'insight':254 'instead':1411 'institut':813 'institutionnam':477 'integr':34 'interpret':1555 'io':75,82,87,275,1156,1675 'ismonitor':894,994,1003,1454,1630 'iso':823 'item':873 'jsondecod':961 'jsonencod':940 'keep':897 'label':1053 'lastknownd':1127 'launch':273,1421,1488 'let':377,380,417,493,520,529,532,578,585,623,639,645,651,671,676,690,701,704,737,746,756,887,937,951,989,996,1076,1111,1119,1302,1305,1324,1342,1352,1355,1374,1390,1398,1423,1447 'level':190,1584 'liabil':466,480,528,530,1510,1515,1537 'liability.creditinformation.creditlimit':534 'lifecycl':1172 'limit':501,533,537,593,667,686,1435 'limit.amount':538 'limit.currencycode':539 'link':778 'live':862,1633 'loadsavedtoken':893,948,1453 'local':1662 'long':120,126,851,1626 'long-run':119,850,1625 'long-running-queries-and-histori':125 'lost':1486 'made':404 'main':1673 'make':264 'manag':163,181,217 'match':1124 'mdm':336 'mean':1524,1532,1540 'meaning':402 'meet':1735 'memo':836 'merchant':754,817 'merchantcategorycod':716,760,821,822 'merchantnam':715,815 'messag':1581 'method':728 'misinterpret':1507 'mistak':147,150,1288 'model':453 'money':1521,1533 'monitortransact':881 'must':1234 'myfinanceextens':1245 'name':818 'need':1010,1637,1651 'newer':1097 'newerexist':1095,1130 'next':1487 'nil':500,502,504,594,596,689,792,958,993,1002,1434,1436,1438 'notdetermin':399,1597 'note':770 'notfound':1133 'notifi':1163 'nsfinancialdatausagedescript':226,241,1573 'occur':787 'offlin':60 'offset':503,595,669,688,1437 'olderexist':1131 'on-devic':57 'one':557 'option':719 'order':23,137,140,307,311,682,1059,1066,1074,1109,1117,1135 'orderdata':1145 'orderid':1112,1125 'orderidentifi':1116 'ordertypeidentifi':1114 'organ':189,1583 'organization-level':188,1582 'originaltransactiondescript':810 'outgo':1520 'outsid':1170 'pagin':1689 'parent':780 'pass':1027 'pattern':1686 'payment':1542 'pend':563,794,834 'per':774 'persist':918,923,1024,1372,1468,1614 'person':30 'picker':132,135,360,1006,1639 'plus':874 'point':551,970 'pointofsal':750,828 'posit':609,798,1346 'post':565 'postedd':788 'predic':499,579,580,591,592,664,672,673,684,685,723,1433,1687 'present':357 'print':522,535,710 'privaci':445 'privat':1039 'proceed':390 'processchang':1462,1483,1502 'processnewtransact':1270 'project':208 'prompt':239,415,437 'properti':474,766,768 'provid':56,252,726 'purchas':747,1068 'queri':15,77,104,107,114,117,122,128,392,411,449,494,509,510,586,601,602,658,677,695,696,853,927,1064,1379,1380,1395,1396,1414,1428,1617,1628,1653 'querying-account':106 'querying-transact':116 'rate':847 'rather':342 'raw':812 'rawvalu':761 'read':18,603,697 'receipt':1069 'receiv':709,1534 'refer':156,157,767,1684 'references/financekit-patterns.md':1550,1551,1694,1695 'refreshaccountlist':1278 'refund':1544 'reject':837 'remov':1660 'repres':543 'reprocess':929,1489 'request':24,165,173,205,223,346,1408,1568 'requestauthor':429 'requir':86,161,203,1173 'restart':1624 'restrict':332,337,338,1365,1384 'result':1077,1084,1120,1128,1146,1148 'resum':865,926,1413,1616 'resumpt':878 'return':304,313,316,430,505,597,627,868,957,959,1323 'revers':683 'review':151,154,184,1557 'review-checklist':153 'revok':1682 'role':202 'run':121,127,852,1627 'save':54,464,968,1062,1072,1088,1492 'saveorderresult':1150 'savetoken':914,933,1464,1504 'secur':446 'see':1549 'select':352,1011,1051,1202 'selectedtransact':1041,1052 'set':444,1574 'setup':90,94,158 'setup-and-entitl':93 'share':368,472,1177 'ship':1070 'show':435 'showdatarestrictedmessag':1406 'shown':232 'showunavailablemessag':1322 'sign':616,624,628,1339,1356,1611 'signedarch':1081,1144 'sinc':892,992,1001,1452 'skill' 'skill-financekit' 'skip':1298 'snapshot':1410 'sort':665,1688 'sortdescriptor':496,497,588,589,679,680,1430,1431 'sosumi.ai':1699,1704,1708,1712,1716,1720,1725,1733,1739 'sosumi.ai/documentation/bundleresources/entitlements/com.apple.developer.financekit)':1724 'sosumi.ai/documentation/financekit)':1698 'sosumi.ai/documentation/financekit/account)':1715 'sosumi.ai/documentation/financekit/accountbalance)':1719 'sosumi.ai/documentation/financekit/financestore)':1707 'sosumi.ai/documentation/financekit/implementing-a-background-delivery-extension)':1732 'sosumi.ai/documentation/financekit/transaction)':1711 'sosumi.ai/documentation/financekitui)':1703 'sosumi.ai/videos/play/wwdc2024/2023/)':1738 'source-dpearson2699' 'specif':485,1580 'spend':250 'spent':708,1343 'start':982 'state':1038 'status':381,386,410,736,831,1306,1325,1590 'storag':1663 'store':378,764,1303 'store.accountbalancehistory':998 'store.accountbalances':600 'store.accounthistory':991 'store.accounts':508 'store.authorizationstatus':421 'store.containsorder':1123 'store.disableallbackgrounddelivery':1213 'store.disablebackgrounddelivery':1208 'store.enablebackgrounddelivery':1190 'store.requestauthorization':384,1309 'store.saveorder':1080 'store.transactionhistory':889,1449 'store.transactions':694,1378,1394,1427 'stream':898 'string':230,622,805,811,816 'struct':1035,1244,1252 'success':1149 'support':261,1061,1158 'swift':73,277,308,376,416,487,515,569,617,663,670,700,732,879,931,988,1032,1075,1110,1140,1187,1205,1241,1301,1317,1341,1351,1373,1388,1422,1446,1476,1495 'switch':385,516,635,1083,1265 'sync':866,1445 'system':356 'systemimag':1056 'tabl':1556 'target':72,1222 'templat':1228 'temporarili':331 'termin':297,344,900,1310 'thing':1526 'three':559 'throw':340,491,576,886,976 'time':553 'token':917,934,942,969,980,1442,1470,1475,1485,1494,1613,1622 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'track':249,1071 'transact':16,66,115,118,131,134,372,659,691,698,735,744,765,786,1005,1025,1042,1055,1192,1210,1268,1375,1391,1638,1710 'transaction-pick':133 'transaction.creditdebitindicator':706,1357 'transaction.transactionamount':703 'transaction.transactionamount.amount':1344,1354 'transaction.transactiondate':681,1432 'transaction.transactiondescription':711 'transactionamount':795 'transactiond':782 'transactiondescript':804 'transactionpick':1018,1050 'transactionqueri':661,678,1429 'transactionquery.predicate':739,748,758 'transactionstatus':832 'transactiontyp':826,827 'transfer':829 'treat':1336,1609 'tri':382,419,506,598,692,906,939,960,1078,1121,1188,1206,1211,1307,1326,1376,1392,1425,1457,1478,1497 'true':317,895,896,995,1004 'two':458 'type':514,745,769 'unavail':303,335,1295,1312 'uniqu':773 'unknown':405,655,657,1102,1279 'unnecessari':1645 'updat':863,871,1634,1693 'updatebalancecach':1274 'updatedd':1126 'use':11,13,244,611,660,856,1017,1031,1440,1517,1588,1629,1640 'user':69,235,351,363,396,424,439,1092,1681 'user-control':68 'user-select':350 'userdefaults.standard.data':953 'userdefaults.standard.set':943 'uuid':574,772,777,884 'valu':269,1340 'var':1040,1043,1247 'version':276,1098 'via':169 'view':1037,1046 'wallet':8,22,45,136,139,306,334,1058,1065,1101,1137,1383 'wallet-ord':138 'week':1200 'whether':258 'willtermin':1283 'without':414,434,928,1014 'work':511 'wwdc24':1737 'xcode':216,1224 'xml':240","prices":[{"id":"14b1534d-6371-4793-a2c5-6f89e3849a35","listingId":"68ec9d72-32df-43fe-bc15-4c26e08229ec","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:00:59.452Z"}],"sources":[{"listingId":"68ec9d72-32df-43fe-bc15-4c26e08229ec","source":"github","sourceId":"dpearson2699/swift-ios-skills/financekit","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/financekit","isPrimary":false,"firstSeenAt":"2026-04-18T22:00:59.452Z","lastSeenAt":"2026-04-22T00:53:43.039Z"}],"details":{"listingId":"68ec9d72-32df-43fe-bc15-4c26e08229ec","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"financekit","github":{"repo":"dpearson2699/swift-ios-skills","stars":468,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-21T19:26:16Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"9be5a56e71878ad59ca78ec19e04946a890892c2","skill_md_path":"skills/financekit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/financekit"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"financekit","description":"Access Apple Card, Apple Cash, and Wallet financial data using FinanceKit. Use when querying transaction history, reading account balances, accessing Wallet orders, requesting financial data authorization, or building personal finance features that integrate with Apple's financial services."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/financekit"},"updatedAt":"2026-04-22T00:53:43.039Z"}}