{"id":50748284,"url":"https://github.com/open-banking-io/clients","last_synced_at":"2026-06-15T03:01:05.271Z","repository":{"id":363607831,"uuid":"1264078752","full_name":"open-banking-io/clients","owner":"open-banking-io","description":"Zero-knowledge open banking — server-to-server SDKs (.NET, Node, Python, Rust, Go, Java, Ruby, PHP) and the openbanking CLI for open-banking.io","archived":false,"fork":false,"pushed_at":"2026-06-12T22:04:10.000Z","size":697,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T02:03:11.422Z","etag":null,"topics":["banking","cli","fintech","open-banking","psd2","sdk","zero-knowledge"],"latest_commit_sha":null,"homepage":"https://open-banking.io","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-banking-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":"THREAT_MODEL.md","audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-09T14:38:43.000Z","updated_at":"2026-06-13T04:05:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"48868c4d-3d66-41d1-b6ba-c9ba2873049e","html_url":"https://github.com/open-banking-io/clients","commit_stats":null,"previous_names":["open-banking-io/clients"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/open-banking-io/clients","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-banking-io%2Fclients","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-banking-io%2Fclients/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-banking-io%2Fclients/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-banking-io%2Fclients/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-banking-io","download_url":"https://codeload.github.com/open-banking-io/clients/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-banking-io%2Fclients/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34345578,"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-15T02:00:07.085Z","response_time":63,"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":["banking","cli","fintech","open-banking","psd2","sdk","zero-knowledge"],"created_at":"2026-06-10T23:00:27.844Z","updated_at":"2026-06-15T03:01:05.224Z","avatar_url":"https://github.com/open-banking-io.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://open-banking.io\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/open-banking-io/clients/main/.github/logo.png\" alt=\"open-banking.io\" height=\"56\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# open-banking.io client SDKs\n\n[![CI](https://github.com/open-banking-io/clients/actions/workflows/ci.yml/badge.svg)](https://github.com/open-banking-io/clients/actions/workflows/ci.yml)\n[![Semgrep](https://github.com/open-banking-io/clients/actions/workflows/semgrep.yml/badge.svg)](https://github.com/open-banking-io/clients/actions/workflows/semgrep.yml)\n[![Gitleaks](https://github.com/open-banking-io/clients/actions/workflows/gitleaks.yml/badge.svg)](https://github.com/open-banking-io/clients/actions/workflows/gitleaks.yml)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/open-banking-io/clients/badge)](https://securityscorecards.dev/viewer/?uri=github.com/open-banking-io/clients)\n[![codecov](https://codecov.io/gh/open-banking-io/clients/branch/main/graph/badge.svg)](https://codecov.io/gh/open-banking-io/clients)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n\nOfficial server-to-server SDKs for **[open-banking.io](https://open-banking.io)** in .NET, Node,\nPython, Rust, Go, Java, Ruby, and PHP.\n\nopen-banking.io is **zero-knowledge**: the service stores and returns only ciphertext it cannot read.\nEach SDK does the two things an integrator needs — **authenticate** with your API key and **decrypt**\nyour data locally with your private key — and hands you clean, typed models.\n\n\u003e **New here?** Create an account and export your credentials bundle at\n\u003e **[open-banking.io](https://open-banking.io)**, then pick your language below.\n\n## Pick your language\n\nEach package has its own README with install instructions, a runnable example, and language-specific\nnotes (money types, async, dependencies).\n\n| Language | Package | Version | Guide |\n|---|---|---|---|\n| .NET | [`OpenBankingIO.Client`](https://www.nuget.org/packages/OpenBankingIO.Client) (NuGet) | [![NuGet](https://img.shields.io/nuget/v/OpenBankingIO.Client?logo=nuget\u0026label=)](https://www.nuget.org/packages/OpenBankingIO.Client) | [`dotnet/`](dotnet/src/OpenBankingIO.Client/README.md) |\n| Node / TypeScript | [`@open-banking-io/client`](https://www.npmjs.com/package/@open-banking-io/client) (npm) | [![npm](https://img.shields.io/npm/v/%40open-banking-io%2Fclient?logo=npm\u0026label=)](https://www.npmjs.com/package/@open-banking-io/client) | [`node/`](node/) |\n| Python | [`open-banking-io`](https://pypi.org/project/open-banking-io/) (PyPI) | [![PyPI](https://img.shields.io/pypi/v/open-banking-io?logo=pypi\u0026logoColor=white\u0026label=)](https://pypi.org/project/open-banking-io/) | [`python/`](python/) |\n| Rust | [`open-banking-io`](https://crates.io/crates/open-banking-io) (crates.io) | [![crates.io](https://img.shields.io/crates/v/open-banking-io?logo=rust\u0026label=)](https://crates.io/crates/open-banking-io) | [`rust/`](rust/) |\n| Go | [`github.com/open-banking-io/clients/go`](https://pkg.go.dev/github.com/open-banking-io/clients/go) | [![Go Reference](https://pkg.go.dev/badge/github.com/open-banking-io/clients/go.svg)](https://pkg.go.dev/github.com/open-banking-io/clients/go) | [`go/`](go/) |\n| Java | [`io.open-banking:open-banking-io-client`](https://central.sonatype.com/artifact/io.open-banking/open-banking-io-client) (Maven Central) | [![Maven Central](https://img.shields.io/maven-central/v/io.open-banking/open-banking-io-client?logo=apachemaven\u0026label=)](https://central.sonatype.com/artifact/io.open-banking/open-banking-io-client) | [`java/`](java/) |\n| Ruby | [`open-banking-io`](https://rubygems.org/gems/open-banking-io) (RubyGems) | [![Gem](https://img.shields.io/gem/v/open-banking-io?logo=rubygems\u0026label=)](https://rubygems.org/gems/open-banking-io) | [`ruby/`](ruby/) |\n| PHP | [`open-banking-io/client`](https://packagist.org/packages/open-banking-io/client) (Packagist) | [![Packagist](https://img.shields.io/packagist/v/open-banking-io/client?logo=packagist\u0026logoColor=white\u0026label=)](https://packagist.org/packages/open-banking-io/client) | [`php/`](php/) |\n\nPrefer the terminal? There's also a [command-line client](cli/) (`openbanking`).\n\n## Getting started\n\n1. **Get your credentials.** In the [open-banking.io](https://open-banking.io) app, export your\n   **credentials bundle** (`credentials.json`) — it contains your `apiBaseUrl`, an **API key**, and\n   your **encryption private key** (PKCS#8).\n2. **Point an SDK at the bundle.** Every request sends `X-Api-Key`; every response is decrypted\n   in-process with your private key. The service never sees your plaintext data.\n\n```ts\n// Node / TypeScript — the same shape exists in all eight languages (see each guide above).\nimport { OpenBankingClient } from \"@open-banking-io/client\";\n\nconst client = OpenBankingClient.fromCredentials(\"credentials.json\");\nfor (const a of await client.getAccounts()) {\n  const booked = a.balances.find((b) =\u003e b.type === \"ITBD\");\n  console.log(`${a.iban}: ${booked?.amount} ${a.currency}`);\n}\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eThe same example in .NET, Python, Rust, Go, Java, Ruby, and PHP\u003c/summary\u003e\n\n```csharp\n// .NET\nusing var client = OpenBankingClient.FromCredentials(\"credentials.json\");\nforeach (var a in await client.GetAccountsAsync())\n    Console.WriteLine($\"{a.Iban}: {a.Balances.First(b =\u003e b.Type == \"ITBD\").Amount} {a.Currency}\");\n```\n```python\n# Python\nclient = OpenBankingClient.from_credentials(\"credentials.json\")\nfor a in client.get_accounts():\n    booked = next(b for b in a.balances if b.type == \"ITBD\")\n    print(a.iban, booked.amount, a.currency)\n```\n```rust\n// Rust\nlet client = OpenBankingClient::from_credentials(\"credentials.json\")?;\nfor a in client.get_accounts()? {\n    let booked = a.balances.iter().find(|b| b.type_ == \"ITBD\");\n    println!(\"{:?} {:?} {}\", a.iban, booked.map(|b| \u0026b.amount), a.currency);\n}\n```\n```go\n// Go\nclient, _ := openbanking.FromCredentials(\"credentials.json\", nil)\naccounts, _ := client.GetAccounts()\nfor _, a := range accounts {\n    for _, b := range a.Balances {\n        if b.Type == \"ITBD\" { fmt.Println(a.Iban, b.Amount, a.Currency) }\n    }\n}\n```\n```java\n// Java\nvar client = OpenBankingClient.fromCredentials(\"credentials.json\");\nfor (Account a : client.getAccounts())\n    a.balances().stream().filter(b -\u003e b.type().equals(\"ITBD\")).findFirst()\n        .ifPresent(b -\u003e System.out.println(a.iban() + \" \" + b.amount() + \" \" + a.currency()));\n```\n```ruby\n# Ruby\nclient = OpenBankingIO::Client.from_credentials(\"credentials.json\")\nclient.get_accounts.each do |a|\n  booked = a.balances.find { |b| b.type == \"ITBD\" }\n  puts \"#{a.iban} #{booked\u0026.amount} #{a.currency}\"\nend\n```\n```php\n// PHP\n$client = OpenBankingIO\\Client::fromCredentials(\"credentials.json\");\nforeach ($client-\u003egetAccounts() as $a) {\n    foreach ($a-\u003ebalances as $b) {\n        if ($b-\u003etype === \"ITBD\") echo \"{$a-\u003eiban} {$b-\u003eamount} {$a-\u003ecurrency}\\n\";\n    }\n}\n```\n\u003c/details\u003e\n\nAll eight expose the same surface — `getAccounts`, `getTransactions(accountId, …)`, `getConnections`,\n`sync(accountId)`, `syncAll()`. `sync` decrypts the account's session uid locally and posts it, so the\nservice can refresh from the bank without ever holding it in plaintext.\n\n## How it works\n\n1. Your bank credentials are never sent to open-banking.io.\n2. Your account data (IBAN, balances, transactions) is stored **encrypted** by the service.\n3. Only your **local private key** can decrypt it — the service holds ciphertext it cannot read.\n\nEach sensitive value is an **envelope** sealed with **ephemeral ECDH (P-256) → HKDF-SHA256 →\nAES-256-GCM**; only your private key can open it, and all eight SDKs are verified against the same\n`fixtures/` so they decrypt identically. The full wire format, trust boundaries, and assumptions are\nin **[`THREAT_MODEL.md`](THREAT_MODEL.md)**.\n\n## Development\n\n```bash\n# regenerate the shared test fixtures (keypair + encrypted sample responses)\nnode tools/generate-fixtures.mjs\n\n# run each SDK's tests (crypto round-trip + a mock-server integration suite)\ndotnet test dotnet/\ncd node   \u0026\u0026 npm install \u0026\u0026 npm test\ncd python \u0026\u0026 pip install -e .[dev] \u0026\u0026 pytest -q\ncd rust   \u0026\u0026 cargo test\ncd go     \u0026\u0026 go test ./...\ncd java   \u0026\u0026 mvn -B verify\ncd ruby   \u0026\u0026 bundle install \u0026\u0026 bundle exec rspec\ncd php    \u0026\u0026 composer install \u0026\u0026 vendor/bin/phpunit\n```\n\nCI builds and tests all eight on every push. **Releases are per-package** — each publishes from its own\n`\u003cdir\u003e/vX.Y.Z` tag (e.g. `node/v0.2.0`), so tagging one package never republishes the others. Cut a\nrelease from **Actions → Release** (pick a package + version); see [`RELEASING.md`](RELEASING.md).\n\n## Security \u0026 contributing\n\nZero-knowledge security model and trust boundaries: [`THREAT_MODEL.md`](THREAT_MODEL.md). Report\nvulnerabilities privately per [`SECURITY.md`](SECURITY.md). Contributions welcome — see\n[`CONTRIBUTING.md`](CONTRIBUTING.md), [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md), and\n[`SUPPORT.md`](SUPPORT.md).\n\nMIT licensed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-banking-io%2Fclients","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopen-banking-io%2Fclients","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-banking-io%2Fclients/lists"}