{"id":19272649,"url":"https://github.com/grype/plaidst","last_synced_at":"2026-06-13T02:33:41.089Z","repository":{"id":77659678,"uuid":"143694336","full_name":"grype/PlaidSt","owner":"grype","description":"Plaid client for Pharo","archived":false,"fork":false,"pushed_at":"2020-01-15T05:47:09.000Z","size":446,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-23T20:41:29.064Z","etag":null,"topics":["pharo","pharo-smalltalk","plaid","seaside","smalltalk"],"latest_commit_sha":null,"homepage":"","language":"Smalltalk","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grype.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-06T07:48:58.000Z","updated_at":"2020-01-28T19:55:11.000Z","dependencies_parsed_at":"2023-03-22T02:33:26.023Z","dependency_job_id":null,"html_url":"https://github.com/grype/PlaidSt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/grype/PlaidSt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grype%2FPlaidSt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grype%2FPlaidSt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grype%2FPlaidSt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grype%2FPlaidSt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grype","download_url":"https://codeload.github.com/grype/PlaidSt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grype%2FPlaidSt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34270414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pharo","pharo-smalltalk","plaid","seaside","smalltalk"],"created_at":"2024-11-09T20:37:30.736Z","updated_at":"2026-06-13T02:33:41.073Z","avatar_url":"https://github.com/grype.png","language":"Smalltalk","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PlaidSt\nPharo Smalltalk Bindings for the Plaid API (https://www.plaid.com/docs).\n\nThe whole available Plaid API is defined in the `PlaidClient` and various subclasses of `PlaidEndpoint`. Link support is provided via `JSPlaid`.\n\nUses [Ethel](https://github.com/grype/Ethel), [Seaside](https://github.com/SeasideSt/Seaside) for providing Link support, and [Magritte](https://github.com/magritte-metamodel/magritte) for models.\n\n### Installation\n``` smalltalk\nMetacello\n\tnew\n\t\tbaseline: 'Plaid';\n\t\trepository: 'github://grype/PlaidSt/';\n\t\tonConflictUseLoaded;\n\t\tload.\n```\n\nNote: PlaidSt depends on Magritte3 and Magritte3AddOns. Those packages haven't been updated for Pharo7 and will ultimately result in some issues during load. For that reason, BaselineOfPlaid pins down their versions, and pulls in the latest Seaside from github. It is also for that reason that the Metacello script above is instructed to #onConflictUseLoaded.\n\n### Versioning\nCurrently supported API version is 2018-05-22, and is defined in:\n```smalltalk\nPlaidClient class\u003e\u003eapiVersion\n\t^ '2018-05-22'\n```\n\n### Basic Usage\n``` smalltalk\n\"Creating an instance of PlaidClient\"\nclient := PlaidClient sandbox\n    clientName: 'Acme';\n\tcredentials: (PlaidCredentials new\n\t\tpublicKey: '...';\n\t\tsecret: '...';\n\t\tclientId: '...';\n\t\tyourself);\n\tyourself.\n\n\"Institutions\"\nclient institutions getFrom: 0 count: 100.\nclient institutions search: 'Platypus' products: nil.\nclient institutions getById: 'ins_10'.\n\n\"Enumeration\"\nclient institutions first: 10. \"Fetches first 10 institutions\"\nclient institutions collect: #yourself as: Set. \"Fetches all institutions into a Set\"\nclient institutions select: [:each | each products includes: 'identity']. \"Fetches all institutions and selects only those that provide 'identity' product\"\nclient institutions detect: [:each | each name asLowercase includesSubstring: 'platypus' ]. \"Fetches institutions until it finds one that has the word 'platypus' in the name, returning the resulting institution object...\"\n\n\"Public tokens\"\nclient publicToken create.\nclient publicToken exchange: 'public-sandbox-...'.\n\n\"Other fun things which should be self-explanatory\"\nclient accounts get.\nclient item get.\n\nclient transactions get: [:endpoint | \n    endpoint startDate: Date today - 1 days; \n    \tendDate: Date today; \n    \taccountIds: nil; \n    \tcount: 300; \n    \toffset: 0].\n      \n\"Select all uber related transactions in the last 30 days\"\nclient transactions get \n  startDate: Date today - 30 days; \n  endDate: Date today;\n  select: [:each | each name asLowercase includesSubstring: 'uber'].\n\n\"Total spent on uber in the last 30 days\"\n(client transactions get \n  startDate: Date today - 30 days; \n  endDate: Date today;\n  select: [:each | each name asLowercase includesSubstring: 'uber']\n  thenCollect: #amount) sum.\n  \n\"Select all transactions in the last 30 days and group them by date\"\nclient transactions get \n  startDate: Date today - 30 days; \n  endDate: Date today;\n  groupedBy: [ :each | each date ].\n```\n\nAPI calls are synchronous and return responses that are defined in subclasses of `PlaidResponse`. Fork those calls if you'd like things asynchronously.\n\nAPI calls may also raise an error, which could be at either the transport, SDK or API level. You may want to wrap those API calls in a block and handle errors via #on:do:\n\n```smalltalk\n[client item get] on: Error do: [...]\n```\n\n### Defaults\n\nAll of the variables required to instantiate `PlaidClient` are wired up in Settings, making it possible to enter credentials and client name there, and then simply ask for `PlaidClient default`.\n\n### Using Link with Seaside\n\nUse the following snippet as a guide to rendering Link in a Seaside component:\n\n```smalltalk\nMyLinkComponent class\u003e\u003einitialize\n\t(WAAdmin register: self asApplicationAt: 'link')\n\t\taddLibrary: PlaidLinkLibrary.\n\t\t\nMyLinkComponent\u003e\u003erenderContentOn: html\n\tsuper renderContentOn: html.\n\thtml\n\t\tscript:\n\t\t\t((html javascript plaid\n\t\t\t\tcreate: self plaidClient\n\t\t\t\twith: [ :builder | self buildLinkPropertiesOn: builder ]) call: 'open').\n\nMyLinkComponent\u003e\u003ebuildLinkPropertiesOn: aBuilder\n\taBuilder\n\t\tproduct: #(#transactions ...);\n\t\tonLoad: [ ... ];\n\t\tonSuccess: [ :accessToken :meta | ... ];\n\t\tonExit: [ :err :meta | ... ];\n\t\tonEvent: [ :event :meta | ... ].\n\n    \"Existing link could be updated. This may need to happen when user is required to authenticate again\"\n    \"In which case, #isUpdating would return true...\"\n\tself isUpdating\n\t\tifTrue: [ aBuilder token: self publicToken ].\n\n```\n\n### Coverage\n\n\u003cimg src=\"https://github.com/grype/PlaidSt/raw/master/resources/plaid-map.png\" width=\"50%\" title=\"API Coverage Map\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrype%2Fplaidst","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrype%2Fplaidst","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrype%2Fplaidst/lists"}