diff --git a/.prettierignore b/.prettierignore index 7cc13dd1..36afd3b3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,6 +2,7 @@ CHANGELOG.md /ecosystem-tests/*/** /node_modules /deno +/packages/mcp-server/manifest.json # don't format tsc output, will break source maps dist diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d0972da8..099626f4 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.7.1" + ".": "1.8.0" } diff --git a/.stats.yml b/.stats.yml index bd93d1bb..cad607b4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 67 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lightspark%2Fgrid-5b8a8161eeb365a5f33ff76fd0db58d75715e177d14dd4a761135ece6295bb96.yml -openapi_spec_hash: e0638786090ed4ef2bfd6499c7a357c3 -config_hash: 5bef3e307ef4a4c9c15194d299dac9f0 +configured_endpoints: 94 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lightspark/grid-bff283ab85d8d2be3f841a97363b5cc9cb3ceb7330a7dedf3ce10563441f4760.yml +openapi_spec_hash: 1f4d99d8f42550d737ef7a6e87342631 +config_hash: 2517fff6fa90dcb6123dd494c7f840b8 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e23a4cd..3b837a7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Changelog +## 1.8.0 (2026-05-07) + +Full Changelog: [v1.7.1...v1.8.0](https://github.com/lightsparkdev/grid-js-sdk/compare/v1.7.1...v1.8.0) + +### Features + +* **api:** add agents resource, device codes, me namespace, agentId to transactions ([4e14ef7](https://github.com/lightsparkdev/grid-js-sdk/commit/4e14ef7e1df416ac9180ae56d64008e6af86d59d)) +* **api:** add document type enum values to documents resource ([be789de](https://github.com/lightsparkdev/grid-js-sdk/commit/be789de7b9b7b0349d9405ce3fb4241a4e0704dc)) +* **api:** add pagination to platform.externalAccounts.list ([9bf7e0e](https://github.com/lightsparkdev/grid-js-sdk/commit/9bf7e0eaf009aa3ac5e3eb2872190020a332a46e)) +* **api:** manual updates ([75b2ad9](https://github.com/lightsparkdev/grid-js-sdk/commit/75b2ad9ec64aa6496c6f2e158a371c67339d0ddf)) +* **api:** manual updates ([b9a0cad](https://github.com/lightsparkdev/grid-js-sdk/commit/b9a0cad025b82396a7a8286f09d36e0cee3c6bf9)) +* **api:** manual updates ([3793af3](https://github.com/lightsparkdev/grid-js-sdk/commit/3793af3229ccc1dc3750849c46563a379048a14a)) +* Update cryptoNetwork values ([6908f84](https://github.com/lightsparkdev/grid-js-sdk/commit/6908f84f91dafb07202d0f29a9bac290aed89924)) + + +### Bug Fixes + +* **api:** remove cryptoNetwork field from external accounts ([64072cd](https://github.com/lightsparkdev/grid-js-sdk/commit/64072cdf999803c37e1c1061e2b8bcd888fb5a93)) +* **types:** make clientPublicKey required in EmailOtpCredentialVerifyRequest ([a15ca2e](https://github.com/lightsparkdev/grid-js-sdk/commit/a15ca2e64a42a7e8271e61a9fdab81a196b444ae)) +* **types:** make countryOfResidence optional, phoneNumber required in beneficiary types ([2fb820d](https://github.com/lightsparkdev/grid-js-sdk/commit/2fb820dba2d0b849fd47149d878a035e3f995153)) +* **types:** make fields optional in BDT/GHS/PKR account types ([75b1675](https://github.com/lightsparkdev/grid-js-sdk/commit/75b1675f61d88b0657e36f8b4e3fe569dd0b1eda)) +* **types:** update BDT/GHS/GTQ/HTG/JMD/PKR account and beneficiary types ([f21102a](https://github.com/lightsparkdev/grid-js-sdk/commit/f21102a8d02c768d927a02b67b82657cf9d27674)) + + +### Chores + +* avoid formatting file that gets changed during releases ([76ae105](https://github.com/lightsparkdev/grid-js-sdk/commit/76ae105e8416d30d5c19b8515552e52620bd04f2)) +* **format:** run eslint and prettier separately ([7f042f3](https://github.com/lightsparkdev/grid-js-sdk/commit/7f042f33f721a05e26f66da079892dc6b33994f3)) +* **internal:** codegen related update ([e3444b4](https://github.com/lightsparkdev/grid-js-sdk/commit/e3444b43c1a0f8b04bc6a39b864ebac19012bc8a)) + + +### Documentation + +* **api:** clarify nickname validation in auth credentials ([1eedd88](https://github.com/lightsparkdev/grid-js-sdk/commit/1eedd88be81fa1bbf8defcba7479d29afc6d430c)) +* **api:** clarify OAUTH credential challenge behavior in auth.credentials ([21c1a37](https://github.com/lightsparkdev/grid-js-sdk/commit/21c1a37b08adf1791280d1352f3a2bbf1d6708fa)) +* **api:** remove OTHER from documentType enum documentation in documents ([6bd7355](https://github.com/lightsparkdev/grid-js-sdk/commit/6bd7355fc324659f22a1001e91c83feb1e67521c)) +* **api:** update endpoint references in agents.me transfer and quote methods ([8b42438](https://github.com/lightsparkdev/grid-js-sdk/commit/8b4243825baa545d8402b0b9b9a9d4d2e273d488)) +* clarify forwards compat behavior ([e379a52](https://github.com/lightsparkdev/grid-js-sdk/commit/e379a52c805d530c1c1950594548a00ebb04438a)) +* update with proxy auth info ([b3e8864](https://github.com/lightsparkdev/grid-js-sdk/commit/b3e8864a570272cad87b73fd4bd4cb6dbed25b84)) + ## 1.7.1 (2026-04-28) Full Changelog: [v1.7.0...v1.7.1](https://github.com/lightsparkdev/grid-js-sdk/compare/v1.7.0...v1.7.1) diff --git a/README.md b/README.md index 5dd513cf..fe3abd0e 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ It is generated with [Stainless](https://www.stainless.com/). Use the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application. -[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwiWC1HcmlkLVNpZ25hdHVyZSI6Ik15IFdlYmhvb2sgU2lnbmF0dXJlIn19) -[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D) +[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwieC1ncmlkLWFnZW50LWFjY2Vzcy10b2tlbiI6Ik15IEFnZW50IEFjY2VzcyBUb2tlbiIsIlgtR3JpZC1TaWduYXR1cmUiOiJNeSBXZWJob29rIFNpZ25hdHVyZSJ9fQ) +[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22x-grid-agent-access-token%22%3A%22My%20Agent%20Access%20Token%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D) > Note: You may need to set environment variables in your MCP client. diff --git a/api.md b/api.md index ff867096..26328f4b 100644 --- a/api.md +++ b/api.md @@ -4,6 +4,7 @@ Types: - AedBeneficiary - AedExternalAccountCreateInfo +- AgentTransferDetails - BdtBeneficiary - BdtExternalAccountCreateInfo - BrlExternalAccountCreateInfo @@ -88,6 +89,8 @@ Types: - CustomerType - CustomerUpdate - IndividualCustomerFields +- InternalAccountExportRequest +- InternalAccountExportResponse - CustomerGetKYCLinkResponse Methods: @@ -97,6 +100,7 @@ Methods: - client.customers.update(customerID, { ...params }) -> CustomerOneOf - client.customers.list({ ...params }) -> CustomerOneovesDefaultPagination - client.customers.delete(customerID) -> CustomerOneOf +- client.customers.export(id, { ...params }) -> InternalAccountExportResponse - client.customers.getKYCLink({ ...params }) -> CustomerGetKYCLinkResponse - client.customers.listInternalAccounts({ ...params }) -> InternalAccountsDefaultPagination @@ -233,13 +237,12 @@ Types: - XofAccountInfo - ZarAccountInfo - ZmwAccountInfo -- ExternalAccountListResponse Methods: - client.platform.externalAccounts.create({ ...params }) -> ExternalAccount - client.platform.externalAccounts.retrieve(externalAccountID) -> ExternalAccount -- client.platform.externalAccounts.list({ ...params }) -> ExternalAccountListResponse +- client.platform.externalAccounts.list({ ...params }) -> ExternalAccountsDefaultPagination - client.platform.externalAccounts.delete(externalAccountID) -> void # TransferIn @@ -399,6 +402,7 @@ Methods: Types: +- AgentActionWebhookEvent - IncomingPaymentWebhookEvent - OutgoingPaymentWebhookEvent - TestWebhookWebhookEvent @@ -487,38 +491,139 @@ Methods: Types: +- AuthCredentialCreateRequest +- AuthCredentialCreateRequestOneOf +- AuthCredentialListResponse +- AuthCredentialResponseOneOf +- AuthCredentialVerifyRequest +- AuthCredentialVerifyRequestOneOf - AuthMethod -- CredentialListResponse -- CredentialResendChallengeResponse -- CredentialRevokeResponse -- CredentialVerifyResponse +- AuthMethodResponse +- AuthMethodType +- AuthSession +- AuthSignedRequestChallenge +- EmailOtpCredentialCreateRequest +- EmailOtpCredentialCreateRequestFields +- EmailOtpCredentialVerifyRequest +- EmailOtpCredentialVerifyRequestFields +- OAuthCredentialCreateRequest +- OAuthCredentialCreateRequestFields +- OAuthCredentialVerifyRequest +- OAuthCredentialVerifyRequestFields +- PasskeyAssertion +- PasskeyAttestation +- PasskeyAuthChallenge +- PasskeyCredentialCreateRequest +- PasskeyCredentialCreateRequestFields +- PasskeyCredentialVerifyRequest +- PasskeyCredentialVerifyRequestFields +- SignedRequestChallenge Methods: -- client.auth.credentials.create({ ...params }) -> AuthMethod -- client.auth.credentials.list({ ...params }) -> CredentialListResponse -- client.auth.credentials.resendChallenge(id, { ...params }) -> CredentialResendChallengeResponse -- client.auth.credentials.revoke(id, { ...params }) -> CredentialRevokeResponse -- client.auth.credentials.verify(id, { ...params }) -> CredentialVerifyResponse +- client.auth.credentials.create({ ...params }) -> AuthMethodResponse +- client.auth.credentials.list({ ...params }) -> AuthCredentialListResponse +- client.auth.credentials.delete(id, { ...params }) -> AuthSignedRequestChallenge +- client.auth.credentials.challenge(id, { ...params }) -> AuthCredentialResponseOneOf +- client.auth.credentials.verify(id, { ...params }) -> AuthSession ## Sessions Types: - SessionListResponse -- SessionRevokeResponse Methods: - client.auth.sessions.list({ ...params }) -> SessionListResponse -- client.auth.sessions.revoke(id, { ...params }) -> SessionRevokeResponse +- client.auth.sessions.delete(id, { ...params }) -> AuthSignedRequestChallenge -# InternalAccounts +# Agents Types: -- InternalAccountExportResponse +- Agent +- AgentAction +- AgentActionListResponse +- AgentActionRejectRequest +- AgentCreateRequest +- AgentCreateResponse +- AgentDeviceCode +- AgentDeviceCodeRedeemResponse +- AgentDeviceCodeStatusResponse +- AgentListResponse +- AgentPolicy +- AgentUpdateRequest +- AgentUsage Methods: -- client.internalAccounts.export(id, { ...params }) -> InternalAccountExportResponse +- client.agents.create({ ...params }) -> AgentCreateResponse +- client.agents.retrieve(agentID) -> Agent +- client.agents.update(agentID, { ...params }) -> Agent +- client.agents.list({ ...params }) -> AgentsDefaultPagination +- client.agents.delete(agentID) -> void +- client.agents.listApprovals({ ...params }) -> AgentActionsDefaultPagination +- client.agents.updatePolicy(agentID, { ...params }) -> Agent + +## Me + +Methods: + +- client.agents.me.retrieve() -> Agent +- client.agents.me.createTransferIn({ ...params }) -> AgentAction +- client.agents.me.createTransferOut({ ...params }) -> AgentAction +- client.agents.me.listInternalAccounts({ ...params }) -> InternalAccountsDefaultPagination + +### Transactions + +Methods: + +- client.agents.me.transactions.retrieve(transactionID) -> Transaction +- client.agents.me.transactions.list({ ...params }) -> TransactionsDefaultPagination + +### Quotes + +Methods: + +- client.agents.me.quotes.create({ ...params }) -> Quote +- client.agents.me.quotes.retrieve(quoteID) -> Quote +- client.agents.me.quotes.execute(quoteID, { ...params }) -> AgentAction + +### ExternalAccounts + +Methods: + +- client.agents.me.externalAccounts.retrieve(externalAccountID) -> ExternalAccount +- client.agents.me.externalAccounts.list({ ...params }) -> ExternalAccountsDefaultPagination +- client.agents.me.externalAccounts.delete(externalAccountID) -> void +- client.agents.me.externalAccounts.add({ ...params }) -> ExternalAccount + +### Actions + +Methods: + +- client.agents.me.actions.retrieve(actionID) -> AgentAction +- client.agents.me.actions.list({ ...params }) -> AgentActionsDefaultPagination + +## DeviceCodes + +Methods: + +- client.agents.deviceCodes.getStatus(code) -> AgentDeviceCodeStatusResponse +- client.agents.deviceCodes.redeem(code) -> AgentDeviceCodeRedeemResponse +- client.agents.deviceCodes.regenerate(agentID) -> AgentDeviceCode + +## Transactions + +Methods: + +- client.agents.transactions.approve(actionID, { ...params }) -> AgentAction +- client.agents.transactions.reject(actionID, { ...params }) -> AgentAction + +## Actions + +Methods: + +- client.agents.actions.approve(actionID, { ...params }) -> AgentAction +- client.agents.actions.reject(actionID, { ...params }) -> AgentAction diff --git a/eslint.config.mjs b/eslint.config.mjs index 1438f163..d5709e0d 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,7 +1,6 @@ // @ts-check import tseslint from 'typescript-eslint'; import unusedImports from 'eslint-plugin-unused-imports'; -import prettier from 'eslint-plugin-prettier'; export default tseslint.config( { @@ -14,11 +13,9 @@ export default tseslint.config( plugins: { '@typescript-eslint': tseslint.plugin, 'unused-imports': unusedImports, - prettier, }, rules: { 'no-unused-vars': 'off', - 'prettier/prettier': 'error', 'unused-imports/no-unused-imports': 'error', 'no-restricted-imports': [ 'error', diff --git a/jsr.json b/jsr.json index c08bdb05..e356562b 100644 --- a/jsr.json +++ b/jsr.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/grid", - "version": "1.7.1", + "version": "1.8.0", "exports": "./index.ts", "publish": { "exclude": [ diff --git a/package.json b/package.json index 7d9d0113..bf30d9ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/grid", - "version": "1.7.1", + "version": "1.8.0", "description": "The official TypeScript library for the Lightspark Grid API", "author": "Lightspark Grid ", "types": "dist/index.d.ts", @@ -37,7 +37,6 @@ "@typescript-eslint/parser": "8.31.1", "@typescript-eslint/typescript-estree": "8.31.1", "eslint": "^9.39.1", - "eslint-plugin-prettier": "^5.4.1", "eslint-plugin-unused-imports": "^4.1.4", "iconv-lite": "^0.6.3", "jest": "^29.4.0", diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md index e6a815c0..3f76eb24 100644 --- a/packages/mcp-server/README.md +++ b/packages/mcp-server/README.md @@ -11,6 +11,7 @@ You can run the MCP Server directly via `npx`: ```sh export GRID_CLIENT_ID="My Username" export GRID_CLIENT_SECRET="My Password" +export GRID_AGENT_ACCESS_TOKEN="My Agent Access Token" export GRID_WEBHOOK_PUBKEY="My Webhook Signature" npx -y @lightsparkdev/grid-mcp@latest ``` @@ -31,6 +32,7 @@ For clients with a configuration JSON, it might look something like this: "env": { "GRID_CLIENT_ID": "My Username", "GRID_CLIENT_SECRET": "My Password", + "GRID_AGENT_ACCESS_TOKEN": "My Agent Access Token", "GRID_WEBHOOK_PUBKEY": "My Webhook Signature" } } @@ -43,14 +45,14 @@ For clients with a configuration JSON, it might look something like this: If you use Cursor, you can install the MCP server by using the button below. You will need to set your environment variables in Cursor's `mcp.json`, which can be found in Cursor Settings > Tools & MCP > New MCP Server. -[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwiWC1HcmlkLVNpZ25hdHVyZSI6Ik15IFdlYmhvb2sgU2lnbmF0dXJlIn19) +[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwieC1ncmlkLWFnZW50LWFjY2Vzcy10b2tlbiI6Ik15IEFnZW50IEFjY2VzcyBUb2tlbiIsIlgtR3JpZC1TaWduYXR1cmUiOiJNeSBXZWJob29rIFNpZ25hdHVyZSJ9fQ) ### VS Code If you use MCP, you can install the MCP server by clicking the link below. You will need to set your environment variables in VS Code's `mcp.json`, which can be found via Command Palette > MCP: Open User Configuration. -[Open VS Code](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D) +[Open VS Code](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22x-grid-agent-access-token%22%3A%22My%20Agent%20Access%20Token%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D) ### Claude Code @@ -58,7 +60,7 @@ If you use Claude Code, you can install the MCP server by running the command be environment variables in Claude Code's `.claude.json`, which can be found in your home directory. ``` -claude mcp add lightsparkdev_grid_mcp_api --header "x-grid-client-id: My Username" --header "x-grid-client-secret: My Password" --header "X-Grid-Signature: My Webhook Signature" --transport http https://grid-mcp.stlmcp.com +claude mcp add lightsparkdev_grid_mcp_api --header "x-grid-client-id: My Username" --header "x-grid-client-secret: My Password" --header "x-grid-agent-access-token: My Agent Access Token" --header "X-Grid-Signature: My Webhook Signature" --transport http https://grid-mcp.stlmcp.com ``` ## Code Mode @@ -82,13 +84,14 @@ and repeatably. Launching the client with `--transport=http` launches the server as a remote server using Streamable HTTP transport. The `--port` setting can choose the port it will run on, and the `--socket` setting allows it to run on a Unix socket. -Authorization can be provided via the `Authorization` header using the Basic scheme. +Authorization can be provided via the `Authorization` header using the Basic or Bearer scheme. Additionally, authorization can be provided via the following headers: | Header | Equivalent client option | Security scheme | -| ---------------------- | ------------------------ | ---------------- | +| --------------------------- | ------------------------ | ---------------- | | `x-grid-client-id` | `username` | BasicAuth | | `x-grid-client-secret` | `password` | BasicAuth | +| `x-grid-agent-access-token` | `agentAccessToken` | AgentAuth | | `X-Grid-Signature` | `webhookSignature` | WebhookSignature | A configuration JSON for this server might look like this, assuming the server is hosted at `http://localhost:3000`: diff --git a/packages/mcp-server/manifest.json b/packages/mcp-server/manifest.json index 397fd420..f7831306 100644 --- a/packages/mcp-server/manifest.json +++ b/packages/mcp-server/manifest.json @@ -1,7 +1,7 @@ { "dxt_version": "0.2", "name": "@lightsparkdev/grid-mcp", - "version": "1.7.1", + "version": "1.8.0", "description": "The official MCP Server for the Lightspark Grid API", "author": { "name": "Lightspark Grid", @@ -23,6 +23,7 @@ "env": { "GRID_CLIENT_ID": "${user_config.GRID_CLIENT_ID}", "GRID_CLIENT_SECRET": "${user_config.GRID_CLIENT_SECRET}", + "GRID_AGENT_ACCESS_TOKEN": "${user_config.GRID_AGENT_ACCESS_TOKEN}", "GRID_WEBHOOK_PUBKEY": "${user_config.GRID_WEBHOOK_PUBKEY}" } } @@ -31,13 +32,19 @@ "GRID_CLIENT_ID": { "title": "username", "description": "API token authentication using format `:`", - "required": true, + "required": false, "type": "string" }, "GRID_CLIENT_SECRET": { "title": "password", "description": "API token authentication using format `:`", - "required": true, + "required": false, + "type": "string" + }, + "GRID_AGENT_ACCESS_TOKEN": { + "title": "agent_access_token", + "description": "Bearer access token obtained by redeeming a device code. Required when calling agent-scoped endpoints (e.g. `GET /agents/me/...`). Leave unset for platform-scoped operations.", + "required": false, "type": "string" }, "GRID_WEBHOOK_PUBKEY": { diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index ae18b4f3..93403ad4 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/grid-mcp", - "version": "1.7.1", + "version": "1.8.0", "description": "The official MCP Server for the Lightspark Grid API", "author": "Lightspark Grid ", "types": "dist/index.d.ts", diff --git a/packages/mcp-server/src/auth.ts b/packages/mcp-server/src/auth.ts index 1139d1ac..d6feaf1a 100644 --- a/packages/mcp-server/src/auth.ts +++ b/packages/mcp-server/src/auth.ts @@ -15,9 +15,11 @@ export const parseClientAuthHeaders = (req: IncomingMessage, required?: boolean) username: rawValue.slice(0, rawValue.search(':')), password: rawValue.slice(rawValue.search(':') + 1), }; + case 'Bearer': + return { agentAccessToken: req.headers.authorization.slice('Bearer '.length) }; default: throw new Error( - 'Unsupported authorization scheme. Expected the "Authorization" header to be a supported scheme (Basic).', + 'Unsupported authorization scheme. Expected the "Authorization" header to be a supported scheme (Basic, Bearer).', ); } } else if (required) { @@ -32,11 +34,15 @@ export const parseClientAuthHeaders = (req: IncomingMessage, required?: boolean) Array.isArray(req.headers['x-grid-client-secret']) ? req.headers['x-grid-client-secret'][0] : req.headers['x-grid-client-secret']; + const agentAccessToken = + Array.isArray(req.headers['x-grid-agent-access-token']) ? + req.headers['x-grid-agent-access-token'][0] + : req.headers['x-grid-agent-access-token']; const webhookSignature = Array.isArray(req.headers['x-grid-signature']) ? req.headers['x-grid-signature'][0] : req.headers['x-grid-signature']; - return { username, password, webhookSignature }; + return { username, password, agentAccessToken, webhookSignature }; }; export const getStainlessApiKey = (req: IncomingMessage, mcpOptions: McpOptions): string | undefined => { diff --git a/packages/mcp-server/src/code-tool-worker.ts b/packages/mcp-server/src/code-tool-worker.ts index 45b079ef..e118cd35 100644 --- a/packages/mcp-server/src/code-tool-worker.ts +++ b/packages/mcp-server/src/code-tool-worker.ts @@ -112,6 +112,7 @@ const fuse = new Fuse( 'client.config.update', 'client.customers.create', 'client.customers.delete', + 'client.customers.export', 'client.customers.getKYCLink', 'client.customers.list', 'client.customers.listInternalAccounts', @@ -168,14 +169,42 @@ const fuse = new Fuse( 'client.verifications.retrieve', 'client.verifications.submit', 'client.discoveries.list', + 'client.auth.credentials.challenge', 'client.auth.credentials.create', + 'client.auth.credentials.delete', 'client.auth.credentials.list', - 'client.auth.credentials.resendChallenge', - 'client.auth.credentials.revoke', 'client.auth.credentials.verify', + 'client.auth.sessions.delete', 'client.auth.sessions.list', - 'client.auth.sessions.revoke', - 'client.internalAccounts.export', + 'client.agents.create', + 'client.agents.delete', + 'client.agents.list', + 'client.agents.listApprovals', + 'client.agents.retrieve', + 'client.agents.update', + 'client.agents.updatePolicy', + 'client.agents.me.createTransferIn', + 'client.agents.me.createTransferOut', + 'client.agents.me.listInternalAccounts', + 'client.agents.me.retrieve', + 'client.agents.me.transactions.list', + 'client.agents.me.transactions.retrieve', + 'client.agents.me.quotes.create', + 'client.agents.me.quotes.execute', + 'client.agents.me.quotes.retrieve', + 'client.agents.me.externalAccounts.add', + 'client.agents.me.externalAccounts.delete', + 'client.agents.me.externalAccounts.list', + 'client.agents.me.externalAccounts.retrieve', + 'client.agents.me.actions.list', + 'client.agents.me.actions.retrieve', + 'client.agents.deviceCodes.getStatus', + 'client.agents.deviceCodes.redeem', + 'client.agents.deviceCodes.regenerate', + 'client.agents.transactions.approve', + 'client.agents.transactions.reject', + 'client.agents.actions.approve', + 'client.agents.actions.reject', ], { threshold: 1, shouldSort: true }, ); diff --git a/packages/mcp-server/src/code-tool.ts b/packages/mcp-server/src/code-tool.ts index c61c3faa..6d9c1865 100644 --- a/packages/mcp-server/src/code-tool.ts +++ b/packages/mcp-server/src/code-tool.ts @@ -10,7 +10,7 @@ import { asTextContentResult, } from './types'; import { Tool } from '@modelcontextprotocol/sdk/types.js'; -import { readEnv, requireValue } from './util'; +import { readEnv } from './util'; import { WorkerInput, WorkerOutput } from './code-tool-types'; import { getLogger } from './logger'; import { SdkMethod } from './methods'; @@ -150,14 +150,9 @@ const remoteStainlessHandler = async ({ const codeModeEndpoint = readEnv('CODE_MODE_ENDPOINT_URL') ?? 'https://api.stainless.com/api/ai/code-tool'; const localClientEnvs = { - GRID_CLIENT_ID: requireValue( - readEnv('GRID_CLIENT_ID') ?? client.username, - 'set GRID_CLIENT_ID environment variable or provide username client option', - ), - GRID_CLIENT_SECRET: requireValue( - readEnv('GRID_CLIENT_SECRET') ?? client.password, - 'set GRID_CLIENT_SECRET environment variable or provide password client option', - ), + GRID_CLIENT_ID: readEnv('GRID_CLIENT_ID') ?? client.username ?? undefined, + GRID_CLIENT_SECRET: readEnv('GRID_CLIENT_SECRET') ?? client.password ?? undefined, + GRID_AGENT_ACCESS_TOKEN: readEnv('GRID_AGENT_ACCESS_TOKEN') ?? client.agentAccessToken ?? undefined, GRID_WEBHOOK_PUBKEY: readEnv('GRID_WEBHOOK_PUBKEY') ?? client.webhookSignature ?? undefined, LIGHTSPARK_GRID_BASE_URL: readEnv('LIGHTSPARK_GRID_BASE_URL') ?? client.baseURL ?? undefined, }; @@ -299,6 +294,7 @@ const localDenoHandler = async ({ ...(client.baseURL != null ? { baseURL: client.baseURL } : undefined), ...(client.username != null ? { username: client.username } : undefined), ...(client.password != null ? { password: client.password } : undefined), + ...(client.agentAccessToken != null ? { agentAccessToken: client.agentAccessToken } : undefined), ...(client.webhookSignature != null ? { webhookSignature: client.webhookSignature } : undefined), defaultHeaders: { 'X-Stainless-MCP': 'true', diff --git a/packages/mcp-server/src/local-docs-search.ts b/packages/mcp-server/src/local-docs-search.ts index a201dfcb..569e2f51 100644 --- a/packages/mcp-server/src/local-docs-search.ts +++ b/packages/mcp-server/src/local-docs-search.ts @@ -371,7 +371,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }", markdown: - "## list_internal_accounts\n\n`client.customers.listInternalAccounts(currency?: string, cursor?: string, customerId?: string, limit?: number, type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'): { id: string; balance: currency_amount; createdAt: string; fundingPaymentInstructions: payment_instructions[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n**get** `/customers/internal-accounts`\n\nRetrieve a list of internal accounts with optional filtering parameters. Returns all\ninternal accounts that match the specified filters. If no filters are provided, returns all internal accounts\n(paginated).\n\nInternal accounts are created automatically when a customer is created based on the platform configuration.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by internal accounts associated with a specific customer\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n Filter by internal account type. Use `EMBEDDED_WALLET` to find the self-custodial wallet provisioned for a customer, or `INTERNAL_FIAT` / `INTERNAL_CRYPTO` for the platform-managed holding accounts.\n\n### Returns\n\n- `{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n - `id: string`\n - `balance: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `createdAt: string`\n - `fundingPaymentInstructions: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n - `updatedAt: string`\n - `customerId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const internalAccount of client.customers.listInternalAccounts()) {\n console.log(internalAccount);\n}\n```", + "## list_internal_accounts\n\n`client.customers.listInternalAccounts(currency?: string, cursor?: string, customerId?: string, limit?: number, type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'): { id: string; balance: currency_amount; createdAt: string; fundingPaymentInstructions: payment_instructions[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n**get** `/customers/internal-accounts`\n\nRetrieve a list of internal accounts with optional filtering parameters. Returns all\ninternal accounts that match the specified filters. If no filters are provided, returns all internal accounts\n(paginated).\n\nInternal accounts are created automatically when a customer is created based on the platform configuration.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by internal accounts associated with a specific customer\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n Filter by internal account type. Use `EMBEDDED_WALLET` to find the self-custodial wallet provisioned for a customer, or `INTERNAL_FIAT` / `INTERNAL_CRYPTO` for the platform-managed holding accounts.\n\n### Returns\n\n- `{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n - `id: string`\n - `balance: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `createdAt: string`\n - `fundingPaymentInstructions: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n - `updatedAt: string`\n - `customerId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const internalAccount of client.customers.listInternalAccounts()) {\n console.log(internalAccount);\n}\n```", perLanguage: { typescript: { method: 'client.customers.listInternalAccounts', @@ -394,6 +394,46 @@ const EMBEDDED_METHODS: MethodEntry[] = [ }, }, }, + { + name: 'export', + endpoint: '/internal-accounts/{id}/export', + httpMethod: 'post', + summary: 'Export internal account wallet credentials', + description: + 'Export the wallet credentials of an Embedded Wallet internal account. The returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied in the request body.\n\nExport is a two-step signed-retry flow (same pattern as add-additional credential, revoke credential, and revoke session):\n\n1. Call `POST /internal-accounts/{id}/export` with the request body `{ "clientPublicKey": "..." }` and no signature headers. Grid binds the `clientPublicKey` into the `payloadToSign` it returns, so the subsequent stamp in `Grid-Wallet-Signature` commits to the target encryption key. The response is `202` with `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified authentication credential on the same internal account to build an API-key stamp over `payloadToSign`, then retry with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The retry body must carry the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry with `401` if it disagrees with what was bound into `payloadToSign`. The signed retry returns `200` with `encryptedWalletCredentials`, which the client decrypts with the matching private key.\n\nThe `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this export and discard the private key after decrypting. Do not reuse the keypair from any prior verify call — that private key was already discarded after decrypting the session signing key it was issued against.\n', + stainlessPath: '(resource) customers > (method) export', + qualified: 'client.customers.export', + params: [ + 'id: string;', + 'clientPublicKey: string;', + 'Grid-Wallet-Signature?: string;', + 'Request-Id?: string;', + ], + response: '{ id: string; encryptedWalletCredentials: string; }', + markdown: + "## export\n\n`client.customers.export(id: string, clientPublicKey: string, Grid-Wallet-Signature?: string, Request-Id?: string): { id: string; encryptedWalletCredentials: string; }`\n\n**post** `/internal-accounts/{id}/export`\n\nExport the wallet credentials of an Embedded Wallet internal account. The returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied in the request body.\n\nExport is a two-step signed-retry flow (same pattern as add-additional credential, revoke credential, and revoke session):\n\n1. Call `POST /internal-accounts/{id}/export` with the request body `{ \"clientPublicKey\": \"...\" }` and no signature headers. Grid binds the `clientPublicKey` into the `payloadToSign` it returns, so the subsequent stamp in `Grid-Wallet-Signature` commits to the target encryption key. The response is `202` with `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified authentication credential on the same internal account to build an API-key stamp over `payloadToSign`, then retry with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The retry body must carry the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry with `401` if it disagrees with what was bound into `payloadToSign`. The signed retry returns `200` with `encryptedWalletCredentials`, which the client decrypts with the matching private key.\n\nThe `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this export and discard the private key after decrypting. Do not reuse the keypair from any prior verify call — that private key was already discarded after decrypting the session signing key it was issued against.\n\n\n### Parameters\n\n- `id: string`\n\n- `clientPublicKey: string`\n Fresh P-256 public key, uncompressed SEC1 hex — 130 hex chars where the first two are `04` (the uncompressed-point indicator). Generate a new keypair for each export and discard the private key after decrypting the response.\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; encryptedWalletCredentials: string; }`\n\n - `id: string`\n - `encryptedWalletCredentials: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst internalAccountExportResponse = await client.customers.export('id', { clientPublicKey: '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2' });\n\nconsole.log(internalAccountExportResponse);\n```", + perLanguage: { + typescript: { + method: 'client.customers.export', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst internalAccountExportResponse = await client.customers.export('id', {\n clientPublicKey:\n '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n});\n\nconsole.log(internalAccountExportResponse.id);", + }, + python: { + method: 'customers.export', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\ninternal_account_export_response = client.customers.export(\n id="id",\n client_public_key="04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n)\nprint(internal_account_export_response.id)', + }, + kotlin: { + method: 'customers().export', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.customers.CustomerExportParams\nimport com.lightspark.grid.models.customers.InternalAccountExportRequest\nimport com.lightspark.grid.models.customers.InternalAccountExportResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CustomerExportParams = CustomerExportParams.builder()\n .id("id")\n .internalAccountExportRequest(InternalAccountExportRequest.builder()\n .clientPublicKey("04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2")\n .build())\n .build()\n val internalAccountExportResponse: InternalAccountExportResponse = client.customers().export(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/internal-accounts/$ID/export \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "clientPublicKey": "04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2"\n }\'', + }, + }, + }, { name: 'list', endpoint: '/customers/external-accounts', @@ -405,9 +445,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.customers.externalAccounts.list', params: ['currency?: string;', 'cursor?: string;', 'customerId?: string;', 'limit?: number;'], response: - "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## list\n\n`client.customers.externalAccounts.list(currency?: string, cursor?: string, customerId?: string, limit?: number): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/customers/external-accounts`\n\nRetrieve a list of external accounts with optional filtering parameters. Returns all\nexternal accounts that match the specified filters. If no filters are provided, returns all external accounts\n(paginated).\n\nExternal accounts are bank accounts, cryptocurrency wallets, or other payment destinations that customers can use to receive funds from the platform.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by external accounts associated with a specific customer\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `cryptoNetwork?: string`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.customers.externalAccounts.list()) {\n console.log(externalAccount);\n}\n```", + "## list\n\n`client.customers.externalAccounts.list(currency?: string, cursor?: string, customerId?: string, limit?: number): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/customers/external-accounts`\n\nRetrieve a list of external accounts with optional filtering parameters. Returns all\nexternal accounts that match the specified filters. If no filters are provided, returns all external accounts\n(paginated).\n\nExternal accounts are bank accounts, cryptocurrency wallets, or other payment destinations that customers can use to receive funds from the platform.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by external accounts associated with a specific customer\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.customers.externalAccounts.list()) {\n console.log(externalAccount);\n}\n```", perLanguage: { typescript: { method: 'client.customers.externalAccounts.list', @@ -439,17 +479,16 @@ const EMBEDDED_METHODS: MethodEntry[] = [ stainlessPath: '(resource) customers.external_accounts > (method) create', qualified: 'client.customers.externalAccounts.create', params: [ - "accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; };", + "accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; };", 'currency: string;', - 'cryptoNetwork?: string;', 'customerId?: string;', 'defaultUmaDepositAccount?: boolean;', 'platformAccountId?: string;', ], response: - "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## create\n\n`client.customers.externalAccounts.create(accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: aed_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: brl_beneficiary | business_beneficiary; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: bwp_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: cad_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: dkk_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: eur_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: gbp_beneficiary | business_beneficiary; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: hkd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: idr_beneficiary | business_beneficiary; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: inr_beneficiary | business_beneficiary; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: kes_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: mwk_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: mxn_beneficiary | business_beneficiary; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: myr_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: ngn_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: php_beneficiary | business_beneficiary; } | { accountType: 'RWF_ACCOUNT'; beneficiary: rwf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: sgd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: thb_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: tzs_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: ugx_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: usd_beneficiary | business_beneficiary; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: vnd_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: xaf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: xof_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: zar_beneficiary | business_beneficiary; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: zmw_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: bdt_beneficiary | business_beneficiary; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: cop_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: egp_beneficiary | business_beneficiary; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: ghs_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: gtq_beneficiary | business_beneficiary; } | { accountType: 'HTG_ACCOUNT'; beneficiary: htg_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: jmd_beneficiary | business_beneficiary; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: pkr_beneficiary | business_beneficiary; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }, currency: string, cryptoNetwork?: string, customerId?: string, defaultUmaDepositAccount?: boolean, platformAccountId?: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**post** `/customers/external-accounts`\n\nRegister a new external bank account for a customer.\n\n### Parameters\n\n- `accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }`\n Lightning payment destination. Exactly one of `invoice`, `bolt12`, or `lightningAddress` must be provided.\n\n\n- `currency: string`\n The ISO 4217 currency code\n\n- `cryptoNetwork?: string`\n The blockchain network for this external account. Required when the account is a cryptocurrency wallet. Specifies which network the wallet is on. Example values: SOLANA_MAINNET, SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, BASE_TESTNET, SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, LIGHTNING_REGTEST.\n\n- `customerId?: string`\n The ID of the customer for whom to create the external account. If not provided, the external account will be created on behalf of the platform.\n\n- `defaultUmaDepositAccount?: boolean`\n Whether to set the external account as the default UMA deposit account. When set to true, incoming payments to this customer's UMA address will be automatically deposited into this external account. False if not provided. Note that only one external account can be set as the default UMA deposit account for a customer, so if there is already a default UMA deposit account, this will override the existing default UMA deposit account. If there is no default UMA deposit account, incoming UMA payments will be deposited into the primary internal account for the customer.\n\n- `platformAccountId?: string`\n Your platform's identifier for the account in your system. This can be used to reference the account by your own identifier.\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `cryptoNetwork?: string`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.customers.externalAccounts.create({\n accountInfo: {\n accountNumber: '12345678901',\n accountType: 'USD_ACCOUNT',\n beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' },\n routingNumber: '123456789',\n},\n currency: 'USD',\n});\n\nconsole.log(externalAccount);\n```", + "## create\n\n`client.customers.externalAccounts.create(accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: aed_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: brl_beneficiary | business_beneficiary; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: bwp_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: cad_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: dkk_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: eur_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: gbp_beneficiary | business_beneficiary; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: hkd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: idr_beneficiary | business_beneficiary; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: inr_beneficiary | business_beneficiary; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: kes_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: mwk_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: mxn_beneficiary | business_beneficiary; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: myr_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: ngn_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: php_beneficiary | business_beneficiary; } | { accountType: 'RWF_ACCOUNT'; beneficiary: rwf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: sgd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: thb_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: tzs_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: ugx_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: usd_beneficiary | business_beneficiary; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: vnd_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: xaf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: xof_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: zar_beneficiary | business_beneficiary; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: zmw_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: bdt_beneficiary | business_beneficiary; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: cop_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: egp_beneficiary | business_beneficiary; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: ghs_beneficiary | business_beneficiary; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: gtq_beneficiary | business_beneficiary; } | { accountType: 'HTG_ACCOUNT'; beneficiary: htg_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: jmd_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: pkr_beneficiary | business_beneficiary; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }, currency: string, customerId?: string, defaultUmaDepositAccount?: boolean, platformAccountId?: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**post** `/customers/external-accounts`\n\nRegister a new external bank account for a customer.\n\n### Parameters\n\n- `accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }`\n Lightning payment destination. Exactly one of `invoice`, `bolt12`, or `lightningAddress` must be provided.\n\n\n- `currency: string`\n The ISO 4217 currency code\n\n- `customerId?: string`\n The ID of the customer for whom to create the external account. If not provided, the external account will be created on behalf of the platform.\n\n- `defaultUmaDepositAccount?: boolean`\n Whether to set the external account as the default UMA deposit account. When set to true, incoming payments to this customer's UMA address will be automatically deposited into this external account. False if not provided. Note that only one external account can be set as the default UMA deposit account for a customer, so if there is already a default UMA deposit account, this will override the existing default UMA deposit account. If there is no default UMA deposit account, incoming UMA payments will be deposited into the primary internal account for the customer.\n\n- `platformAccountId?: string`\n Your platform's identifier for the account in your system. This can be used to reference the account by your own identifier.\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.customers.externalAccounts.create({\n accountInfo: {\n accountNumber: '12345678901',\n accountType: 'USD_ACCOUNT',\n beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' },\n routingNumber: '123456789',\n},\n currency: 'USD',\n});\n\nconsole.log(externalAccount);\n```", perLanguage: { typescript: { method: 'client.customers.externalAccounts.create', @@ -464,11 +503,11 @@ const EMBEDDED_METHODS: MethodEntry[] = [ kotlin: { method: 'customers().externalAccounts().create', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.UsdExternalAccountCreateInfo\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccount\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccountCreate\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccountCreateParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: ExternalAccountCreate = ExternalAccountCreate.builder()\n .accountInfo(UsdExternalAccountCreateInfo.builder()\n .accountNumber("12345678901")\n .accountType(UsdExternalAccountCreateInfo.AccountType.USD_ACCOUNT)\n .individualBeneficiary("John Doe")\n .routingNumber("123456789")\n .build())\n .currency("USD")\n .build()\n val externalAccount: ExternalAccount = client.customers().externalAccounts().create(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.UsdExternalAccountCreateInfo\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccount\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccountCreate\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: ExternalAccountCreate = ExternalAccountCreate.builder()\n .accountInfo(UsdExternalAccountCreateInfo.builder()\n .accountNumber("12345678901")\n .accountType(UsdExternalAccountCreateInfo.AccountType.USD_ACCOUNT)\n .individualBeneficiary("John Doe")\n .routingNumber("123456789")\n .build())\n .currency("USD")\n .build()\n val externalAccount: ExternalAccount = client.customers().externalAccounts().create(params)\n}', }, http: { example: - 'curl https://api.lightspark.com/grid/2025-10-13/customers/external-accounts \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "accountInfo": {\n "accountNumber": "12345678901",\n "accountType": "USD_ACCOUNT",\n "beneficiary": {\n "beneficiaryType": "INDIVIDUAL",\n "fullName": "John Doe",\n "address": {\n "country": "US",\n "line1": "123 Main Street",\n "postalCode": "94105",\n "city": "San Francisco",\n "state": "CA"\n },\n "birthDate": "1990-01-15",\n "nationality": "US"\n },\n "routingNumber": "123456789"\n },\n "currency": "USD",\n "cryptoNetwork": "SOLANA_MAINNET",\n "customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",\n "platformAccountId": "ext_acc_123456"\n }\'', + 'curl https://api.lightspark.com/grid/2025-10-13/customers/external-accounts \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "accountInfo": {\n "accountNumber": "12345678901",\n "accountType": "USD_ACCOUNT",\n "beneficiary": {\n "beneficiaryType": "INDIVIDUAL",\n "fullName": "John Doe",\n "address": {\n "country": "US",\n "line1": "123 Main Street",\n "postalCode": "94105",\n "city": "San Francisco",\n "state": "CA"\n },\n "birthDate": "1990-01-15",\n "nationality": "US"\n },\n "routingNumber": "123456789"\n },\n "currency": "USD",\n "customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",\n "platformAccountId": "ext_acc_123456"\n }\'', }, }, }, @@ -482,9 +521,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.customers.externalAccounts.retrieve', params: ['externalAccountId: string;'], response: - "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## retrieve\n\n`client.customers.externalAccounts.retrieve(externalAccountId: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/customers/external-accounts/{externalAccountId}`\n\nRetrieve a customer external account by its system-generated ID\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `cryptoNetwork?: string`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.customers.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount);\n```", + "## retrieve\n\n`client.customers.externalAccounts.retrieve(externalAccountId: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/customers/external-accounts/{externalAccountId}`\n\nRetrieve a customer external account by its system-generated ID\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.customers.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount);\n```", perLanguage: { typescript: { method: 'client.customers.externalAccounts.retrieve', @@ -656,26 +695,26 @@ const EMBEDDED_METHODS: MethodEntry[] = [ 'Retrieve a list of all external accounts that belong to the platform, as opposed to an individual customer.\n\nThese accounts are used for platform-wide operations such as receiving funds from external sources or managing platform-level payment destinations.\n', stainlessPath: '(resource) platform.external_accounts > (method) list', qualified: 'client.platform.externalAccounts.list', - params: ['currency?: string;'], + params: ['currency?: string;', 'cursor?: string;', 'limit?: number;'], response: - "{ data: { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }[]; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## list\n\n`client.platform.externalAccounts.list(currency?: string): { data: external_account[]; }`\n\n**get** `/platform/external-accounts`\n\nRetrieve a list of all external accounts that belong to the platform, as opposed to an individual customer.\n\nThese accounts are used for platform-wide operations such as receiving funds from external sources or managing platform-level payment destinations.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n### Returns\n\n- `{ data: { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }[]; }`\n\n - `data: { id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }[]`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccounts = await client.platform.externalAccounts.list();\n\nconsole.log(externalAccounts);\n```", + "## list\n\n`client.platform.externalAccounts.list(currency?: string, cursor?: string, limit?: number): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/platform/external-accounts`\n\nRetrieve a list of all external accounts that belong to the platform, as opposed to an individual customer.\n\nThese accounts are used for platform-wide operations such as receiving funds from external sources or managing platform-level payment destinations.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.platform.externalAccounts.list()) {\n console.log(externalAccount);\n}\n```", perLanguage: { typescript: { method: 'client.platform.externalAccounts.list', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst externalAccounts = await client.platform.externalAccounts.list();\n\nconsole.log(externalAccounts.data);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.platform.externalAccounts.list()) {\n console.log(externalAccount.id);\n}", }, python: { method: 'platform.external_accounts.list', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nexternal_accounts = client.platform.external_accounts.list()\nprint(external_accounts.data)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\npage = client.platform.external_accounts.list()\npage = page.data[0]\nprint(page.id)', }, kotlin: { method: 'platform().externalAccounts().list', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.platform.externalaccounts.ExternalAccountListParams\nimport com.lightspark.grid.models.platform.externalaccounts.ExternalAccountListResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val externalAccounts: ExternalAccountListResponse = client.platform().externalAccounts().list()\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.platform.externalaccounts.ExternalAccountListPage\nimport com.lightspark.grid.models.platform.externalaccounts.ExternalAccountListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: ExternalAccountListPage = client.platform().externalAccounts().list()\n}', }, http: { example: @@ -692,14 +731,14 @@ const EMBEDDED_METHODS: MethodEntry[] = [ stainlessPath: '(resource) platform.external_accounts > (method) create', qualified: 'client.platform.externalAccounts.create', params: [ - "accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; };", + "accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; };", 'currency: string;', 'platformAccountId?: string;', ], response: - "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## create\n\n`client.platform.externalAccounts.create(accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: aed_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: brl_beneficiary | business_beneficiary; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: bwp_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: cad_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: dkk_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: eur_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: gbp_beneficiary | business_beneficiary; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: hkd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: idr_beneficiary | business_beneficiary; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: inr_beneficiary | business_beneficiary; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: kes_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: mwk_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: mxn_beneficiary | business_beneficiary; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: myr_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: ngn_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: php_beneficiary | business_beneficiary; } | { accountType: 'RWF_ACCOUNT'; beneficiary: rwf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: sgd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: thb_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: tzs_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: ugx_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: usd_beneficiary | business_beneficiary; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: vnd_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: xaf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: xof_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: zar_beneficiary | business_beneficiary; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: zmw_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: bdt_beneficiary | business_beneficiary; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: cop_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: egp_beneficiary | business_beneficiary; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: ghs_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: gtq_beneficiary | business_beneficiary; } | { accountType: 'HTG_ACCOUNT'; beneficiary: htg_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: jmd_beneficiary | business_beneficiary; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: pkr_beneficiary | business_beneficiary; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }, currency: string, platformAccountId?: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**post** `/platform/external-accounts`\n\nRegister a new external bank account for the platform.\n\n### Parameters\n\n- `accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }`\n Lightning payment destination. Exactly one of `invoice`, `bolt12`, or `lightningAddress` must be provided.\n\n\n- `currency: string`\n The ISO 4217 currency code\n\n- `platformAccountId?: string`\n Your platform's identifier for the account in your system. This can be used to reference the account by your own identifier.\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `cryptoNetwork?: string`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.platform.externalAccounts.create({\n accountInfo: {\n accountNumber: '12345678901',\n accountType: 'USD_ACCOUNT',\n beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' },\n routingNumber: '123456789',\n},\n currency: 'USD',\n});\n\nconsole.log(externalAccount);\n```", + "## create\n\n`client.platform.externalAccounts.create(accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: aed_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: brl_beneficiary | business_beneficiary; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: bwp_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: cad_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: dkk_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: eur_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: gbp_beneficiary | business_beneficiary; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: hkd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: idr_beneficiary | business_beneficiary; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: inr_beneficiary | business_beneficiary; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: kes_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: mwk_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: mxn_beneficiary | business_beneficiary; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: myr_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: ngn_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: php_beneficiary | business_beneficiary; } | { accountType: 'RWF_ACCOUNT'; beneficiary: rwf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: sgd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: thb_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: tzs_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: ugx_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: usd_beneficiary | business_beneficiary; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: vnd_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: xaf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: xof_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: zar_beneficiary | business_beneficiary; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: zmw_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: bdt_beneficiary | business_beneficiary; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: cop_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: egp_beneficiary | business_beneficiary; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: ghs_beneficiary | business_beneficiary; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: gtq_beneficiary | business_beneficiary; } | { accountType: 'HTG_ACCOUNT'; beneficiary: htg_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: jmd_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: pkr_beneficiary | business_beneficiary; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }, currency: string, platformAccountId?: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**post** `/platform/external-accounts`\n\nRegister a new external bank account for the platform.\n\n### Parameters\n\n- `accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }`\n Lightning payment destination. Exactly one of `invoice`, `bolt12`, or `lightningAddress` must be provided.\n\n\n- `currency: string`\n The ISO 4217 currency code\n\n- `platformAccountId?: string`\n Your platform's identifier for the account in your system. This can be used to reference the account by your own identifier.\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.platform.externalAccounts.create({\n accountInfo: {\n accountNumber: '12345678901',\n accountType: 'USD_ACCOUNT',\n beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' },\n routingNumber: '123456789',\n},\n currency: 'USD',\n});\n\nconsole.log(externalAccount);\n```", perLanguage: { typescript: { method: 'client.platform.externalAccounts.create', @@ -732,9 +771,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.platform.externalAccounts.retrieve', params: ['externalAccountId: string;'], response: - "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", markdown: - "## retrieve\n\n`client.platform.externalAccounts.retrieve(externalAccountId: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/platform/external-accounts/{externalAccountId}`\n\nRetrieve a platform external account by its system-generated ID\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; cryptoNetwork?: string; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `cryptoNetwork?: string`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.platform.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount);\n```", + "## retrieve\n\n`client.platform.externalAccounts.retrieve(externalAccountId: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/platform/external-accounts/{externalAccountId}`\n\nRetrieve a platform external account by its system-generated ID\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.platform.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount);\n```", perLanguage: { typescript: { method: 'client.platform.externalAccounts.retrieve', @@ -806,9 +845,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ 'Idempotency-Key?: string;', ], response: - "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", markdown: - "## create\n\n`client.transferIn.create(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): object | object`\n\n**post** `/transfer-in`\n\nTransfer funds from an external account to an internal account for a specific customer. This endpoint should only be used for external account sources with pull functionality (e.g. ACH Pull). Otherwise, use the paymentInstructions on the internal account to deposit funds.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `source: { accountId: string; }`\n Source external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transferIn.create({\n destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n});\n\nconsole.log(transaction);\n```", + "## create\n\n`client.transferIn.create(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): object | object`\n\n**post** `/transfer-in`\n\nTransfer funds from an external account to an internal account for a specific customer. This endpoint should only be used for external account sources with pull functionality (e.g. ACH Pull). Otherwise, use the paymentInstructions on the internal account to deposit funds.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `source: { accountId: string; }`\n Source external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transferIn.create({\n destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n});\n\nconsole.log(transaction);\n```", perLanguage: { typescript: { method: 'client.transferIn.create', @@ -846,9 +885,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ 'Idempotency-Key?: string;', ], response: - "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", markdown: - "## create\n\n`client.transferOut.create(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): object | object`\n\n**post** `/transfer-out`\n\nTransfer funds from an internal account to an external account for a specific customer.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `source: { accountId: string; }`\n Source internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transferOut.create({\n destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n});\n\nconsole.log(transaction);\n```", + "## create\n\n`client.transferOut.create(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): object | object`\n\n**post** `/transfer-out`\n\nTransfer funds from an internal account to an external account for a specific customer.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `source: { accountId: string; }`\n Source internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transferOut.create({\n destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n});\n\nconsole.log(transaction);\n```", perLanguage: { typescript: { method: 'client.transferOut.create', @@ -956,7 +995,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; createdAt: string; destination: object | object; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: object; sendingCurrency: object; source: object | object; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: object[]; rateDetails?: object; }", markdown: - "## retrieve\n\n`client.quotes.retrieve(quoteId: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**get** `/quotes/{quoteId}`\n\nRetrieve a quote by its ID. If the quote has been settled, it will include\nthe transaction ID. This allows clients to track the full lifecycle of a payment\nfrom quote creation to settlement.\n\n\n### Parameters\n\n- `quoteId: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.retrieve('quoteId');\n\nconsole.log(quote);\n```", + "## retrieve\n\n`client.quotes.retrieve(quoteId: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**get** `/quotes/{quoteId}`\n\nRetrieve a quote by its ID. If the quote has been settled, it will include\nthe transaction ID. This allows clients to track the full lifecycle of a payment\nfrom quote creation to settlement.\n\n\n### Parameters\n\n- `quoteId: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.retrieve('quoteId');\n\nconsole.log(quote);\n```", perLanguage: { typescript: { method: 'client.quotes.retrieve', @@ -1003,7 +1042,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; createdAt: string; destination: object | object; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: object; sendingCurrency: object; source: object | object; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: object[]; rateDetails?: object; }", markdown: - "## create\n\n`client.quotes.create(destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }, lockedCurrencyAmount: number, lockedCurrencySide: 'SENDING' | 'RECEIVING', source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }, description?: string, immediatelyExecute?: boolean, lookupId?: string, purposeOfPayment?: string, senderCustomerInfo?: object, Idempotency-Key?: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**post** `/quotes`\n\nGenerate a quote for a cross-currency transfer between any combination of accounts\nand UMA addresses. This endpoint handles currency exchange and provides the necessary\ninstructions to execute the transfer.\n\n**Transfer Types Supported:**\n- **Account to Account**: Transfer between internal/external accounts with currency exchange.\n- **Account to UMA**: Transfer from an internal account to an UMA address.\n- **UMA to Account or UMA to UMA**: This transfer type will only be funded by payment instructions, not from an internal account.\n\n**Key Features:**\n- **Flexible Amount Locking**: Always specify whether you want to lock the sending amount or receiving amount\n- **Currency Exchange**: Handles all cross-currency transfers with real-time exchange rates\n- **Payment Instructions**: For UMA or customer ID sources, provides banking details needed for execution\n\n**Important:** If you are transferring funds in the same currency (no exchange required),\nuse the `/transfer-in` or `/transfer-out` endpoints instead.\n\n\n### Parameters\n\n- `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n Destination account details\n\n- `lockedCurrencyAmount: number`\n The amount to send/receive in the smallest unit of the locked currency (eg. cents). See `lockedCurrencySide` for more information.\n\n- `lockedCurrencySide: 'SENDING' | 'RECEIVING'`\n The side of the quote which should be locked and specified in the `lockedCurrencyAmount`. For example, if I want to send exactly $5 MXN from my wallet, I would set this to \"sending\", and the `lockedCurrencyAmount` to 500 (in cents). If I want the receiver to receive exactly $10 USD, I would set this to \"receiving\" and the `lockedCurrencyAmount` to 10000 (in cents).\n\n- `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n Source account details\n\n- `description?: string`\n Optional description/memo for the transfer\n\n- `immediatelyExecute?: boolean`\n Whether to immediately execute the quote after creation. If true, the quote will be executed and the transaction will be created at the current exchange rate. It should only be used if you don't want to lock and view rate details before executing the quote. If you are executing a pre-existing quote, use the `/quotes/{quoteId}/execute` endpoint instead. This is false by default.\nThis can only be used for quotes with a `source` which is either an internal account, or has direct pull functionality (e.g. ACH pull with an external account).\nNot supported when the `source` is an internal account of type `EMBEDDED_WALLET`: those transfers require a `Grid-Wallet-Signature` over the `payloadToSign` returned in the quote response, which is not available in a combined create-and-execute call. Create the quote first with `immediatelyExecute: false` and then call `POST /quotes/{quoteId}/execute` with the signature header.\n\n- `lookupId?: string`\n Lookup ID from a previous receiver lookup request. If provided, this can make the quote creation more efficient by reusing cached lookup data.\nNOTE: This is required for UMA destinations due to counterparty institution requirements. See `senderCustomerInfo` for more information.\n\n- `purposeOfPayment?: string`\n The purpose of the payment. This may be required when sending to certain geographies (e.g. India).\n\n- `senderCustomerInfo?: object`\n Key-value pairs of additional information about the sender which was requested by the destination. This is relevant when the destination requires more sender info than was provided during customer creation.\nAny fields specified in `requiredPayerDataFields` from the response of the `/receiver/uma/{receiverUmaAddress}` (lookupUma) or `/receiver/external-account/{accountId}` (lookupExternalAccount) endpoints MUST be provided here if they were requested. If the destination did not request any additional information, this field can be omitted.\n\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.create({\n destination: { accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', destinationType: 'ACCOUNT' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', sourceType: 'ACCOUNT' },\n});\n\nconsole.log(quote);\n```", + "## create\n\n`client.quotes.create(destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }, lockedCurrencyAmount: number, lockedCurrencySide: 'SENDING' | 'RECEIVING', source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }, description?: string, immediatelyExecute?: boolean, lookupId?: string, purposeOfPayment?: string, senderCustomerInfo?: object, Idempotency-Key?: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**post** `/quotes`\n\nGenerate a quote for a cross-currency transfer between any combination of accounts\nand UMA addresses. This endpoint handles currency exchange and provides the necessary\ninstructions to execute the transfer.\n\n**Transfer Types Supported:**\n- **Account to Account**: Transfer between internal/external accounts with currency exchange.\n- **Account to UMA**: Transfer from an internal account to an UMA address.\n- **UMA to Account or UMA to UMA**: This transfer type will only be funded by payment instructions, not from an internal account.\n\n**Key Features:**\n- **Flexible Amount Locking**: Always specify whether you want to lock the sending amount or receiving amount\n- **Currency Exchange**: Handles all cross-currency transfers with real-time exchange rates\n- **Payment Instructions**: For UMA or customer ID sources, provides banking details needed for execution\n\n**Important:** If you are transferring funds in the same currency (no exchange required),\nuse the `/transfer-in` or `/transfer-out` endpoints instead.\n\n\n### Parameters\n\n- `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n Destination account details\n\n- `lockedCurrencyAmount: number`\n The amount to send/receive in the smallest unit of the locked currency (eg. cents). See `lockedCurrencySide` for more information.\n\n- `lockedCurrencySide: 'SENDING' | 'RECEIVING'`\n The side of the quote which should be locked and specified in the `lockedCurrencyAmount`. For example, if I want to send exactly $5 MXN from my wallet, I would set this to \"sending\", and the `lockedCurrencyAmount` to 500 (in cents). If I want the receiver to receive exactly $10 USD, I would set this to \"receiving\" and the `lockedCurrencyAmount` to 10000 (in cents).\n\n- `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n Source account details\n\n- `description?: string`\n Optional description/memo for the transfer\n\n- `immediatelyExecute?: boolean`\n Whether to immediately execute the quote after creation. If true, the quote will be executed and the transaction will be created at the current exchange rate. It should only be used if you don't want to lock and view rate details before executing the quote. If you are executing a pre-existing quote, use the `/quotes/{quoteId}/execute` endpoint instead. This is false by default.\nThis can only be used for quotes with a `source` which is either an internal account, or has direct pull functionality (e.g. ACH pull with an external account).\nNot supported when the `source` is an internal account of type `EMBEDDED_WALLET`: those transfers require a `Grid-Wallet-Signature` over the `payloadToSign` returned in the quote response, which is not available in a combined create-and-execute call. Create the quote first with `immediatelyExecute: false` and then call `POST /quotes/{quoteId}/execute` with the signature header.\n\n- `lookupId?: string`\n Lookup ID from a previous receiver lookup request. If provided, this can make the quote creation more efficient by reusing cached lookup data.\nNOTE: This is required for UMA destinations due to counterparty institution requirements. See `senderCustomerInfo` for more information.\n\n- `purposeOfPayment?: string`\n The purpose of the payment. This may be required when sending to certain geographies (e.g. India).\n\n- `senderCustomerInfo?: object`\n Key-value pairs of additional information about the sender which was requested by the destination. This is relevant when the destination requires more sender info than was provided during customer creation.\nAny fields specified in `requiredPayerDataFields` from the response of the `/receiver/uma/{receiverUmaAddress}` (lookupUma) or `/receiver/external-account/{accountId}` (lookupExternalAccount) endpoints MUST be provided here if they were requested. If the destination did not request any additional information, this field can be omitted.\n\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.create({\n destination: { accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', destinationType: 'ACCOUNT' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', sourceType: 'ACCOUNT' },\n});\n\nconsole.log(quote);\n```", perLanguage: { typescript: { method: 'client.quotes.create', @@ -1039,7 +1078,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; createdAt: string; destination: object | object; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: object; sendingCurrency: object; source: object | object; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: object[]; rateDetails?: object; }", markdown: - "## execute\n\n`client.quotes.execute(quoteId: string, Grid-Wallet-Signature?: string, Idempotency-Key?: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**post** `/quotes/{quoteId}/execute`\n\nExecute a quote by its ID. This endpoint initiates the transfer between\nthe source and destination accounts.\n\nThis endpoint can only be used for quotes with a `source` which is either an internal account,\nor has direct pull functionality (e.g. ACH pull with an external account).\n\nWhen the quote's `source` is an internal account of type `EMBEDDED_WALLET`,\nthe request must include a `Grid-Wallet-Signature` header. The signature is\nproduced by signing the `payloadToSign` value from the quote's\n`paymentInstructions[].accountOrWalletInfo` entry with the session private\nkey of a verified authentication credential on the source Embedded Wallet.\n\nOnce executed, the quote cannot be cancelled and the transfer will be processed.\n\n\n### Parameters\n\n- `quoteId: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.execute('Quote:019542f5-b3e7-1d02-0000-000000000001');\n\nconsole.log(quote);\n```", + "## execute\n\n`client.quotes.execute(quoteId: string, Grid-Wallet-Signature?: string, Idempotency-Key?: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**post** `/quotes/{quoteId}/execute`\n\nExecute a quote by its ID. This endpoint initiates the transfer between\nthe source and destination accounts.\n\nThis endpoint can only be used for quotes with a `source` which is either an internal account,\nor has direct pull functionality (e.g. ACH pull with an external account).\n\nWhen the quote's `source` is an internal account of type `EMBEDDED_WALLET`,\nthe request must include a `Grid-Wallet-Signature` header. The signature is\nproduced by signing the `payloadToSign` value from the quote's\n`paymentInstructions[].accountOrWalletInfo` entry with the session private\nkey of a verified authentication credential on the source Embedded Wallet.\n\nOnce executed, the quote cannot be cancelled and the transfer will be processed.\n\n\n### Parameters\n\n- `quoteId: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.quotes.execute('Quote:019542f5-b3e7-1d02-0000-000000000001');\n\nconsole.log(quote);\n```", perLanguage: { typescript: { method: 'client.quotes.execute', @@ -1087,9 +1126,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ "type?: 'INCOMING' | 'OUTGOING';", ], response: - "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", markdown: - "## list\n\n`client.transactions.list(accountIdentifier?: string, cursor?: string, customerId?: string, endDate?: string, limit?: number, platformCustomerId?: string, receiverAccountIdentifier?: string, reference?: string, senderAccountIdentifier?: string, sortOrder?: 'asc' | 'desc', startDate?: string, status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED', type?: 'INCOMING' | 'OUTGOING'): object | object`\n\n**get** `/transactions`\n\nRetrieve a paginated list of transactions with optional filtering.\nThe transactions can be filtered by customer ID, platform customer ID, UMA address,\ndate range, status, and transaction type.\n\n\n### Parameters\n\n- `accountIdentifier?: string`\n Filter by account identifier (matches either sender or receiver)\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by system customer ID. To filter to transactions made on behalf of the platform, specify the platform ID as the customer ID.\n\n- `endDate?: string`\n Filter by end date (inclusive) in ISO 8601 format\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `platformCustomerId?: string`\n Filter by platform-specific customer ID\n\n- `receiverAccountIdentifier?: string`\n Filter by receiver account identifier\n\n- `reference?: string`\n Filter by reference\n\n- `senderAccountIdentifier?: string`\n Filter by sender account identifier\n\n- `sortOrder?: 'asc' | 'desc'`\n Order to sort results in\n\n- `startDate?: string`\n Filter by start date (inclusive) in ISO 8601 format\n\n- `status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n Filter by transaction status\n\n- `type?: 'INCOMING' | 'OUTGOING'`\n Filter by transaction type\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const transaction of client.transactions.list()) {\n console.log(transaction);\n}\n```", + "## list\n\n`client.transactions.list(accountIdentifier?: string, cursor?: string, customerId?: string, endDate?: string, limit?: number, platformCustomerId?: string, receiverAccountIdentifier?: string, reference?: string, senderAccountIdentifier?: string, sortOrder?: 'asc' | 'desc', startDate?: string, status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED', type?: 'INCOMING' | 'OUTGOING'): object | object`\n\n**get** `/transactions`\n\nRetrieve a paginated list of transactions with optional filtering.\nThe transactions can be filtered by customer ID, platform customer ID, UMA address,\ndate range, status, and transaction type.\n\n\n### Parameters\n\n- `accountIdentifier?: string`\n Filter by account identifier (matches either sender or receiver)\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by system customer ID. To filter to transactions made on behalf of the platform, specify the platform ID as the customer ID.\n\n- `endDate?: string`\n Filter by end date (inclusive) in ISO 8601 format\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `platformCustomerId?: string`\n Filter by platform-specific customer ID\n\n- `receiverAccountIdentifier?: string`\n Filter by receiver account identifier\n\n- `reference?: string`\n Filter by reference\n\n- `senderAccountIdentifier?: string`\n Filter by sender account identifier\n\n- `sortOrder?: 'asc' | 'desc'`\n Order to sort results in\n\n- `startDate?: string`\n Filter by start date (inclusive) in ISO 8601 format\n\n- `status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n Filter by transaction status\n\n- `type?: 'INCOMING' | 'OUTGOING'`\n Filter by transaction type\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const transaction of client.transactions.list()) {\n console.log(transaction);\n}\n```", perLanguage: { typescript: { method: 'client.transactions.list', @@ -1122,9 +1161,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.transactions.retrieve', params: ['transactionId: string;'], response: - "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", markdown: - "## retrieve\n\n`client.transactions.retrieve(transactionId: string): object | object`\n\n**get** `/transactions/{transactionId}`\n\nRetrieve detailed information about a specific transaction.\n\n### Parameters\n\n- `transactionId: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transactions.retrieve('transactionId');\n\nconsole.log(transaction);\n```", + "## retrieve\n\n`client.transactions.retrieve(transactionId: string): object | object`\n\n**get** `/transactions/{transactionId}`\n\nRetrieve detailed information about a specific transaction.\n\n### Parameters\n\n- `transactionId: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.transactions.retrieve('transactionId');\n\nconsole.log(transaction);\n```", perLanguage: { typescript: { method: 'client.transactions.retrieve', @@ -1158,9 +1197,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.transactions.approve', params: ['transactionId: string;', 'receiverCustomerInfo?: object;'], response: - "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", + "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", markdown: - "## approve\n\n`client.transactions.approve(transactionId: string, receiverCustomerInfo?: object): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/transactions/{transactionId}/approve`\n\nApprove a pending incoming payment that was previously acknowledged with a 202 response.\nThis endpoint allows platforms to asynchronously approve payments after async processing.\n\n\n### Parameters\n\n- `transactionId: string`\n\n- `receiverCustomerInfo?: object`\n Information about the recipient, provided by the platform if requested in the original webhook via `requestedReceiverCustomerInfoFields`.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.transactions.approve('transactionId');\n\nconsole.log(incomingTransaction);\n```", + "## approve\n\n`client.transactions.approve(transactionId: string, receiverCustomerInfo?: object): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/transactions/{transactionId}/approve`\n\nApprove a pending incoming payment that was previously acknowledged with a 202 response.\nThis endpoint allows platforms to asynchronously approve payments after async processing.\n\n\n### Parameters\n\n- `transactionId: string`\n\n- `receiverCustomerInfo?: object`\n Information about the recipient, provided by the platform if requested in the original webhook via `requestedReceiverCustomerInfoFields`.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `agentId?: string`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.transactions.approve('transactionId');\n\nconsole.log(incomingTransaction);\n```", perLanguage: { typescript: { method: 'client.transactions.approve', @@ -1194,9 +1233,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.transactions.reject', params: ['transactionId: string;', 'reason?: string;'], response: - "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", + "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", markdown: - "## reject\n\n`client.transactions.reject(transactionId: string, reason?: string): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/transactions/{transactionId}/reject`\n\nReject a pending incoming payment that was previously acknowledged with a 202 response.\nThis endpoint allows platforms to asynchronously reject payments after additional processing.\n\n\n### Parameters\n\n- `transactionId: string`\n\n- `reason?: string`\n Optional reason for rejecting the payment. This is just for debugging purposes or can be used for a platform's own purposes.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.transactions.reject('transactionId');\n\nconsole.log(incomingTransaction);\n```", + "## reject\n\n`client.transactions.reject(transactionId: string, reason?: string): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/transactions/{transactionId}/reject`\n\nReject a pending incoming payment that was previously acknowledged with a 202 response.\nThis endpoint allows platforms to asynchronously reject payments after additional processing.\n\n\n### Parameters\n\n- `transactionId: string`\n\n- `reason?: string`\n Optional reason for rejecting the payment. This is just for debugging purposes or can be used for a platform's own purposes.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `agentId?: string`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.transactions.reject('transactionId');\n\nconsole.log(incomingTransaction);\n```", perLanguage: { typescript: { method: 'client.transactions.reject', @@ -1372,9 +1411,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.sandbox.sendFunds', params: ['currencyCode: string;', 'quoteId: string;', 'currencyAmount?: number;'], response: - "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }", + "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }", markdown: - "## send_funds\n\n`client.sandbox.sendFunds(currencyCode: string, quoteId: string, currencyAmount?: number): { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }`\n\n**post** `/sandbox/send`\n\nSimulate sending funds to the bank account as instructed in the quote.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `currencyCode: string`\n Currency code for the funds to be sent\n\n- `quoteId: string`\n The unique identifier of the quote\n\n- `currencyAmount?: number`\n The amount to send in the smallest unit of the currency (eg. cents). If not provided, the amount will be derived from the quote.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: { amount: number; currency: currency; }; source: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; quoteId?: string; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; receivedAmount?: { amount: number; currency: currency; }; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `sentAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'`\n - `type: 'OUTGOING' | 'INCOMING'`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `exchangeRate?: number`\n - `failureReason?: string`\n - `fees?: number`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `quoteId?: string`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `receivedAmount?: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }`\n - `settledAt?: string`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst outgoingTransaction = await client.sandbox.sendFunds({ currencyCode: 'USD', quoteId: 'Quote:019542f5-b3e7-1d02-0000-000000000006' });\n\nconsole.log(outgoingTransaction);\n```", + "## send_funds\n\n`client.sandbox.sendFunds(currencyCode: string, quoteId: string, currencyAmount?: number): { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }`\n\n**post** `/sandbox/send`\n\nSimulate sending funds to the bank account as instructed in the quote.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `currencyCode: string`\n Currency code for the funds to be sent\n\n- `quoteId: string`\n The unique identifier of the quote\n\n- `currencyAmount?: number`\n The amount to send in the smallest unit of the currency (eg. cents). If not provided, the amount will be derived from the quote.\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: { amount: number; currency: currency; }; source: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; quoteId?: string; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; receivedAmount?: { amount: number; currency: currency; }; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `sentAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'`\n - `type: 'OUTGOING' | 'INCOMING'`\n - `agentId?: string`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `exchangeRate?: number`\n - `failureReason?: string`\n - `fees?: number`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `quoteId?: string`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `receivedAmount?: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }`\n - `settledAt?: string`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst outgoingTransaction = await client.sandbox.sendFunds({ currencyCode: 'USD', quoteId: 'Quote:019542f5-b3e7-1d02-0000-000000000006' });\n\nconsole.log(outgoingTransaction);\n```", perLanguage: { typescript: { method: 'client.sandbox.sendFunds', @@ -1414,9 +1453,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [ 'receiverUmaAddress?: string;', ], response: - "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", + "{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }", markdown: - "## receive_payment\n\n`client.sandbox.uma.receivePayment(receivingCurrencyAmount: number, receivingCurrencyCode: string, senderUmaAddress: string, customerId?: string, receiverUmaAddress?: string): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/sandbox/uma/receive`\n\nSimulate sending payment from an sandbox uma address to a platform customer to test payment receive.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `receivingCurrencyAmount: number`\n The amount to be received in the smallest unit of the currency (eg. cents)\n\n- `receivingCurrencyCode: string`\n The currency code for the receiving amount\n\n- `senderUmaAddress: string`\n UMA address of the sender from the sandbox\n\n- `customerId?: string`\n System ID of the receiver (optional if receiverUmaAddress is provided)\n\n- `receiverUmaAddress?: string`\n UMA address of the receiver (optional if customerId is provided)\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.sandbox.uma.receivePayment({\n receivingCurrencyAmount: 1000,\n receivingCurrencyCode: 'USD',\n senderUmaAddress: '$success.usd@sandbox.grid.uma.money',\n});\n\nconsole.log(incomingTransaction);\n```", + "## receive_payment\n\n`client.sandbox.uma.receivePayment(receivingCurrencyAmount: number, receivingCurrencyCode: string, senderUmaAddress: string, customerId?: string, receiverUmaAddress?: string): { id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; }`\n\n**post** `/sandbox/uma/receive`\n\nSimulate sending payment from an sandbox uma address to a platform customer to test payment receive.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `receivingCurrencyAmount: number`\n The amount to be received in the smallest unit of the currency (eg. cents)\n\n- `receivingCurrencyCode: string`\n The currency code for the receiving amount\n\n- `senderUmaAddress: string`\n UMA address of the sender from the sandbox\n\n- `customerId?: string`\n System ID of the receiver (optional if receiverUmaAddress is provided)\n\n- `receiverUmaAddress?: string`\n UMA address of the receiver (optional if customerId is provided)\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: { amount: number; currency: currency; }; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; reconciliationInstructions?: { reference: string; }; settledAt?: string; source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }; updatedAt?: string; }`\n\n - `id: string`\n - `customerId: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }`\n - `platformCustomerId: string`\n - `receivedAmount: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n - `type: 'INCOMING' | 'OUTGOING'`\n - `agentId?: string`\n - `counterpartyInformation?: object`\n - `createdAt?: string`\n - `description?: string`\n - `failureReason?: string`\n - `rateDetails?: { gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n - `reconciliationInstructions?: { reference: string; }`\n - `settledAt?: string`\n - `source?: { accountId: string; sourceType: 'ACCOUNT'; } | { sourceType: 'UMA_ADDRESS'; umaAddress: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; customerId?: string; }`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst incomingTransaction = await client.sandbox.uma.receivePayment({\n receivingCurrencyAmount: 1000,\n receivingCurrencyCode: 'USD',\n senderUmaAddress: '$success.usd@sandbox.grid.uma.money',\n});\n\nconsole.log(incomingTransaction);\n```", perLanguage: { typescript: { method: 'client.sandbox.uma.receivePayment', @@ -1452,7 +1491,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }", markdown: - "## fund\n\n`client.sandbox.internalAccounts.fund(accountId: string, amount: number): { id: string; balance: currency_amount; createdAt: string; fundingPaymentInstructions: payment_instructions[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n**post** `/sandbox/internal-accounts/{accountId}/fund`\n\nSimulate receiving funds into an internal account in the sandbox environment. This is useful for testing scenarios where you need to add funds to a customer's or platform's internal account without going through a real bank transfer or following payment instructions.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `accountId: string`\n\n- `amount: number`\n Amount to add in the smallest unit of the account's currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n### Returns\n\n- `{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n - `id: string`\n - `balance: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `createdAt: string`\n - `fundingPaymentInstructions: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountNumber: string; accountType: 'BDT_ACCOUNT'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GHS_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PKR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; phoneNumber: string; iban?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n - `updatedAt: string`\n - `customerId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst internalAccount = await client.sandbox.internalAccounts.fund('InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', { amount: 100000 });\n\nconsole.log(internalAccount);\n```", + "## fund\n\n`client.sandbox.internalAccounts.fund(accountId: string, amount: number): { id: string; balance: currency_amount; createdAt: string; fundingPaymentInstructions: payment_instructions[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n**post** `/sandbox/internal-accounts/{accountId}/fund`\n\nSimulate receiving funds into an internal account in the sandbox environment. This is useful for testing scenarios where you need to add funds to a customer's or platform's internal account without going through a real bank transfer or following payment instructions.\nThis endpoint is only for the sandbox environment and will fail for production platforms/keys.\n\n\n### Parameters\n\n- `accountId: string`\n\n- `amount: number`\n Amount to add in the smallest unit of the account's currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n### Returns\n\n- `{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n - `id: string`\n - `balance: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `createdAt: string`\n - `fundingPaymentInstructions: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n - `updatedAt: string`\n - `customerId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst internalAccount = await client.sandbox.internalAccounts.fund('InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', { amount: 100000 });\n\nconsole.log(internalAccount);\n```", perLanguage: { typescript: { method: 'client.sandbox.internalAccounts.fund', @@ -1778,26 +1817,26 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: '{ applicationFee: number; netAmount: number; networkFee: number; networkFeeAsset: string; totalFee: number; }', markdown: - "## estimate_withdrawal_fee\n\n`client.crypto.estimateWithdrawalFee(amount: number, cryptoNetwork: string, currency: string, destinationAddress: string, internalAccountId: string): { applicationFee: number; netAmount: number; networkFee: number; networkFeeAsset: string; totalFee: number; }`\n\n**post** `/crypto/estimate-withdrawal-fee`\n\nEstimate the network and application fees for a cryptocurrency withdrawal from a crypto internal account to an external blockchain address. Use this to show fee information to customers before they initiate a withdrawal.\n\n\n### Parameters\n\n- `amount: number`\n The amount to withdraw in the smallest unit of the currency.\n\n- `cryptoNetwork: string`\n The blockchain network for the withdrawal. Example values: SOLANA_MAINNET, SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, BASE_TESTNET, SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, LIGHTNING_REGTEST.\n\n- `currency: string`\n The currency code of the asset to withdraw (e.g. USDC).\n\n- `destinationAddress: string`\n The blockchain address to withdraw funds to.\n\n- `internalAccountId: string`\n The ID of the crypto internal account to withdraw from.\n\n### Returns\n\n- `{ applicationFee: number; netAmount: number; networkFee: number; networkFeeAsset: string; totalFee: number; }`\n\n - `applicationFee: number`\n - `netAmount: number`\n - `networkFee: number`\n - `networkFeeAsset: string`\n - `totalFee: number`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.crypto.estimateWithdrawalFee({\n amount: 1000000,\n cryptoNetwork: 'SOLANA_MAINNET',\n currency: 'USDC',\n destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',\n internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n});\n\nconsole.log(response);\n```", + "## estimate_withdrawal_fee\n\n`client.crypto.estimateWithdrawalFee(amount: number, cryptoNetwork: string, currency: string, destinationAddress: string, internalAccountId: string): { applicationFee: number; netAmount: number; networkFee: number; networkFeeAsset: string; totalFee: number; }`\n\n**post** `/crypto/estimate-withdrawal-fee`\n\nEstimate the network and application fees for a cryptocurrency withdrawal from a crypto internal account to an external blockchain address. Use this to show fee information to customers before they initiate a withdrawal.\n\n\n### Parameters\n\n- `amount: number`\n The amount to withdraw in the smallest unit of the currency.\n\n- `cryptoNetwork: string`\n The blockchain network for the withdrawal. Example values: SOLANA, ETHEREUM, BASE, POLYGON, SPARK, LIGHTNING, BITCOIN.\n\n- `currency: string`\n The currency code of the asset to withdraw (e.g. USDC).\n\n- `destinationAddress: string`\n The blockchain address to withdraw funds to.\n\n- `internalAccountId: string`\n The ID of the crypto internal account to withdraw from.\n\n### Returns\n\n- `{ applicationFee: number; netAmount: number; networkFee: number; networkFeeAsset: string; totalFee: number; }`\n\n - `applicationFee: number`\n - `netAmount: number`\n - `networkFee: number`\n - `networkFeeAsset: string`\n - `totalFee: number`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.crypto.estimateWithdrawalFee({\n amount: 1000000,\n cryptoNetwork: 'SOLANA',\n currency: 'USDC',\n destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',\n internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n});\n\nconsole.log(response);\n```", perLanguage: { typescript: { method: 'client.crypto.estimateWithdrawalFee', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.crypto.estimateWithdrawalFee({\n amount: 1000000,\n cryptoNetwork: 'SOLANA_MAINNET',\n currency: 'USDC',\n destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',\n internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n});\n\nconsole.log(response.applicationFee);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.crypto.estimateWithdrawalFee({\n amount: 1000000,\n cryptoNetwork: 'SOLANA',\n currency: 'USDC',\n destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',\n internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n});\n\nconsole.log(response.applicationFee);", }, python: { method: 'crypto.estimate_withdrawal_fee', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.crypto.estimate_withdrawal_fee(\n amount=1000000,\n crypto_network="SOLANA_MAINNET",\n currency="USDC",\n destination_address="7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",\n internal_account_id="InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n)\nprint(response.application_fee)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.crypto.estimate_withdrawal_fee(\n amount=1000000,\n crypto_network="SOLANA",\n currency="USDC",\n destination_address="7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",\n internal_account_id="InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n)\nprint(response.application_fee)', }, kotlin: { method: 'crypto().estimateWithdrawalFee', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.crypto.CryptoEstimateWithdrawalFeeParams\nimport com.lightspark.grid.models.crypto.CryptoEstimateWithdrawalFeeResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CryptoEstimateWithdrawalFeeParams = CryptoEstimateWithdrawalFeeParams.builder()\n .amount(1000000L)\n .cryptoNetwork("SOLANA_MAINNET")\n .currency("USDC")\n .destinationAddress("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU")\n .internalAccountId("InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build()\n val response: CryptoEstimateWithdrawalFeeResponse = client.crypto().estimateWithdrawalFee(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.crypto.CryptoEstimateWithdrawalFeeParams\nimport com.lightspark.grid.models.crypto.CryptoEstimateWithdrawalFeeResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CryptoEstimateWithdrawalFeeParams = CryptoEstimateWithdrawalFeeParams.builder()\n .amount(1000000L)\n .cryptoNetwork("SOLANA")\n .currency("USDC")\n .destinationAddress("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU")\n .internalAccountId("InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build()\n val response: CryptoEstimateWithdrawalFeeResponse = client.crypto().estimateWithdrawalFee(params)\n}', }, http: { example: - 'curl https://api.lightspark.com/grid/2025-10-13/crypto/estimate-withdrawal-fee \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "amount": 1000000,\n "cryptoNetwork": "SOLANA_MAINNET",\n "currency": "USDC",\n "destinationAddress": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",\n "internalAccountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n }\'', + 'curl https://api.lightspark.com/grid/2025-10-13/crypto/estimate-withdrawal-fee \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "amount": 1000000,\n "cryptoNetwork": "SOLANA",\n "currency": "USDC",\n "destinationAddress": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",\n "internalAccountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n }\'', }, }, }, @@ -1972,7 +2011,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }", markdown: - "## upload\n\n`client.documents.upload(country: string, documentHolder: string, documentType: string, file: string, documentNumber?: string, side?: 'FRONT' | 'BACK'): { id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n**post** `/documents`\n\nUpload a verification document for a customer or beneficial owner. The request must use multipart/form-data with the file in the `file` field and metadata in the remaining fields.\n\nSupported file types: PDF, JPEG, PNG. Maximum file size: 10 MB.\n\n\n### Parameters\n\n- `country: string`\n Country that issued the document (ISO 3166-1 alpha-2)\n\n- `documentHolder: string`\n ID of the entity that owns this document. Can be a Customer ID or a BeneficialOwner ID.\n\n- `documentType: string`\n Type of identity or business verification document. Document types are grouped by verification category:\n**Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID\n**Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT\n**Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE\n**Business — Control structure** — ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT\n**Business — Ownership structure** — SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION\n**Proof of address** — PROOF_OF_ADDRESS\n\n- `file: string`\n The document file (PDF, JPEG, or PNG, max 10 MB)\n\n- `documentNumber?: string`\n Document identification number (e.g., passport number)\n\n- `side?: 'FRONT' | 'BACK'`\n Which side of the document (for two-sided documents like driver's licenses)\n\n### Returns\n\n- `{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n - `id: string`\n - `country: string`\n - `createdAt: string`\n - `documentHolder: string`\n - `documentType: string`\n - `fileName: string`\n - `documentNumber?: string`\n - `side?: 'FRONT' | 'BACK'`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.documents.upload({\n country: 'US',\n documentHolder: 'BeneficialOwner:019542f5-b3e7-1d02-0000-000000000001',\n documentType: 'PASSPORT',\n file: fs.createReadStream('path/to/file'),\n});\n\nconsole.log(response);\n```", + "## upload\n\n`client.documents.upload(country: string, documentHolder: string, documentType: string, file: string, documentNumber?: string, side?: 'FRONT' | 'BACK'): { id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n**post** `/documents`\n\nUpload a verification document for a customer or beneficial owner. The request must use multipart/form-data with the file in the `file` field and metadata in the remaining fields.\n\nSupported file types: PDF, JPEG, PNG. Maximum file size: 10 MB.\n\n\n### Parameters\n\n- `country: string`\n Country that issued the document (ISO 3166-1 alpha-2)\n\n- `documentHolder: string`\n ID of the entity that owns this document. Can be a Customer ID or a BeneficialOwner ID.\n\n- `documentType: string`\n Type of identity or business verification document. Document types are grouped by verification category:\n**Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID\n**Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT\n**Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT\n**Business — Ownership structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT\n**Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, BANK_STATEMENT, TAX_RETURN\n\n- `file: string`\n The document file (PDF, JPEG, or PNG, max 10 MB)\n\n- `documentNumber?: string`\n Document identification number (e.g., passport number)\n\n- `side?: 'FRONT' | 'BACK'`\n Which side of the document (for two-sided documents like driver's licenses)\n\n### Returns\n\n- `{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n - `id: string`\n - `country: string`\n - `createdAt: string`\n - `documentHolder: string`\n - `documentType: string`\n - `fileName: string`\n - `documentNumber?: string`\n - `side?: 'FRONT' | 'BACK'`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.documents.upload({\n country: 'US',\n documentHolder: 'BeneficialOwner:019542f5-b3e7-1d02-0000-000000000001',\n documentType: 'PASSPORT',\n file: fs.createReadStream('path/to/file'),\n});\n\nconsole.log(response);\n```", perLanguage: { typescript: { method: 'client.documents.upload', @@ -2085,7 +2124,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }", markdown: - "## replace\n\n`client.documents.replace(documentId: string, country: string, documentType: string, file: string, documentNumber?: string, side?: 'FRONT' | 'BACK'): { id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n**put** `/documents/{documentId}`\n\nReplace an existing document with a new file and/or updated metadata. This is useful when a document was rejected and needs to be re-uploaded. The request must use multipart/form-data.\n\n\n### Parameters\n\n- `documentId: string`\n\n- `country: string`\n Country that issued the document (ISO 3166-1 alpha-2)\n\n- `documentType: string`\n Type of identity or business verification document. Document types are grouped by verification category:\n**Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID\n**Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT\n**Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE\n**Business — Control structure** — ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT\n**Business — Ownership structure** — SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION\n**Proof of address** — PROOF_OF_ADDRESS\n\n- `file: string`\n The document file (PDF, JPEG, or PNG, max 10 MB)\n\n- `documentNumber?: string`\n Document identification number (e.g., passport number)\n\n- `side?: 'FRONT' | 'BACK'`\n Which side of the document (for two-sided documents like driver's licenses)\n\n### Returns\n\n- `{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n - `id: string`\n - `country: string`\n - `createdAt: string`\n - `documentHolder: string`\n - `documentType: string`\n - `fileName: string`\n - `documentNumber?: string`\n - `side?: 'FRONT' | 'BACK'`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.documents.replace('documentId', {\n country: 'US',\n documentType: 'PASSPORT',\n file: fs.createReadStream('path/to/file'),\n});\n\nconsole.log(response);\n```", + "## replace\n\n`client.documents.replace(documentId: string, country: string, documentType: string, file: string, documentNumber?: string, side?: 'FRONT' | 'BACK'): { id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n**put** `/documents/{documentId}`\n\nReplace an existing document with a new file and/or updated metadata. This is useful when a document was rejected and needs to be re-uploaded. The request must use multipart/form-data.\n\n\n### Parameters\n\n- `documentId: string`\n\n- `country: string`\n Country that issued the document (ISO 3166-1 alpha-2)\n\n- `documentType: string`\n Type of identity or business verification document. Document types are grouped by verification category:\n**Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID\n**Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT\n**Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT\n**Business — Ownership structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT\n**Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, BANK_STATEMENT, TAX_RETURN\n\n- `file: string`\n The document file (PDF, JPEG, or PNG, max 10 MB)\n\n- `documentNumber?: string`\n Document identification number (e.g., passport number)\n\n- `side?: 'FRONT' | 'BACK'`\n Which side of the document (for two-sided documents like driver's licenses)\n\n### Returns\n\n- `{ id: string; country: string; createdAt: string; documentHolder: string; documentType: string; fileName: string; documentNumber?: string; side?: 'FRONT' | 'BACK'; updatedAt?: string; }`\n\n - `id: string`\n - `country: string`\n - `createdAt: string`\n - `documentHolder: string`\n - `documentType: string`\n - `fileName: string`\n - `documentNumber?: string`\n - `side?: 'FRONT' | 'BACK'`\n - `updatedAt?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.documents.replace('documentId', {\n country: 'US',\n documentType: 'PASSPORT',\n file: fs.createReadStream('path/to/file'),\n});\n\nconsole.log(response);\n```", perLanguage: { typescript: { method: 'client.documents.replace', @@ -2293,29 +2332,29 @@ const EMBEDDED_METHODS: MethodEntry[] = [ stainlessPath: '(resource) auth.credentials > (method) create', qualified: 'client.auth.credentials.create', params: [ - "AuthCredentialCreateRequest: { accountId: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; } | { accountId: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { accountId: string; attestation: { attestationObject: string; clientDataJson: string; credentialId: string; transports?: 'usb' | 'nfc' | 'ble' | 'internal' | 'hybrid'[]; }; challenge: string; nickname: string; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; };", + "AuthCredentialCreateRequest: { accountId: string; } & { type: 'EMAIL_OTP'; } | { accountId: string; } & { oidcToken: string; type: 'OAUTH'; } | { accountId: string; } & { attestation: passkey_attestation; challenge: string; nickname: string; type: 'PASSKEY'; };", 'Grid-Wallet-Signature?: string;', 'Request-Id?: string;', ], response: "{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }", markdown: - "## create\n\n`client.auth.credentials.create(AuthCredentialCreateRequest: { accountId: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; } | { accountId: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { accountId: string; attestation: { attestationObject: string; clientDataJson: string; credentialId: string; transports?: 'usb' | 'nfc' | 'ble' | 'internal' | 'hybrid'[]; }; challenge: string; nickname: string; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; }, Grid-Wallet-Signature?: string, Request-Id?: string): { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n\n**post** `/auth/credentials`\n\nRegister an authentication credential for an Embedded Wallet customer.\n\n**First credential on an internal account**\n\nIf the target internal account does not yet have any authentication credential registered, call this endpoint with the credential details. The response is `201` with the created `AuthMethod`. For `EMAIL_OTP` credentials, this call also triggers a one-time password email to the address on the customer record tied to the internal account; the credential must be activated via `POST /auth/credentials/{id}/verify` before it can sign requests. For `OAUTH` credentials, the supplied `oidcToken` is validated inline against the issuer's `.well-known` OpenID configuration (the token's `iat` must be less than 60 seconds before the request); activation still happens via `POST /auth/credentials/{id}/verify`. For `PASSKEY` credentials, the client completes a WebAuthn registration (`navigator.credentials.create()`) using a `challenge` issued by the platform backend and submits the resulting `attestation` here. The registration response is a plain `AuthMethod` (no inline authentication challenge). To produce the first session, the client follows registration with two further calls: `POST /auth/credentials/{id}/challenge` (carrying the client's ephemeral `clientPublicKey`) returns a Grid-issued WebAuthn challenge plus `requestId`, and `POST /auth/credentials/{id}/verify` (with `Request-Id: `) consumes the resulting assertion and issues the session. The same two-step pattern is used on every subsequent reauthentication. Only one `PASSKEY` credential is supported per internal account in v1.\n\n**Adding an additional credential**\n\nRegistering an additional credential against an internal account that already has one requires a signature from an existing verified credential. Call this endpoint with the new credential's details; if an existing credential is already registered on the internal account the response is `202` with a `payloadToSign` and a `requestId`. Use the session API keypair of an existing verified credential on the same internal account (decrypted client-side from its `encryptedSessionSigningKey`) to build an API-key stamp over `payloadToSign`, then retry the same request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `201` with the created `AuthMethod`. For `EMAIL_OTP`, the OTP email is triggered on the signed retry, and the credential must then be activated via `POST /auth/credentials/{id}/verify`.\n\n\n### Parameters\n\n- `AuthCredentialCreateRequest: { accountId: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; } | { accountId: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { accountId: string; attestation: { attestationObject: string; clientDataJson: string; credentialId: string; transports?: 'usb' | 'nfc' | 'ble' | 'internal' | 'hybrid'[]; }; challenge: string; nickname: string; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; }`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n Strict wrapper around `AuthMethod`. Used directly as the registration response on `POST /auth/credentials` (all three credential types) and inside `AuthCredentialResponseOneOf` for the `EMAIL_OTP` and `OAUTH` branches of `POST /auth/credentials/{id}/challenge`. The only difference from `AuthMethod` is `unevaluatedProperties: false`, which disambiguates the oneOf against `PasskeyAuthChallenge` — without the strictness, an `AuthMethod` with extra fields would ambiguously match both branches.\n\n - `id: string`\n - `accountId: string`\n - `createdAt: string`\n - `nickname: string`\n - `type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'`\n - `updatedAt: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authMethod = await client.auth.credentials.create({ AuthCredentialCreateRequest: { accountId: 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002', type: 'EMAIL_OTP' } });\n\nconsole.log(authMethod);\n```", + "## create\n\n`client.auth.credentials.create(AuthCredentialCreateRequest: auth_credential_create_request & email_otp_credential_create_request_fields | auth_credential_create_request & oauth_credential_create_request_fields | auth_credential_create_request & passkey_credential_create_request_fields, Grid-Wallet-Signature?: string, Request-Id?: string): { id: string; accountId: string; createdAt: string; nickname: string; type: auth_method_type; updatedAt: string; }`\n\n**post** `/auth/credentials`\n\nRegister an authentication credential for an Embedded Wallet customer.\n\n**First credential on an internal account**\n\nIf the target internal account does not yet have any authentication credential registered, call this endpoint with the credential details. The response is `201` with the created `AuthMethod`. For `EMAIL_OTP` credentials, this call also triggers a one-time password email to the address on the customer record tied to the internal account; the credential must be activated via `POST /auth/credentials/{id}/verify` before it can sign requests. For `OAUTH` credentials, the supplied `oidcToken` is validated inline against the issuer's `.well-known` OpenID configuration (the token's `iat` must be less than 60 seconds before the request); activation still happens via `POST /auth/credentials/{id}/verify`. For `PASSKEY` credentials, the client completes a WebAuthn registration (`navigator.credentials.create()`) using a `challenge` issued by the platform backend and submits the resulting `attestation` here. The registration response is a plain `AuthMethod` (no inline authentication challenge). To produce the first session, the client follows registration with two further calls: `POST /auth/credentials/{id}/challenge` (carrying the client's ephemeral `clientPublicKey`) returns a Grid-issued WebAuthn challenge plus `requestId`, and `POST /auth/credentials/{id}/verify` (with `Request-Id: `) consumes the resulting assertion and issues the session. The same two-step pattern is used on every subsequent reauthentication. Only one `PASSKEY` credential is supported per internal account in v1.\n\n**Adding an additional credential**\n\nRegistering an additional credential against an internal account that already has one requires a signature from an existing verified credential. Call this endpoint with the new credential's details; if an existing credential is already registered on the internal account the response is `202` with a `payloadToSign` and a `requestId`. Use the session API keypair of an existing verified credential on the same internal account (decrypted client-side from its `encryptedSessionSigningKey`) to build an API-key stamp over `payloadToSign`, then retry the same request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `201` with the created `AuthMethod`. For `EMAIL_OTP`, the OTP email is triggered on the signed retry, and the credential must then be activated via `POST /auth/credentials/{id}/verify`.\n\n\n### Parameters\n\n- `AuthCredentialCreateRequest: { accountId: string; } & { type: 'EMAIL_OTP'; } | { accountId: string; } & { oidcToken: string; type: 'OAUTH'; } | { accountId: string; } & { attestation: passkey_attestation; challenge: string; nickname: string; type: 'PASSKEY'; }`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n Strict wrapper around `AuthMethod`. Used directly as the registration response on `POST /auth/credentials` (all three credential types) and inside `AuthCredentialResponseOneOf` for the `EMAIL_OTP` branch of `POST /auth/credentials/{id}/challenge`. The only difference from `AuthMethod` is `unevaluatedProperties: false`, which disambiguates the oneOf against `PasskeyAuthChallenge` — without the strictness, an `AuthMethod` with extra fields would ambiguously match both branches.\n\n - `id: string`\n - `accountId: string`\n - `createdAt: string`\n - `nickname: string`\n - `type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'`\n - `updatedAt: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authMethodResponse = await client.auth.credentials.create({ AuthCredentialCreateRequest: { accountId: 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002', type: 'EMAIL_OTP' } });\n\nconsole.log(authMethodResponse);\n```", perLanguage: { typescript: { method: 'client.auth.credentials.create', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authMethod = await client.auth.credentials.create({\n AuthCredentialCreateRequest: {\n accountId: 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002',\n type: 'EMAIL_OTP',\n },\n});\n\nconsole.log(authMethod.id);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authMethodResponse = await client.auth.credentials.create({\n AuthCredentialCreateRequest: {\n accountId: 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002',\n type: 'EMAIL_OTP',\n },\n});\n\nconsole.log(authMethodResponse.id);", }, python: { method: 'auth.credentials.create', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_method = client.auth.credentials.create(\n auth_credential_create_request={\n "account_id": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",\n "type": "EMAIL_OTP",\n },\n)\nprint(auth_method.id)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_method_response = client.auth.credentials.create(\n auth_credential_create_request={\n "account_id": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",\n "type": "EMAIL_OTP",\n },\n)\nprint(auth_method_response.id)', }, kotlin: { method: 'auth().credentials().create', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthMethod\nimport com.lightspark.grid.models.auth.credentials.CredentialCreateParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CredentialCreateParams.AuthCredentialCreateRequest.EmailOtpCredentialCreateRequest = CredentialCreateParams.AuthCredentialCreateRequest.EmailOtpCredentialCreateRequest.builder()\n .accountId("InternalAccount:019542f5-b3e7-1d02-0000-000000000002")\n .type(CredentialCreateParams.AuthCredentialCreateRequest.EmailOtpCredentialCreateRequest.Type.EMAIL_OTP)\n .build()\n val authMethod: AuthMethod = client.auth().credentials().create(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthMethodResponse\nimport com.lightspark.grid.models.auth.credentials.EmailOtpCredentialCreateRequest\nimport com.lightspark.grid.models.auth.credentials.EmailOtpCredentialCreateRequestFields\nimport com.lightspark.grid.models.auth.credentials.OAuthCredentialCreateRequest\nimport com.lightspark.grid.models.auth.credentials.PasskeyCredentialCreateRequest\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: EmailOtpCredentialCreateRequest = EmailOtpCredentialCreateRequest.builder()\n .accountId("InternalAccount:019542f5-b3e7-1d02-0000-000000000002")\n .type(EmailOtpCredentialCreateRequestFields.Type.EMAIL_OTP)\n .build()\n val authMethodResponse: AuthMethodResponse = client.auth().credentials().create(params)\n}', }, http: { example: @@ -2334,64 +2373,64 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.auth.credentials.verify', params: [ 'id: string;', - "AuthCredentialVerifyRequest: { otp: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; clientPublicKey?: string; } | { clientPublicKey: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { assertion: { authenticatorData: string; clientDataJson: string; credentialId: string; signature: string; userHandle?: string; }; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; };", + "AuthCredentialVerifyRequest: { clientPublicKey: string; otp: string; type: 'EMAIL_OTP'; } | { clientPublicKey: string; oidcToken: string; type: 'OAUTH'; } | { assertion: object; type: 'PASSKEY'; };", 'Request-Id?: string;', ], response: "{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }", markdown: - "## verify\n\n`client.auth.credentials.verify(id: string, AuthCredentialVerifyRequest: { otp: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; clientPublicKey?: string; } | { clientPublicKey: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { assertion: { authenticatorData: string; clientDataJson: string; credentialId: string; signature: string; userHandle?: string; }; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; }, Request-Id?: string): object`\n\n**post** `/auth/credentials/{id}/verify`\n\nComplete the verification step for a previously created authentication credential and issue a session signing key.\n\nFor `EMAIL_OTP` credentials, supply the one-time password that was emailed to the user along with a client-generated public key. For `OAUTH` credentials, supply a fresh OIDC token (`iat` must be less than 60 seconds before the request) along with the client-generated public key; this is also the reauthentication path after a prior session expired. For `PASSKEY` credentials, the client completes a WebAuthn assertion (`navigator.credentials.get()`) against the Grid-issued `challenge` returned from either `POST /auth/credentials` (first authentication) or `POST /auth/credentials/{id}/challenge` (reauthentication), and submits the resulting `assertion` along with the client-generated public key. The `requestId` that accompanied the challenge must be echoed in the `Request-Id` header so Grid can correlate the assertion with the pending challenge; Grid verifies the WebAuthn signature against the stored credential before issuing the session.\n\nOn success, the response contains an `encryptedSessionSigningKey` that is encrypted to the supplied `clientPublicKey`, along with an `expiresAt` timestamp marking when the session expires. The `clientPublicKey` is ephemeral and one-time-use per verification request.\n\n\n### Parameters\n\n- `id: string`\n\n- `AuthCredentialVerifyRequest: { otp: string; type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; clientPublicKey?: string; } | { clientPublicKey: string; oidcToken: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; } | { assertion: { authenticatorData: string; clientDataJson: string; credentialId: string; signature: string; userHandle?: string; }; type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; }`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n An authentication session on an Embedded Wallet internal account. Returned from `GET /auth/sessions` (list) and `POST /auth/credentials/{id}/verify` (on credential verification). Only the verify response includes `encryptedSessionSigningKey` — it is delivered exactly once at the moment the session is issued and is never returned by the list endpoint.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.auth.credentials.verify('id', { AuthCredentialVerifyRequest: { otp: '123456', type: 'EMAIL_OTP' } });\n\nconsole.log(response);\n```", + "## verify\n\n`client.auth.credentials.verify(id: string, AuthCredentialVerifyRequest: object | object | object, Request-Id?: string): object`\n\n**post** `/auth/credentials/{id}/verify`\n\nComplete the verification step for a previously created authentication credential and issue a session signing key.\n\nFor `EMAIL_OTP` credentials, supply the one-time password that was emailed to the user along with a client-generated public key. For `OAUTH` credentials, supply a fresh OIDC token (`iat` must be less than 60 seconds before the request) along with the client-generated public key; this is also the reauthentication path after a prior session expired. For `PASSKEY` credentials, the client completes a WebAuthn assertion (`navigator.credentials.get()`) against the Grid-issued `challenge` returned from either `POST /auth/credentials` (first authentication) or `POST /auth/credentials/{id}/challenge` (reauthentication), and submits the resulting `assertion` along with the client-generated public key. The `requestId` that accompanied the challenge must be echoed in the `Request-Id` header so Grid can correlate the assertion with the pending challenge; Grid verifies the WebAuthn signature against the stored credential before issuing the session.\n\nOn success, the response contains an `encryptedSessionSigningKey` that is encrypted to the supplied `clientPublicKey`, along with an `expiresAt` timestamp marking when the session expires. The `clientPublicKey` is ephemeral and one-time-use per verification request.\n\n\n### Parameters\n\n- `id: string`\n\n- `AuthCredentialVerifyRequest: { clientPublicKey: string; otp: string; type: 'EMAIL_OTP'; } | { clientPublicKey: string; oidcToken: string; type: 'OAUTH'; } | { assertion: object; type: 'PASSKEY'; }`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n An authentication session on an Embedded Wallet internal account. Returned from `GET /auth/sessions` (list) and `POST /auth/credentials/{id}/verify` (on credential verification). Only the verify response includes `encryptedSessionSigningKey` — it is delivered exactly once at the moment the session is issued and is never returned by the list endpoint.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authSession = await client.auth.credentials.verify('id', { AuthCredentialVerifyRequest: {\n clientPublicKey: '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n otp: '123456',\n type: 'EMAIL_OTP',\n} });\n\nconsole.log(authSession);\n```", perLanguage: { typescript: { method: 'client.auth.credentials.verify', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.auth.credentials.verify('id', {\n AuthCredentialVerifyRequest: { otp: '123456', type: 'EMAIL_OTP' },\n});\n\nconsole.log(response);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authSession = await client.auth.credentials.verify('id', {\n AuthCredentialVerifyRequest: {\n clientPublicKey:\n '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n otp: '123456',\n type: 'EMAIL_OTP',\n },\n});\n\nconsole.log(authSession);", }, python: { method: 'auth.credentials.verify', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.auth.credentials.verify(\n id="id",\n auth_credential_verify_request={\n "otp": "123456",\n "type": "EMAIL_OTP",\n },\n)\nprint(response)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_session = client.auth.credentials.verify(\n id="id",\n auth_credential_verify_request={\n "client_public_key": "04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n "otp": "123456",\n "type": "EMAIL_OTP",\n },\n)\nprint(auth_session)', }, kotlin: { method: 'auth().credentials().verify', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.CredentialVerifyParams\nimport com.lightspark.grid.models.auth.credentials.CredentialVerifyResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CredentialVerifyParams = CredentialVerifyParams.builder()\n .id("id")\n .authCredentialVerifyRequest(CredentialVerifyParams.AuthCredentialVerifyRequest.EmailOtpCredentialVerifyRequest.builder()\n .otp("123456")\n .type(CredentialVerifyParams.AuthCredentialVerifyRequest.EmailOtpCredentialVerifyRequest.Type.EMAIL_OTP)\n .build())\n .build()\n val response: CredentialVerifyResponse = client.auth().credentials().verify(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthSession\nimport com.lightspark.grid.models.auth.credentials.CredentialVerifyParams\nimport com.lightspark.grid.models.auth.credentials.EmailOtpCredentialVerifyRequestFields\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CredentialVerifyParams = CredentialVerifyParams.builder()\n .id("id")\n .authCredentialVerifyRequest(EmailOtpCredentialVerifyRequestFields.builder()\n .clientPublicKey("04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2")\n .otp("123456")\n .type(EmailOtpCredentialVerifyRequestFields.Type.EMAIL_OTP)\n .build())\n .build()\n val authSession: AuthSession = client.auth().credentials().verify(params)\n}', }, http: { example: - 'curl https://api.lightspark.com/grid/2025-10-13/auth/credentials/$ID/verify \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "otp": "123456",\n "type": "EMAIL_OTP",\n "clientPublicKey": "04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2"\n }\'', + 'curl https://api.lightspark.com/grid/2025-10-13/auth/credentials/$ID/verify \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "clientPublicKey": "04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n "otp": "123456",\n "type": "EMAIL_OTP"\n }\'', }, }, }, { - name: 'resend_challenge', + name: 'challenge', endpoint: '/auth/credentials/{id}/challenge', httpMethod: 'post', summary: 'Re-issue an authentication credential challenge', description: - "Re-issue the challenge for an existing authentication credential.\n\nFor `EMAIL_OTP` credentials, this triggers a new one-time password email to the address on file. The response is a plain `AuthMethod`; there is no challenge body to surface because the OTP is delivered out-of-band via email. After the user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete verification and issue a session.\n\nFor `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge for reauthentication. The request body must carry the client's ephemeral `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload the returned challenge is computed from — this seals the resulting session signing key to the client. The response is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The client passes the `challenge` into `navigator.credentials.get()` and submits the resulting assertion to `POST /auth/credentials/{id}/verify` with `Request-Id: ` to receive a session.\n", - stainlessPath: '(resource) auth.credentials > (method) resend_challenge', - qualified: 'client.auth.credentials.resendChallenge', + "Re-issue the challenge for an existing authentication credential.\n\nFor `EMAIL_OTP` credentials, this triggers a new one-time password email to the address on file. The response is a plain `AuthMethod`; there is no challenge body to surface because the OTP is delivered out-of-band via email. After the user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete verification and issue a session.\n\n`OAUTH` credentials do not have a challenge step. To authenticate or reauthenticate an OAuth credential, call `POST /auth/credentials/{id}/verify` with a fresh OIDC token and a `clientPublicKey`.\n\nFor `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge for reauthentication. The request body must carry the client's ephemeral `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload the returned challenge is computed from — this seals the resulting session signing key to the client. The response is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The client passes the `challenge` into `navigator.credentials.get()` and submits the resulting assertion to `POST /auth/credentials/{id}/verify` with `Request-Id: ` to receive a session.\n", + stainlessPath: '(resource) auth.credentials > (method) challenge', + qualified: 'client.auth.credentials.challenge', params: ['id: string;', 'clientPublicKey?: string;'], response: - "{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; } | { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }", + "{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; } | { id: string; accountId: string; createdAt: string; nickname: string; type: auth_method_type; updatedAt: string; }", markdown: - "## resend_challenge\n\n`client.auth.credentials.resendChallenge(id: string, clientPublicKey?: string): object | object`\n\n**post** `/auth/credentials/{id}/challenge`\n\nRe-issue the challenge for an existing authentication credential.\n\nFor `EMAIL_OTP` credentials, this triggers a new one-time password email to the address on file. The response is a plain `AuthMethod`; there is no challenge body to surface because the OTP is delivered out-of-band via email. After the user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete verification and issue a session.\n\nFor `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge for reauthentication. The request body must carry the client's ephemeral `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload the returned challenge is computed from — this seals the resulting session signing key to the client. The response is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The client passes the `challenge` into `navigator.credentials.get()` and submits the resulting assertion to `POST /auth/credentials/{id}/verify` with `Request-Id: ` to receive a session.\n\n\n### Parameters\n\n- `id: string`\n\n- `clientPublicKey?: string`\n Required for `PASSKEY` credentials. Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (`04` prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters total). The matching private key must remain on the client. Grid bakes this key into the Turnkey session-creation payload that the returned `challenge` is computed from, so the resulting session signing key is sealed to the client. Ignored for `EMAIL_OTP` and `OAUTH` credentials.\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; } | { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }`\n Discriminated response shape returned from `POST /auth/credentials/{id}/challenge`. For `EMAIL_OTP` and `OAUTH` credentials the body is a plain `AuthMethod` (wrapped as `AuthMethodResponse` to disambiguate the oneOf). For `PASSKEY` credentials the body is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the Grid-issued `challenge`, `requestId`, and `expiresAt` that drive the subsequent assertion. Registration responses from `POST /auth/credentials` use the simpler `AuthMethodResponse` shape directly for all three credential types.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.auth.credentials.resendChallenge('id');\n\nconsole.log(response);\n```", + "## challenge\n\n`client.auth.credentials.challenge(id: string, clientPublicKey?: string): object | auth_method`\n\n**post** `/auth/credentials/{id}/challenge`\n\nRe-issue the challenge for an existing authentication credential.\n\nFor `EMAIL_OTP` credentials, this triggers a new one-time password email to the address on file. The response is a plain `AuthMethod`; there is no challenge body to surface because the OTP is delivered out-of-band via email. After the user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete verification and issue a session.\n\n`OAUTH` credentials do not have a challenge step. To authenticate or reauthenticate an OAuth credential, call `POST /auth/credentials/{id}/verify` with a fresh OIDC token and a `clientPublicKey`.\n\nFor `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge for reauthentication. The request body must carry the client's ephemeral `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload the returned challenge is computed from — this seals the resulting session signing key to the client. The response is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The client passes the `challenge` into `navigator.credentials.get()` and submits the resulting assertion to `POST /auth/credentials/{id}/verify` with `Request-Id: ` to receive a session.\n\n\n### Parameters\n\n- `id: string`\n\n- `clientPublicKey?: string`\n Required for `PASSKEY` credentials. Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (`04` prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters total). The matching private key must remain on the client. Grid bakes this key into the Turnkey session-creation payload that the returned `challenge` is computed from, so the resulting session signing key is sealed to the client. Ignored for `EMAIL_OTP`.\n\n### Returns\n\n- `{ id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; } | { id: string; accountId: string; createdAt: string; nickname: string; type: auth_method_type; updatedAt: string; }`\n Discriminated response shape returned from `POST /auth/credentials/{id}/challenge`. For `EMAIL_OTP` credentials the body is a plain `AuthMethod` (wrapped as `AuthMethodResponse` to disambiguate the oneOf). For `PASSKEY` credentials the body is a `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the Grid-issued `challenge`, `requestId`, and `expiresAt` that drive the subsequent assertion. OAuth credentials do not use the challenge endpoint; call `POST /auth/credentials/{id}/verify` with a fresh OIDC token instead. Registration responses from `POST /auth/credentials` use the simpler `AuthMethodResponse` shape directly for all three credential types.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authCredentialResponseOneOf = await client.auth.credentials.challenge('id');\n\nconsole.log(authCredentialResponseOneOf);\n```", perLanguage: { typescript: { - method: 'client.auth.credentials.resendChallenge', + method: 'client.auth.credentials.challenge', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.auth.credentials.resendChallenge('id', {\n clientPublicKey:\n '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n});\n\nconsole.log(response);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authCredentialResponseOneOf = await client.auth.credentials.challenge('id', {\n clientPublicKey:\n '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n});\n\nconsole.log(authCredentialResponseOneOf);", }, python: { - method: 'auth.credentials.resend_challenge', + method: 'auth.credentials.challenge', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.auth.credentials.resend_challenge(\n id="id",\n client_public_key="04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n)\nprint(response)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_credential_response_one_of = client.auth.credentials.challenge(\n id="id",\n client_public_key="04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n)\nprint(auth_credential_response_one_of)', }, kotlin: { - method: 'auth().credentials().resendChallenge', + method: 'auth().credentials().challenge', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.CredentialResendChallengeParams\nimport com.lightspark.grid.models.auth.credentials.CredentialResendChallengeResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val response: CredentialResendChallengeResponse = client.auth().credentials().resendChallenge("id")\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthCredentialResponseOneOf\nimport com.lightspark.grid.models.auth.credentials.CredentialChallengeParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val authCredentialResponseOneOf: AuthCredentialResponseOneOf = client.auth().credentials().challenge("id")\n}', }, http: { example: @@ -2410,24 +2449,24 @@ const EMBEDDED_METHODS: MethodEntry[] = [ qualified: 'client.auth.credentials.list', params: ['accountId: string;'], response: - "{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]; }", + '{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: auth_method_type; updatedAt: string; }[]; }', markdown: - "## list\n\n`client.auth.credentials.list(accountId: string): { data: auth_method[]; }`\n\n**get** `/auth/credentials`\n\nRetrieve all authentication credentials registered on an Embedded Wallet internal account.\n\nThe response is not paginated: an internal account is expected to have a small, bounded number of credentials (typically 1–5), so all results are returned inline. Additional per-credential detail (such as active session expiry) is available on `GET /auth/sessions`.\n\n### Parameters\n\n- `accountId: string`\n Internal account id whose authentication credentials to list.\n\n### Returns\n\n- `{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]; }`\n\n - `data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst credentials = await client.auth.credentials.list({ accountId: 'accountId' });\n\nconsole.log(credentials);\n```", + "## list\n\n`client.auth.credentials.list(accountId: string): { data: auth_method[]; }`\n\n**get** `/auth/credentials`\n\nRetrieve all authentication credentials registered on an Embedded Wallet internal account.\n\nThe response is not paginated: an internal account is expected to have a small, bounded number of credentials (typically 1–5), so all results are returned inline. Additional per-credential detail (such as active session expiry) is available on `GET /auth/sessions`.\n\n### Parameters\n\n- `accountId: string`\n Internal account id whose authentication credentials to list.\n\n### Returns\n\n- `{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: auth_method_type; updatedAt: string; }[]; }`\n\n - `data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authCredentialListResponse = await client.auth.credentials.list({ accountId: 'accountId' });\n\nconsole.log(authCredentialListResponse);\n```", perLanguage: { typescript: { method: 'client.auth.credentials.list', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst credentials = await client.auth.credentials.list({ accountId: 'accountId' });\n\nconsole.log(credentials.data);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authCredentialListResponse = await client.auth.credentials.list({ accountId: 'accountId' });\n\nconsole.log(authCredentialListResponse.data);", }, python: { method: 'auth.credentials.list', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\ncredentials = client.auth.credentials.list(\n account_id="accountId",\n)\nprint(credentials.data)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_credential_list_response = client.auth.credentials.list(\n account_id="accountId",\n)\nprint(auth_credential_list_response.data)', }, kotlin: { method: 'auth().credentials().list', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.CredentialListParams\nimport com.lightspark.grid.models.auth.credentials.CredentialListResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CredentialListParams = CredentialListParams.builder()\n .accountId("accountId")\n .build()\n val credentials: CredentialListResponse = client.auth().credentials().list(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthCredentialListResponse\nimport com.lightspark.grid.models.auth.credentials.CredentialListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: CredentialListParams = CredentialListParams.builder()\n .accountId("accountId")\n .build()\n val authCredentialListResponse: AuthCredentialListResponse = client.auth().credentials().list(params)\n}', }, http: { example: @@ -2436,34 +2475,33 @@ const EMBEDDED_METHODS: MethodEntry[] = [ }, }, { - name: 'revoke', + name: 'delete', endpoint: '/auth/credentials/{id}', httpMethod: 'delete', summary: 'Revoke an authentication credential', description: 'Revoke an authentication credential on an Embedded Wallet internal account.\n\nRevocation is a two-step flow because it must be authorized by a session on a *different* credential on the same internal account:\n\n1. Call `DELETE /auth/credentials/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of an existing verified credential on the same internal account — other than the one being revoked — to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n\nThe account must retain at least one authentication credential; an account with only a single credential cannot use this endpoint to revoke it.\n', - stainlessPath: '(resource) auth.credentials > (method) revoke', - qualified: 'client.auth.credentials.revoke', + stainlessPath: '(resource) auth.credentials > (method) delete', + qualified: 'client.auth.credentials.delete', params: ['id: string;', 'Grid-Wallet-Signature?: string;', 'Request-Id?: string;'], - response: - "{ expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }", + response: '{ expiresAt: string; payloadToSign: string; requestId: string; }', markdown: - "## revoke\n\n`client.auth.credentials.revoke(id: string, Grid-Wallet-Signature?: string, Request-Id?: string): { expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }`\n\n**delete** `/auth/credentials/{id}`\n\nRevoke an authentication credential on an Embedded Wallet internal account.\n\nRevocation is a two-step flow because it must be authorized by a session on a *different* credential on the same internal account:\n\n1. Call `DELETE /auth/credentials/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of an existing verified credential on the same internal account — other than the one being revoked — to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n\nThe account must retain at least one authentication credential; an account with only a single credential cannot use this endpoint to revoke it.\n\n\n### Parameters\n\n- `id: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }`\n 202 response returned from Embedded Wallet Auth endpoints that require a signed retry — `POST /auth/credentials` (adding an additional credential), `DELETE /auth/credentials/{id}` (revoking a credential), and `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields from `SignedRequestChallenge` plus the `type` of the authentication credential involved (being added, being revoked, or that issued the session being revoked). The client already knows the target resource id from the request path / body it just sent, so nothing beyond `type` is echoed in the response.\n\n - `expiresAt: string`\n - `payloadToSign: string`\n - `requestId: string`\n - `type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.auth.credentials.revoke('id');\n\nconsole.log(response);\n```", + "## delete\n\n`client.auth.credentials.delete(id: string, Grid-Wallet-Signature?: string, Request-Id?: string): object`\n\n**delete** `/auth/credentials/{id}`\n\nRevoke an authentication credential on an Embedded Wallet internal account.\n\nRevocation is a two-step flow because it must be authorized by a session on a *different* credential on the same internal account:\n\n1. Call `DELETE /auth/credentials/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of an existing verified credential on the same internal account — other than the one being revoked — to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n\nThe account must retain at least one authentication credential; an account with only a single credential cannot use this endpoint to revoke it.\n\n\n### Parameters\n\n- `id: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ expiresAt: string; payloadToSign: string; requestId: string; }`\n 202 response returned from Embedded Wallet Auth endpoints that require a signed retry — `POST /auth/credentials` (adding an additional credential), `DELETE /auth/credentials/{id}` (revoking a credential), and `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields from `SignedRequestChallenge` plus the `type` of the authentication credential involved (being added, being revoked, or that issued the session being revoked). The client already knows the target resource id from the request path / body it just sent, so nothing beyond `type` is echoed in the response.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authSignedRequestChallenge = await client.auth.credentials.delete('id');\n\nconsole.log(authSignedRequestChallenge);\n```", perLanguage: { typescript: { - method: 'client.auth.credentials.revoke', + method: 'client.auth.credentials.delete', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.auth.credentials.revoke('id');\n\nconsole.log(response.expiresAt);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authSignedRequestChallenge = await client.auth.credentials.delete('id');\n\nconsole.log(authSignedRequestChallenge);", }, python: { - method: 'auth.credentials.revoke', + method: 'auth.credentials.delete', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.auth.credentials.revoke(\n id="id",\n)\nprint(response.expires_at)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_signed_request_challenge = client.auth.credentials.delete(\n id="id",\n)\nprint(auth_signed_request_challenge)', }, kotlin: { - method: 'auth().credentials().revoke', + method: 'auth().credentials().delete', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.CredentialRevokeParams\nimport com.lightspark.grid.models.auth.credentials.CredentialRevokeResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val response: CredentialRevokeResponse = client.auth().credentials().revoke("id")\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthSignedRequestChallenge\nimport com.lightspark.grid.models.auth.credentials.CredentialDeleteParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val authSignedRequestChallenge: AuthSignedRequestChallenge = client.auth().credentials().delete("id")\n}', }, http: { example: @@ -2481,25 +2519,24 @@ const EMBEDDED_METHODS: MethodEntry[] = [ stainlessPath: '(resource) auth.sessions > (method) list', qualified: 'client.auth.sessions.list', params: ['accountId: string;'], - response: - "{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]; }", + response: '{ data: object[]; }', markdown: - "## list\n\n`client.auth.sessions.list(accountId: string): { data: auth_method[]; }`\n\n**get** `/auth/sessions`\n\nRetrieve all active authentication sessions on an Embedded Wallet internal account. A session is created each time a credential is verified via `POST /auth/credentials/{id}/verify`, and remains active until its `expiresAt` passes or it is revoked via `DELETE /auth/sessions/{id}`.\n\nThe response is not paginated: an internal account is expected to have a small, bounded number of concurrent sessions (one per signed-in device, typically 1–4), so all results are returned inline.\n\n### Parameters\n\n- `accountId: string`\n Internal account id whose sessions to list.\n\n### Returns\n\n- `{ data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]; }`\n\n - `data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst sessions = await client.auth.sessions.list({ accountId: 'accountId' });\n\nconsole.log(sessions);\n```", + "## list\n\n`client.auth.sessions.list(accountId: string): { data: auth_session[]; }`\n\n**get** `/auth/sessions`\n\nRetrieve all active authentication sessions on an Embedded Wallet internal account. A session is created each time a credential is verified via `POST /auth/credentials/{id}/verify`, and remains active until its `expiresAt` passes or it is revoked via `DELETE /auth/sessions/{id}`.\n\nThe response is not paginated: an internal account is expected to have a small, bounded number of concurrent sessions (one per signed-in device, typically 1–4), so all results are returned inline.\n\n### Parameters\n\n- `accountId: string`\n Internal account id whose sessions to list.\n\n### Returns\n\n- `{ data: object[]; }`\n\n - `data: { id: string; accountId: string; createdAt: string; nickname: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; updatedAt: string; }[]`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst sessionListResponse = await client.auth.sessions.list({ accountId: 'accountId' });\n\nconsole.log(sessionListResponse);\n```", perLanguage: { typescript: { method: 'client.auth.sessions.list', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst sessions = await client.auth.sessions.list({ accountId: 'accountId' });\n\nconsole.log(sessions.data);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst sessionListResponse = await client.auth.sessions.list({ accountId: 'accountId' });\n\nconsole.log(sessionListResponse.data);", }, python: { method: 'auth.sessions.list', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nsessions = client.auth.sessions.list(\n account_id="accountId",\n)\nprint(sessions.data)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nsession_list_response = client.auth.sessions.list(\n account_id="accountId",\n)\nprint(session_list_response.data)', }, kotlin: { method: 'auth().sessions().list', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.sessions.SessionListParams\nimport com.lightspark.grid.models.auth.sessions.SessionListResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: SessionListParams = SessionListParams.builder()\n .accountId("accountId")\n .build()\n val sessions: SessionListResponse = client.auth().sessions().list(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.sessions.SessionListParams\nimport com.lightspark.grid.models.auth.sessions.SessionListResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: SessionListParams = SessionListParams.builder()\n .accountId("accountId")\n .build()\n val sessionListResponse: SessionListResponse = client.auth().sessions().list(params)\n}', }, http: { example: @@ -2508,34 +2545,33 @@ const EMBEDDED_METHODS: MethodEntry[] = [ }, }, { - name: 'revoke', + name: 'delete', endpoint: '/auth/sessions/{id}', httpMethod: 'delete', summary: 'Revoke an authentication session', description: 'Revoke an authentication session on an Embedded Wallet internal account. Revocation is a two-step signed-retry flow:\n\n1. Call `DELETE /auth/sessions/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified session on the same internal account (this can be the session being revoked, for self-logout) to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n', - stainlessPath: '(resource) auth.sessions > (method) revoke', - qualified: 'client.auth.sessions.revoke', + stainlessPath: '(resource) auth.sessions > (method) delete', + qualified: 'client.auth.sessions.delete', params: ['id: string;', 'Grid-Wallet-Signature?: string;', 'Request-Id?: string;'], - response: - "{ expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }", + response: '{ expiresAt: string; payloadToSign: string; requestId: string; }', markdown: - "## revoke\n\n`client.auth.sessions.revoke(id: string, Grid-Wallet-Signature?: string, Request-Id?: string): { expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }`\n\n**delete** `/auth/sessions/{id}`\n\nRevoke an authentication session on an Embedded Wallet internal account. Revocation is a two-step signed-retry flow:\n\n1. Call `DELETE /auth/sessions/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified session on the same internal account (this can be the session being revoked, for self-logout) to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n\n\n### Parameters\n\n- `id: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ expiresAt: string; payloadToSign: string; requestId: string; type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; }`\n 202 response returned from Embedded Wallet Auth endpoints that require a signed retry — `POST /auth/credentials` (adding an additional credential), `DELETE /auth/credentials/{id}` (revoking a credential), and `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields from `SignedRequestChallenge` plus the `type` of the authentication credential involved (being added, being revoked, or that issued the session being revoked). The client already knows the target resource id from the request path / body it just sent, so nothing beyond `type` is echoed in the response.\n\n - `expiresAt: string`\n - `payloadToSign: string`\n - `requestId: string`\n - `type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.auth.sessions.revoke('id');\n\nconsole.log(response);\n```", + "## delete\n\n`client.auth.sessions.delete(id: string, Grid-Wallet-Signature?: string, Request-Id?: string): object`\n\n**delete** `/auth/sessions/{id}`\n\nRevoke an authentication session on an Embedded Wallet internal account. Revocation is a two-step signed-retry flow:\n\n1. Call `DELETE /auth/sessions/{id}` with no headers. The response is `202` with a `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified session on the same internal account (this can be the session being revoked, for self-logout) to build an API-key stamp over `payloadToSign`, then retry the same `DELETE` request with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The signed retry returns `204`.\n\n\n### Parameters\n\n- `id: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ expiresAt: string; payloadToSign: string; requestId: string; }`\n 202 response returned from Embedded Wallet Auth endpoints that require a signed retry — `POST /auth/credentials` (adding an additional credential), `DELETE /auth/credentials/{id}` (revoking a credential), and `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields from `SignedRequestChallenge` plus the `type` of the authentication credential involved (being added, being revoked, or that issued the session being revoked). The client already knows the target resource id from the request path / body it just sent, so nothing beyond `type` is echoed in the response.\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst authSignedRequestChallenge = await client.auth.sessions.delete('id');\n\nconsole.log(authSignedRequestChallenge);\n```", perLanguage: { typescript: { - method: 'client.auth.sessions.revoke', + method: 'client.auth.sessions.delete', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.auth.sessions.revoke('id');\n\nconsole.log(response.expiresAt);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst authSignedRequestChallenge = await client.auth.sessions.delete('id');\n\nconsole.log(authSignedRequestChallenge);", }, python: { - method: 'auth.sessions.revoke', + method: 'auth.sessions.delete', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.auth.sessions.revoke(\n id="id",\n)\nprint(response.expires_at)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nauth_signed_request_challenge = client.auth.sessions.delete(\n id="id",\n)\nprint(auth_signed_request_challenge)', }, kotlin: { - method: 'auth().sessions().revoke', + method: 'auth().sessions().delete', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.sessions.SessionRevokeParams\nimport com.lightspark.grid.models.auth.sessions.SessionRevokeResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val response: SessionRevokeResponse = client.auth().sessions().revoke("id")\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.auth.credentials.AuthSignedRequestChallenge\nimport com.lightspark.grid.models.auth.sessions.SessionDeleteParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val authSignedRequestChallenge: AuthSignedRequestChallenge = client.auth().sessions().delete("id")\n}', }, http: { example: @@ -2544,42 +2580,1112 @@ const EMBEDDED_METHODS: MethodEntry[] = [ }, }, { - name: 'export', - endpoint: '/internal-accounts/{id}/export', + name: 'create', + endpoint: '/agents', httpMethod: 'post', - summary: 'Export internal account wallet credentials', + summary: 'Create an agent', description: - 'Export the wallet credentials of an Embedded Wallet internal account. The returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied in the request body.\n\nExport is a two-step signed-retry flow (same pattern as add-additional credential, revoke credential, and revoke session):\n\n1. Call `POST /internal-accounts/{id}/export` with the request body `{ "clientPublicKey": "..." }` and no signature headers. Grid binds the `clientPublicKey` into the `payloadToSign` it returns, so the subsequent stamp in `Grid-Wallet-Signature` commits to the target encryption key. The response is `202` with `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified authentication credential on the same internal account to build an API-key stamp over `payloadToSign`, then retry with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The retry body must carry the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry with `401` if it disagrees with what was bound into `payloadToSign`. The signed retry returns `200` with `encryptedWalletCredentials`, which the client decrypts with the matching private key.\n\nThe `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this export and discard the private key after decrypting. Do not reuse the keypair from any prior verify call — that private key was already discarded after decrypting the session signing key it was issued against.\n', - stainlessPath: '(resource) internal_accounts > (method) export', - qualified: 'client.internalAccounts.export', + 'Create a new agent with a specified policy. Returns the created agent and a device code that must be redeemed by the agent software to complete installation.\n', + stainlessPath: '(resource) agents > (method) create', + qualified: 'client.agents.create', params: [ - 'id: string;', - 'clientPublicKey: string;', - 'Grid-Wallet-Signature?: string;', - 'Request-Id?: string;', + 'customerId: string;', + 'name: string;', + "policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; };", ], - response: '{ id: string; encryptedWalletCredentials: string; }', + response: + '{ agent: { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }; deviceCode: { agentId: string; code: string; expiresAt: string; redeemed: boolean; }; }', markdown: - "## export\n\n`client.internalAccounts.export(id: string, clientPublicKey: string, Grid-Wallet-Signature?: string, Request-Id?: string): { id: string; encryptedWalletCredentials: string; }`\n\n**post** `/internal-accounts/{id}/export`\n\nExport the wallet credentials of an Embedded Wallet internal account. The returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied in the request body.\n\nExport is a two-step signed-retry flow (same pattern as add-additional credential, revoke credential, and revoke session):\n\n1. Call `POST /internal-accounts/{id}/export` with the request body `{ \"clientPublicKey\": \"...\" }` and no signature headers. Grid binds the `clientPublicKey` into the `payloadToSign` it returns, so the subsequent stamp in `Grid-Wallet-Signature` commits to the target encryption key. The response is `202` with `payloadToSign`, `requestId`, and `expiresAt`.\n\n2. Use the session API keypair of a verified authentication credential on the same internal account to build an API-key stamp over `payloadToSign`, then retry with that full stamp as the `Grid-Wallet-Signature` header and the `requestId` echoed back as the `Request-Id` header. The retry body must carry the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry with `401` if it disagrees with what was bound into `payloadToSign`. The signed retry returns `200` with `encryptedWalletCredentials`, which the client decrypts with the matching private key.\n\nThe `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this export and discard the private key after decrypting. Do not reuse the keypair from any prior verify call — that private key was already discarded after decrypting the session signing key it was issued against.\n\n\n### Parameters\n\n- `id: string`\n\n- `clientPublicKey: string`\n Fresh P-256 public key, uncompressed SEC1 hex — 130 hex chars where the first two are `04` (the uncompressed-point indicator). Generate a new keypair for each export and discard the private key after decrypting the response.\n\n- `Grid-Wallet-Signature?: string`\n\n- `Request-Id?: string`\n\n### Returns\n\n- `{ id: string; encryptedWalletCredentials: string; }`\n\n - `id: string`\n - `encryptedWalletCredentials: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst response = await client.internalAccounts.export('id', { clientPublicKey: '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2' });\n\nconsole.log(response);\n```", + "## create\n\n`client.agents.create(customerId: string, name: string, policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }): { agent: agent; deviceCode: agent_device_code; }`\n\n**post** `/agents`\n\nCreate a new agent with a specified policy. Returns the created agent and a device code that must be redeemed by the agent software to complete installation.\n\n\n### Parameters\n\n- `customerId: string`\n The ID of the customer this agent will operate on behalf of.\n\n- `name: string`\n Human-readable name to identify the agent.\n\n- `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n Policy governing what an agent can do, how it executes actions, and its spending boundaries.\n - `defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'`\n Execution mode controlling whether agent actions require human approval. AUTO: The agent can execute actions autonomously without explicit approval. APPROVAL_REQUIRED: All agent actions require explicit human approval before execution.\n - `permissions: string[]`\n List of permissions granted to the agent.\n - `spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }`\n Spending limits that cap the agent's transaction amounts and frequency. All amount fields are integers in the smallest unit of the specified currency. When a transaction is denominated in a different currency, Grid converts using the exchange rate at evaluation time.\n - `accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }`\n Optional restrictions that limit the agent to specific accounts or override policy per account.\n - `approvalThresholds?: { amount?: number; currency?: string; }`\n Thresholds that force approval for high-value transactions, overriding the default execution mode. When a transaction is denominated in a different currency than the threshold, Grid converts using the exchange rate at evaluation time.\n\n### Returns\n\n- `{ agent: { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }; deviceCode: { agentId: string; code: string; expiresAt: string; redeemed: boolean; }; }`\n Response returned when an agent is created, including the agent and a device code for installation.\n\n - `agent: { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n - `deviceCode: { agentId: string; code: string; expiresAt: string; redeemed: boolean; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentCreateResponse = await client.agents.create({\n customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001',\n name: 'Payroll Automation Agent',\n policy: {\n defaultExecutionMode: 'AUTO',\n permissions: ['VIEW_TRANSACTIONS'],\n spendingLimits: { currency: 'USD', perTransactionLimit: 50000 },\n},\n});\n\nconsole.log(agentCreateResponse);\n```", perLanguage: { typescript: { - method: 'client.internalAccounts.export', + method: 'client.agents.create', example: - "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst response = await client.internalAccounts.export('id', {\n clientPublicKey:\n '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2',\n});\n\nconsole.log(response.id);", + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentCreateResponse = await client.agents.create({\n customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001',\n name: 'Payroll Automation Agent',\n policy: {\n defaultExecutionMode: 'AUTO',\n permissions: ['VIEW_TRANSACTIONS'],\n spendingLimits: { currency: 'USD', perTransactionLimit: 50000 },\n },\n});\n\nconsole.log(agentCreateResponse.agent);", }, python: { - method: 'internal_accounts.export', + method: 'agents.create', example: - 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nresponse = client.internal_accounts.export(\n id="id",\n client_public_key="04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2",\n)\nprint(response.id)', + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_create_response = client.agents.create(\n customer_id="Customer:019542f5-b3e7-1d02-0000-000000000001",\n name="Payroll Automation Agent",\n policy={\n "default_execution_mode": "AUTO",\n "permissions": ["VIEW_TRANSACTIONS"],\n "spending_limits": {\n "currency": "USD",\n "per_transaction_limit": 50000,\n },\n },\n)\nprint(agent_create_response.agent)', }, kotlin: { - method: 'internalAccounts().export', + method: 'agents().create', example: - 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.internalaccounts.InternalAccountExportParams\nimport com.lightspark.grid.models.internalaccounts.InternalAccountExportResponse\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: InternalAccountExportParams = InternalAccountExportParams.builder()\n .id("id")\n .clientPublicKey("04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2")\n .build()\n val response: InternalAccountExportResponse = client.internalAccounts().export(params)\n}', + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentCreateRequest\nimport com.lightspark.grid.models.agents.AgentCreateResponse\nimport com.lightspark.grid.models.agents.AgentPolicy\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: AgentCreateRequest = AgentCreateRequest.builder()\n .customerId("Customer:019542f5-b3e7-1d02-0000-000000000001")\n .name("Payroll Automation Agent")\n .policy(AgentPolicy.builder()\n .defaultExecutionMode(AgentPolicy.DefaultExecutionMode.AUTO)\n .addPermission(AgentPolicy.Permission.VIEW_TRANSACTIONS)\n .spendingLimits(AgentPolicy.SpendingLimits.builder()\n .currency("USD")\n .perTransactionLimit(50000L)\n .build())\n .build())\n .build()\n val agentCreateResponse: AgentCreateResponse = client.agents().create(params)\n}', }, http: { example: - 'curl https://api.lightspark.com/grid/2025-10-13/internal-accounts/$ID/export \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "clientPublicKey": "04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2"\n }\'', + 'curl https://api.lightspark.com/grid/2025-10-13/agents \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",\n "name": "Payroll Automation Agent",\n "policy": {\n "defaultExecutionMode": "AUTO",\n "permissions": [\n "VIEW_TRANSACTIONS"\n ],\n "spendingLimits": {\n "currency": "USD",\n "perTransactionLimit": 50000\n }\n }\n }\'', + }, + }, + }, + { + name: 'list', + endpoint: '/agents', + httpMethod: 'get', + summary: 'List agents', + description: 'Retrieve a paginated list of agents for the authenticated platform.', + stainlessPath: '(resource) agents > (method) list', + qualified: 'client.agents.list', + params: [ + 'createdAfter?: string;', + 'createdBefore?: string;', + 'cursor?: string;', + 'customerId?: string;', + 'isConnected?: boolean;', + 'isPaused?: boolean;', + 'limit?: number;', + 'updatedAfter?: string;', + 'updatedBefore?: string;', + ], + response: + "{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }", + markdown: + "## list\n\n`client.agents.list(createdAfter?: string, createdBefore?: string, cursor?: string, customerId?: string, isConnected?: boolean, isPaused?: boolean, limit?: number, updatedAfter?: string, updatedBefore?: string): { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }`\n\n**get** `/agents`\n\nRetrieve a paginated list of agents for the authenticated platform.\n\n### Parameters\n\n- `createdAfter?: string`\n Filter agents created after this timestamp (inclusive)\n\n- `createdBefore?: string`\n Filter agents created before this timestamp (inclusive)\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by customer ID\n\n- `isConnected?: boolean`\n Filter by connection status (whether the device code has been redeemed)\n\n- `isPaused?: boolean`\n Filter by paused status\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `updatedAfter?: string`\n Filter agents updated after this timestamp (inclusive)\n\n- `updatedBefore?: string`\n Filter agents updated before this timestamp (inclusive)\n\n### Returns\n\n- `{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n A programmatic agent with scoped permissions and a spending policy, used to automate payment workflows.\n\n - `id: string`\n - `createdAt: string`\n - `customerId: string`\n - `isConnected: boolean`\n - `isPaused: boolean`\n - `name: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n - `updatedAt: string`\n - `usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const agent of client.agents.list()) {\n console.log(agent);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.list', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const agent of client.agents.list()) {\n console.log(agent.id);\n}", + }, + python: { + method: 'agents.list', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\npage = client.agents.list()\npage = page.data[0]\nprint(page.id)', + }, + kotlin: { + method: 'agents().list', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentListPage\nimport com.lightspark.grid.models.agents.AgentListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: AgentListPage = client.agents().list()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'list_approvals', + endpoint: '/agents/approvals', + httpMethod: 'get', + summary: 'List agent transaction approval requests', + description: + 'Retrieve a paginated list of agent actions that require platform approval. Filter by `agentId` or `customerId` to scope results to a specific agent or customer. Approve or reject individual actions via `POST /agents/{agentId}/actions/{actionId}/approve` or `POST /agents/{agentId}/actions/{actionId}/reject`.\n', + stainlessPath: '(resource) agents > (method) list_approvals', + qualified: 'client.agents.listApprovals', + params: [ + 'agentId?: string;', + 'cursor?: string;', + 'customerId?: string;', + 'endDate?: string;', + 'limit?: number;', + "sortOrder?: 'asc' | 'desc';", + 'startDate?: string;', + ], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## list_approvals\n\n`client.agents.listApprovals(agentId?: string, cursor?: string, customerId?: string, endDate?: string, limit?: number, sortOrder?: 'asc' | 'desc', startDate?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**get** `/agents/approvals`\n\nRetrieve a paginated list of agent actions that require platform approval. Filter by `agentId` or `customerId` to scope results to a specific agent or customer. Approve or reject individual actions via `POST /agents/{agentId}/actions/{actionId}/approve` or `POST /agents/{agentId}/actions/{actionId}/reject`.\n\n\n### Parameters\n\n- `agentId?: string`\n Filter by agent ID\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `customerId?: string`\n Filter by customer ID\n\n- `endDate?: string`\n Filter by end date (inclusive) in ISO 8601 format\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `sortOrder?: 'asc' | 'desc'`\n Order to sort results in\n\n- `startDate?: string`\n Filter by start date (inclusive) in ISO 8601 format\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const agentAction of client.agents.listApprovals()) {\n console.log(agentAction);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.listApprovals', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const agentAction of client.agents.listApprovals()) {\n console.log(agentAction.id);\n}", + }, + python: { + method: 'agents.list_approvals', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\npage = client.agents.list_approvals()\npage = page.data[0]\nprint(page.id)', + }, + kotlin: { + method: 'agents().listApprovals', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentListApprovalsPage\nimport com.lightspark.grid.models.agents.AgentListApprovalsParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: AgentListApprovalsPage = client.agents().listApprovals()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/approvals \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/{agentId}', + httpMethod: 'get', + summary: 'Get agent by ID', + description: 'Retrieve an agent by its system-generated ID.', + stainlessPath: '(resource) agents > (method) retrieve', + qualified: 'client.agents.retrieve', + params: ['agentId: string;'], + response: + "{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }", + markdown: + "## retrieve\n\n`client.agents.retrieve(agentId: string): { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }`\n\n**get** `/agents/{agentId}`\n\nRetrieve an agent by its system-generated ID.\n\n### Parameters\n\n- `agentId: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n A programmatic agent with scoped permissions and a spending policy, used to automate payment workflows.\n\n - `id: string`\n - `createdAt: string`\n - `customerId: string`\n - `isConnected: boolean`\n - `isPaused: boolean`\n - `name: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n - `updatedAt: string`\n - `usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agent = await client.agents.retrieve('agentId');\n\nconsole.log(agent);\n```", + perLanguage: { + typescript: { + method: 'client.agents.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agent = await client.agents.retrieve('agentId');\n\nconsole.log(agent.id);", + }, + python: { + method: 'agents.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent = client.agents.retrieve(\n "agentId",\n)\nprint(agent.id)', + }, + kotlin: { + method: 'agents().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.Agent\nimport com.lightspark.grid.models.agents.AgentRetrieveParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agent: Agent = client.agents().retrieve("agentId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'update', + endpoint: '/agents/{agentId}', + httpMethod: 'patch', + summary: 'Update agent', + description: "Update an agent's name or paused state.", + stainlessPath: '(resource) agents > (method) update', + qualified: 'client.agents.update', + params: ['agentId: string;', 'isPaused?: boolean;', 'name?: string;'], + response: + "{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }", + markdown: + "## update\n\n`client.agents.update(agentId: string, isPaused?: boolean, name?: string): { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }`\n\n**patch** `/agents/{agentId}`\n\nUpdate an agent's name or paused state.\n\n### Parameters\n\n- `agentId: string`\n\n- `isPaused?: boolean`\n Set to true to pause the agent or false to resume it.\n\n- `name?: string`\n Updated name for the agent.\n\n### Returns\n\n- `{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n A programmatic agent with scoped permissions and a spending policy, used to automate payment workflows.\n\n - `id: string`\n - `createdAt: string`\n - `customerId: string`\n - `isConnected: boolean`\n - `isPaused: boolean`\n - `name: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n - `updatedAt: string`\n - `usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agent = await client.agents.update('agentId');\n\nconsole.log(agent);\n```", + perLanguage: { + typescript: { + method: 'client.agents.update', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agent = await client.agents.update('agentId');\n\nconsole.log(agent.id);", + }, + python: { + method: 'agents.update', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent = client.agents.update(\n agent_id="agentId",\n)\nprint(agent.id)', + }, + kotlin: { + method: 'agents().update', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.Agent\nimport com.lightspark.grid.models.agents.AgentUpdateParams\nimport com.lightspark.grid.models.agents.AgentUpdateRequest\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: AgentUpdateParams = AgentUpdateParams.builder()\n .agentId("agentId")\n .agentUpdateRequest(AgentUpdateRequest.builder().build())\n .build()\n val agent: Agent = client.agents().update(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID \\\n -X PATCH \\\n -H \'Content-Type: application/json\' \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET" \\\n -d \'{\n "isPaused": true,\n "name": "Updated Payroll Agent"\n }\'', + }, + }, + }, + { + name: 'delete', + endpoint: '/agents/{agentId}', + httpMethod: 'delete', + summary: 'Delete agent', + description: 'Permanently delete an agent. Connected agent software will lose access immediately.', + stainlessPath: '(resource) agents > (method) delete', + qualified: 'client.agents.delete', + params: ['agentId: string;'], + markdown: + "## delete\n\n`client.agents.delete(agentId: string): void`\n\n**delete** `/agents/{agentId}`\n\nPermanently delete an agent. Connected agent software will lose access immediately.\n\n### Parameters\n\n- `agentId: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nawait client.agents.delete('agentId')\n```", + perLanguage: { + typescript: { + method: 'client.agents.delete', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nawait client.agents.delete('agentId');", + }, + python: { + method: 'agents.delete', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nclient.agents.delete(\n "agentId",\n)', + }, + kotlin: { + method: 'agents().delete', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentDeleteParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n client.agents().delete("agentId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID \\\n -X DELETE \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'update_policy', + endpoint: '/agents/{agentId}/policy', + httpMethod: 'patch', + summary: 'Update agent policy', + description: + "Partially update an agent's policy. Only provided fields will be updated; omitted fields retain their current values. Policy changes take effect immediately.\n", + stainlessPath: '(resource) agents > (method) update_policy', + qualified: 'client.agents.updatePolicy', + params: [ + 'agentId: string;', + "accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; };", + 'approvalThresholds?: { amount?: number; currency?: string; };', + "defaultExecutionMode?: 'AUTO' | 'APPROVAL_REQUIRED';", + 'permissions?: string[];', + 'spendingLimits?: { currency?: string; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; perTransactionLimit?: number; };', + ], + response: + "{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }", + markdown: + "## update_policy\n\n`client.agents.updatePolicy(agentId: string, accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }, approvalThresholds?: { amount?: number; currency?: string; }, defaultExecutionMode?: 'AUTO' | 'APPROVAL_REQUIRED', permissions?: string[], spendingLimits?: { currency?: string; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; perTransactionLimit?: number; }): { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }`\n\n**patch** `/agents/{agentId}/policy`\n\nPartially update an agent's policy. Only provided fields will be updated; omitted fields retain their current values. Policy changes take effect immediately.\n\n\n### Parameters\n\n- `agentId: string`\n\n- `accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }`\n Optional restrictions that limit the agent to specific accounts or override policy per account.\n - `accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]`\n Per-account rules that override the agent's default policy for specific accounts.\n - `allowedAccountIds?: string[]`\n If set, restricts the agent to operate only on the specified internal account IDs. Null means the agent can access all accounts.\n\n- `approvalThresholds?: { amount?: number; currency?: string; }`\n Thresholds that force approval for high-value transactions, overriding the default execution mode. When a transaction is denominated in a different currency than the threshold, Grid converts using the exchange rate at evaluation time.\n - `amount?: number`\n If set, any transaction above this amount (in the smallest unit of the specified currency) will require explicit approval even when the agent's defaultExecutionMode is AUTO. Null means no threshold override.\n - `currency?: string`\n ISO 4217 currency code that the amount threshold is denominated in. Required when amount is set.\n\n- `defaultExecutionMode?: 'AUTO' | 'APPROVAL_REQUIRED'`\n Execution mode controlling whether agent actions require human approval. AUTO: The agent can execute actions autonomously without explicit approval. APPROVAL_REQUIRED: All agent actions require explicit human approval before execution.\n\n- `permissions?: string[]`\n Updated list of permissions. Replaces the entire permissions list when provided.\n\n- `spendingLimits?: { currency?: string; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; perTransactionLimit?: number; }`\n Partial update to spending limits. Only provided fields will be updated; omitted fields retain their current values.\n - `currency?: string`\n ISO 4217 currency code that all amount limits are denominated in. Updating this recasts all existing limits into the new currency denomination.\n - `dailyLimit?: number`\n Maximum daily spend. Set to null to remove the daily limit.\n - `dailyTransactionLimit?: number`\n Maximum number of transactions per day.\n - `monthlyLimit?: number`\n Maximum monthly spend. Set to null to remove the monthly limit.\n - `perTransactionLimit?: number`\n Maximum amount per transaction.\n\n### Returns\n\n- `{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n A programmatic agent with scoped permissions and a spending policy, used to automate payment workflows.\n\n - `id: string`\n - `createdAt: string`\n - `customerId: string`\n - `isConnected: boolean`\n - `isPaused: boolean`\n - `name: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n - `updatedAt: string`\n - `usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agent = await client.agents.updatePolicy('agentId');\n\nconsole.log(agent);\n```", + perLanguage: { + typescript: { + method: 'client.agents.updatePolicy', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agent = await client.agents.updatePolicy('agentId');\n\nconsole.log(agent.id);", + }, + python: { + method: 'agents.update_policy', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent = client.agents.update_policy(\n agent_id="agentId",\n)\nprint(agent.id)', + }, + kotlin: { + method: 'agents().updatePolicy', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.Agent\nimport com.lightspark.grid.models.agents.AgentUpdatePolicyParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agent: Agent = client.agents().updatePolicy("agentId")\n}', + }, + http: { + example: + "curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/policy \\\n -X PATCH \\\n -H 'Content-Type: application/json' \\\n -u \"$GRID_CLIENT_ID:GRID_CLIENT_SECRET\" \\\n -d '{}'", + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/me', + httpMethod: 'get', + summary: 'Get current agent', + description: + "Retrieve the authenticated agent's own profile, policy, and current usage. This endpoint is called by the agent software itself using its own credentials (obtained via device code redemption) rather than platform credentials.\n", + stainlessPath: '(resource) agents.me > (method) retrieve', + qualified: 'client.agents.me.retrieve', + response: + "{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }", + markdown: + "## retrieve\n\n`client.agents.me.retrieve(): { id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: agent_policy; updatedAt: string; usage: agent_usage; }`\n\n**get** `/agents/me`\n\nRetrieve the authenticated agent's own profile, policy, and current usage. This endpoint is called by the agent software itself using its own credentials (obtained via device code redemption) rather than platform credentials.\n\n\n### Returns\n\n- `{ id: string; createdAt: string; customerId: string; isConnected: boolean; isPaused: boolean; name: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; updatedAt: string; usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }; }`\n A programmatic agent with scoped permissions and a spending policy, used to automate payment workflows.\n\n - `id: string`\n - `createdAt: string`\n - `customerId: string`\n - `isConnected: boolean`\n - `isPaused: boolean`\n - `name: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n - `updatedAt: string`\n - `usage: { dailySpend: number; dailyTransactionCount: number; monthlySpend: number; dailyResetDate?: string; monthlyResetMonth?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agent = await client.agents.me.retrieve();\n\nconsole.log(agent);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst agent = await client.agents.me.retrieve();\n\nconsole.log(agent.id);", + }, + python: { + method: 'agents.me.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nagent = client.agents.me.retrieve()\nprint(agent.id)', + }, + kotlin: { + method: 'agents().me().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.Agent\nimport com.lightspark.grid.models.agents.me.MeRetrieveParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agent: Agent = client.agents().me().retrieve()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'create_transfer_in', + endpoint: '/agents/me/transfer-in', + httpMethod: 'post', + summary: 'Create a transfer-in', + description: + "Transfer funds from an external account to an internal account for the authenticated agent's customer. Accounts must belong to the agent's customer. Requires the CREATE_TRANSFERS permission in the agent's policy.\nIf the agent's policy requires approval for this amount, the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\nThis endpoint should only be used for external account sources with pull functionality (e.g. ACH Pull). Otherwise, use the payment instructions on the internal account to deposit funds.\n", + stainlessPath: '(resource) agents.me > (method) create_transfer_in', + qualified: 'client.agents.me.createTransferIn', + params: [ + 'destination: { accountId: string; };', + 'source: { accountId: string; };', + 'amount?: number;', + 'Idempotency-Key?: string;', + ], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## create_transfer_in\n\n`client.agents.me.createTransferIn(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/me/transfer-in`\n\nTransfer funds from an external account to an internal account for the authenticated agent's customer. Accounts must belong to the agent's customer. Requires the CREATE_TRANSFERS permission in the agent's policy.\nIf the agent's policy requires approval for this amount, the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\nThis endpoint should only be used for external account sources with pull functionality (e.g. ACH Pull). Otherwise, use the payment instructions on the internal account to deposit funds.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `source: { accountId: string; }`\n Source external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.me.createTransferIn({\n destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n});\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.createTransferIn', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.me.createTransferIn({\n destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n amount: 12550,\n});\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.me.create_transfer_in', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nagent_action = client.agents.me.create_transfer_in(\n destination={\n "account_id": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n source={\n "account_id": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n amount=12550,\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().me().createTransferIn', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.me.MeCreateTransferInParams\nimport com.lightspark.grid.models.transferin.ExternalAccountReference\nimport com.lightspark.grid.models.transferin.InternalAccountReference\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: MeCreateTransferInParams = MeCreateTransferInParams.builder()\n .destination(InternalAccountReference.builder()\n .accountId("InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .source(ExternalAccountReference.builder()\n .accountId("ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\n val agentAction: AgentAction = client.agents().me().createTransferIn(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/transfer-in \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN" \\\n -d \'{\n "destination": {\n "accountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n "source": {\n "accountId": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n "amount": 12550\n }\'', + }, + }, + }, + { + name: 'create_transfer_out', + endpoint: '/agents/me/transfer-out', + httpMethod: 'post', + summary: 'Create a transfer-out', + description: + "Transfer funds from an internal account to an external account for the authenticated agent's customer. Accounts must belong to the agent's customer. Requires the CREATE_TRANSFERS permission in the agent's policy.\nIf the agent's policy requires approval for this amount, the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\n", + stainlessPath: '(resource) agents.me > (method) create_transfer_out', + qualified: 'client.agents.me.createTransferOut', + params: [ + 'destination: { accountId: string; };', + 'source: { accountId: string; };', + 'amount?: number;', + 'Idempotency-Key?: string;', + ], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## create_transfer_out\n\n`client.agents.me.createTransferOut(destination: { accountId: string; }, source: { accountId: string; }, amount?: number, Idempotency-Key?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/me/transfer-out`\n\nTransfer funds from an internal account to an external account for the authenticated agent's customer. Accounts must belong to the agent's customer. Requires the CREATE_TRANSFERS permission in the agent's policy.\nIf the agent's policy requires approval for this amount, the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\n\n\n### Parameters\n\n- `destination: { accountId: string; }`\n Destination external account details\n - `accountId: string`\n Reference to an external account ID\n\n- `source: { accountId: string; }`\n Source internal account details\n - `accountId: string`\n Reference to an internal account ID\n\n- `amount?: number`\n Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.me.createTransferOut({\n destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n});\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.createTransferOut', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.me.createTransferOut({\n destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n amount: 12550,\n});\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.me.create_transfer_out', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nagent_action = client.agents.me.create_transfer_out(\n destination={\n "account_id": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n source={\n "account_id": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n amount=12550,\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().me().createTransferOut', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.me.MeCreateTransferOutParams\nimport com.lightspark.grid.models.transferin.ExternalAccountReference\nimport com.lightspark.grid.models.transferin.InternalAccountReference\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: MeCreateTransferOutParams = MeCreateTransferOutParams.builder()\n .destination(ExternalAccountReference.builder()\n .accountId("ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .source(InternalAccountReference.builder()\n .accountId("InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .build()\n val agentAction: AgentAction = client.agents().me().createTransferOut(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/transfer-out \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN" \\\n -d \'{\n "destination": {\n "accountId": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n "source": {\n "accountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n "amount": 12550\n }\'', + }, + }, + }, + { + name: 'list_internal_accounts', + endpoint: '/agents/me/internal-accounts', + httpMethod: 'get', + summary: "List agent's internal accounts", + description: + "Retrieve the internal accounts belonging to the customer this agent operates on behalf of. Use this to discover available source accounts for transfers and quotes, and to verify which accounts are accessible under the agent's `accountRestrictions` policy.\n", + stainlessPath: '(resource) agents.me > (method) list_internal_accounts', + qualified: 'client.agents.me.listInternalAccounts', + params: [ + 'currency?: string;', + 'cursor?: string;', + 'limit?: number;', + "type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET';", + ], + response: + "{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }", + markdown: + "## list_internal_accounts\n\n`client.agents.me.listInternalAccounts(currency?: string, cursor?: string, limit?: number, type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'): { id: string; balance: currency_amount; createdAt: string; fundingPaymentInstructions: payment_instructions[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n**get** `/agents/me/internal-accounts`\n\nRetrieve the internal accounts belonging to the customer this agent operates on behalf of. Use this to discover available source accounts for transfers and quotes, and to verify which accounts are accessible under the agent's `accountRestrictions` policy.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n Filter by internal account type. Use `EMBEDDED_WALLET` to find the self-custodial wallet provisioned for the customer, or `INTERNAL_FIAT` / `INTERNAL_CRYPTO` for platform-managed holding accounts.\n\n### Returns\n\n- `{ id: string; balance: { amount: number; currency: currency; }; createdAt: string; fundingPaymentInstructions: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; updatedAt: string; customerId?: string; }`\n\n - `id: string`\n - `balance: { amount: number; currency: { code?: string; decimals?: number; name?: string; symbol?: string; }; }`\n - `createdAt: string`\n - `fundingPaymentInstructions: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `type: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'`\n - `updatedAt: string`\n - `customerId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const internalAccount of client.agents.me.listInternalAccounts()) {\n console.log(internalAccount);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.listInternalAccounts', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const internalAccount of client.agents.me.listInternalAccounts()) {\n console.log(internalAccount.id);\n}", + }, + python: { + method: 'agents.me.list_internal_accounts', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\npage = client.agents.me.list_internal_accounts()\npage = page.data[0]\nprint(page.id)', + }, + kotlin: { + method: 'agents().me().listInternalAccounts', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.MeListInternalAccountsPage\nimport com.lightspark.grid.models.agents.me.MeListInternalAccountsParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: MeListInternalAccountsPage = client.agents().me().listInternalAccounts()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/internal-accounts \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'list', + endpoint: '/agents/me/transactions', + httpMethod: 'get', + summary: 'List agent transactions', + description: + "Retrieve a paginated list of transactions for the authenticated agent's customer. Results are automatically scoped to the agent's associated customer — no customer filter is needed or accepted.\n", + stainlessPath: '(resource) agents.me.transactions > (method) list', + qualified: 'client.agents.me.transactions.list', + params: [ + 'accountIdentifier?: string;', + 'cursor?: string;', + 'endDate?: string;', + 'limit?: number;', + 'receiverAccountIdentifier?: string;', + 'reference?: string;', + 'senderAccountIdentifier?: string;', + "sortOrder?: 'asc' | 'desc';", + 'startDate?: string;', + "status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED';", + "type?: 'INCOMING' | 'OUTGOING';", + ], + response: + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + markdown: + "## list\n\n`client.agents.me.transactions.list(accountIdentifier?: string, cursor?: string, endDate?: string, limit?: number, receiverAccountIdentifier?: string, reference?: string, senderAccountIdentifier?: string, sortOrder?: 'asc' | 'desc', startDate?: string, status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED', type?: 'INCOMING' | 'OUTGOING'): object | object`\n\n**get** `/agents/me/transactions`\n\nRetrieve a paginated list of transactions for the authenticated agent's customer. Results are automatically scoped to the agent's associated customer — no customer filter is needed or accepted.\n\n\n### Parameters\n\n- `accountIdentifier?: string`\n Filter by account identifier (matches either sender or receiver)\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `endDate?: string`\n Filter by end date (inclusive) in ISO 8601 format\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `receiverAccountIdentifier?: string`\n Filter by receiver account identifier\n\n- `reference?: string`\n Filter by reference\n\n- `senderAccountIdentifier?: string`\n Filter by sender account identifier\n\n- `sortOrder?: 'asc' | 'desc'`\n Order to sort results in\n\n- `startDate?: string`\n Filter by start date (inclusive) in ISO 8601 format\n\n- `status?: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'`\n Filter by transaction status\n\n- `type?: 'INCOMING' | 'OUTGOING'`\n Filter by transaction type\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const transaction of client.agents.me.transactions.list()) {\n console.log(transaction);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.transactions.list', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const transaction of client.agents.me.transactions.list()) {\n console.log(transaction);\n}", + }, + python: { + method: 'agents.me.transactions.list', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\npage = client.agents.me.transactions.list()\npage = page.data[0]\nprint(page)', + }, + kotlin: { + method: 'agents().me().transactions().list', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.transactions.TransactionListPage\nimport com.lightspark.grid.models.agents.me.transactions.TransactionListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: TransactionListPage = client.agents().me().transactions().list()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/transactions \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/me/transactions/{transactionId}', + httpMethod: 'get', + summary: 'Get agent transaction by ID', + description: + "Retrieve a specific transaction belonging to the authenticated agent's customer. Returns 404 if the transaction exists but belongs to a different customer.\n", + stainlessPath: '(resource) agents.me.transactions > (method) retrieve', + qualified: 'client.agents.me.transactions.retrieve', + params: ['transactionId: string;'], + response: + "{ id: string; customerId: string; destination: object | object; platformCustomerId: string; receivedAmount: currency_amount; status: transaction_status; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: incoming_rate_details; reconciliationInstructions?: reconciliation_instructions; settledAt?: string; source?: transaction_source_one_of; updatedAt?: string; } | { id: string; customerId: string; destination: object | object; platformCustomerId: string; sentAmount: currency_amount; source: transaction_source_one_of; status: outgoing_transaction_status; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: payment_instructions[]; quoteId?: string; rateDetails?: outgoing_rate_details; receivedAmount?: currency_amount; refund?: object; settledAt?: string; updatedAt?: string; }", + markdown: + "## retrieve\n\n`client.agents.me.transactions.retrieve(transactionId: string): object | object`\n\n**get** `/agents/me/transactions/{transactionId}`\n\nRetrieve a specific transaction belonging to the authenticated agent's customer. Returns 404 if the transaction exists but belongs to a different customer.\n\n\n### Parameters\n\n- `transactionId: string`\n\n### Returns\n\n- `{ id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst transaction = await client.agents.me.transactions.retrieve('transactionId');\n\nconsole.log(transaction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.transactions.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst transaction = await client.agents.me.transactions.retrieve('transactionId');\n\nconsole.log(transaction);", + }, + python: { + method: 'agents.me.transactions.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\ntransaction = client.agents.me.transactions.retrieve(\n "transactionId",\n)\nprint(transaction)', + }, + kotlin: { + method: 'agents().me().transactions().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.transactions.TransactionRetrieveParams\nimport com.lightspark.grid.models.transferin.Transaction\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val transaction: Transaction = client.agents().me().transactions().retrieve("transactionId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/transactions/$TRANSACTION_ID \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'create', + endpoint: '/agents/me/quotes', + httpMethod: 'post', + summary: 'Create a transfer quote', + description: + "Generate a quote for a cross-currency transfer on behalf of the authenticated agent's customer. Accounts referenced in the request must belong to the agent's customer. Requires the CREATE_QUOTES permission in the agent's policy.\nIf the agent's defaultExecutionMode is APPROVAL_REQUIRED, or the quote amount exceeds the agent's approvalThresholds, the resulting transaction will require explicit approval before funds move.\n", + stainlessPath: '(resource) agents.me.quotes > (method) create', + qualified: 'client.agents.me.quotes.create', + params: [ + "destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; };", + 'lockedCurrencyAmount: number;', + "lockedCurrencySide: 'SENDING' | 'RECEIVING';", + "source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; };", + 'description?: string;', + 'immediatelyExecute?: boolean;', + 'lookupId?: string;', + 'purposeOfPayment?: string;', + 'senderCustomerInfo?: object;', + 'Idempotency-Key?: string;', + ], + response: + "{ id: string; createdAt: string; destination: object | object; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: object; sendingCurrency: object; source: object | object; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: object[]; rateDetails?: object; }", + markdown: + "## create\n\n`client.agents.me.quotes.create(destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }, lockedCurrencyAmount: number, lockedCurrencySide: 'SENDING' | 'RECEIVING', source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }, description?: string, immediatelyExecute?: boolean, lookupId?: string, purposeOfPayment?: string, senderCustomerInfo?: object, Idempotency-Key?: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**post** `/agents/me/quotes`\n\nGenerate a quote for a cross-currency transfer on behalf of the authenticated agent's customer. Accounts referenced in the request must belong to the agent's customer. Requires the CREATE_QUOTES permission in the agent's policy.\nIf the agent's defaultExecutionMode is APPROVAL_REQUIRED, or the quote amount exceeds the agent's approvalThresholds, the resulting transaction will require explicit approval before funds move.\n\n\n### Parameters\n\n- `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n Destination account details\n\n- `lockedCurrencyAmount: number`\n The amount to send/receive in the smallest unit of the locked currency (eg. cents). See `lockedCurrencySide` for more information.\n\n- `lockedCurrencySide: 'SENDING' | 'RECEIVING'`\n The side of the quote which should be locked and specified in the `lockedCurrencyAmount`. For example, if I want to send exactly $5 MXN from my wallet, I would set this to \"sending\", and the `lockedCurrencyAmount` to 500 (in cents). If I want the receiver to receive exactly $10 USD, I would set this to \"receiving\" and the `lockedCurrencyAmount` to 10000 (in cents).\n\n- `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n Source account details\n\n- `description?: string`\n Optional description/memo for the transfer\n\n- `immediatelyExecute?: boolean`\n Whether to immediately execute the quote after creation. If true, the quote will be executed and the transaction will be created at the current exchange rate. It should only be used if you don't want to lock and view rate details before executing the quote. If you are executing a pre-existing quote, use the `/quotes/{quoteId}/execute` endpoint instead. This is false by default.\nThis can only be used for quotes with a `source` which is either an internal account, or has direct pull functionality (e.g. ACH pull with an external account).\nNot supported when the `source` is an internal account of type `EMBEDDED_WALLET`: those transfers require a `Grid-Wallet-Signature` over the `payloadToSign` returned in the quote response, which is not available in a combined create-and-execute call. Create the quote first with `immediatelyExecute: false` and then call `POST /quotes/{quoteId}/execute` with the signature header.\n\n- `lookupId?: string`\n Lookup ID from a previous receiver lookup request. If provided, this can make the quote creation more efficient by reusing cached lookup data.\nNOTE: This is required for UMA destinations due to counterparty institution requirements. See `senderCustomerInfo` for more information.\n\n- `purposeOfPayment?: string`\n The purpose of the payment. This may be required when sending to certain geographies (e.g. India).\n\n- `senderCustomerInfo?: object`\n Key-value pairs of additional information about the sender which was requested by the destination. This is relevant when the destination requires more sender info than was provided during customer creation.\nAny fields specified in `requiredPayerDataFields` from the response of the `/receiver/uma/{receiverUmaAddress}` (lookupUma) or `/receiver/external-account/{accountId}` (lookupExternalAccount) endpoints MUST be provided here if they were requested. If the destination did not request any additional information, this field can be omitted.\n\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.agents.me.quotes.create({\n destination: { accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', destinationType: 'ACCOUNT' },\n lockedCurrencyAmount: 1000,\n lockedCurrencySide: 'SENDING',\n source: { accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', sourceType: 'ACCOUNT' },\n});\n\nconsole.log(quote);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.quotes.create', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst quote = await client.agents.me.quotes.create({\n destination: {\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n destinationType: 'ACCOUNT',\n },\n lockedCurrencyAmount: 1000,\n lockedCurrencySide: 'SENDING',\n source: {\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n sourceType: 'ACCOUNT',\n },\n});\n\nconsole.log(quote.id);", + }, + python: { + method: 'agents.me.quotes.create', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nquote = client.agents.me.quotes.create(\n destination={\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n "destination_type": "ACCOUNT",\n },\n locked_currency_amount=1000,\n locked_currency_side="SENDING",\n source={\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n "source_type": "ACCOUNT",\n },\n)\nprint(quote.id)', + }, + kotlin: { + method: 'agents().me().quotes().create', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(1000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\n val quote: Quote = client.agents().me().quotes().create(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/quotes \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN" \\\n -d \'{\n "destination": {\n "accountId": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n "destinationType": "ACCOUNT"\n },\n "lockedCurrencyAmount": 1000,\n "lockedCurrencySide": "SENDING",\n "source": {\n "accountId": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n "sourceType": "ACCOUNT"\n },\n "description": "Invoice #1234 payment",\n "lookupId": "Lookup:019542f5-b3e7-1d02-0000-000000000009",\n "senderCustomerInfo": {\n "FULL_NAME": "bar",\n "NATIONALITY": "bar"\n }\n }\'', + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/me/quotes/{quoteId}', + httpMethod: 'get', + summary: 'Get agent quote by ID', + description: + 'Retrieve a quote created by the authenticated agent. Returns 404 if the quote exists but was not created by this agent.\n', + stainlessPath: '(resource) agents.me.quotes > (method) retrieve', + qualified: 'client.agents.me.quotes.retrieve', + params: ['quoteId: string;'], + response: + "{ id: string; createdAt: string; destination: object | object; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: object; sendingCurrency: object; source: object | object; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: object[]; rateDetails?: object; }", + markdown: + "## retrieve\n\n`client.agents.me.quotes.retrieve(quoteId: string): { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }`\n\n**get** `/agents/me/quotes/{quoteId}`\n\nRetrieve a quote created by the authenticated agent. Returns 404 if the quote exists but was not created by this agent.\n\n\n### Parameters\n\n- `quoteId: string`\n\n### Returns\n\n- `{ id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n\n - `id: string`\n - `createdAt: string`\n - `destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }`\n - `exchangeRate: number`\n - `expiresAt: string`\n - `feesIncluded: number`\n - `receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }`\n - `source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }`\n - `status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'`\n - `totalReceivingAmount: number`\n - `totalSendingAmount: number`\n - `transactionId: string`\n - `counterpartyInformation?: object`\n - `paymentInstructions?: { accountOrWalletInfo: { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { qrCode: string; accountType?: 'BRL_ACCOUNT'; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'ARS_ACCOUNT'; } | { paymentUrl: string; accountType?: 'COP_ACCOUNT'; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; assetType: 'BTC' | 'USDB'; invoice?: string; } | { invoice: string; accountType?: 'LIGHTNING'; } | { accountType: 'SOLANA_WALLET'; address: string; assetType?: 'USDC' | 'USDT'; } | { accountType: 'TRON_WALLET'; address: string; assetType?: 'USDT'; } | { accountType: 'POLYGON_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'BASE_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'ETHEREUM_WALLET'; address: string; assetType?: 'USDC'; } | { accountType: 'EMBEDDED_WALLET'; payloadToSign: string; }; instructionsNotes?: string; isPlatformAccount?: boolean; }[]`\n - `rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst quote = await client.agents.me.quotes.retrieve('quoteId');\n\nconsole.log(quote);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.quotes.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst quote = await client.agents.me.quotes.retrieve('quoteId');\n\nconsole.log(quote.id);", + }, + python: { + method: 'agents.me.quotes.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nquote = client.agents.me.quotes.retrieve(\n "quoteId",\n)\nprint(quote.id)', + }, + kotlin: { + method: 'agents().me().quotes().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.quotes.QuoteRetrieveParams\nimport com.lightspark.grid.models.quotes.Quote\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val quote: Quote = client.agents().me().quotes().retrieve("quoteId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/quotes/$QUOTE_ID \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'execute', + endpoint: '/agents/me/quotes/{quoteId}/execute', + httpMethod: 'post', + summary: 'Execute a quote', + description: + "Execute a quote created by the authenticated agent. Requires the EXECUTE_QUOTES permission in the agent's policy.\nIf the agent's policy requires approval for this amount (based on execution mode or approval thresholds), the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\nOnce executed, the quote cannot be cancelled.\n", + stainlessPath: '(resource) agents.me.quotes > (method) execute', + qualified: 'client.agents.me.quotes.execute', + params: ['quoteId: string;', 'Grid-Wallet-Signature?: string;', 'Idempotency-Key?: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## execute\n\n`client.agents.me.quotes.execute(quoteId: string, Grid-Wallet-Signature?: string, Idempotency-Key?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/me/quotes/{quoteId}/execute`\n\nExecute a quote created by the authenticated agent. Requires the EXECUTE_QUOTES permission in the agent's policy.\nIf the agent's policy requires approval for this amount (based on execution mode or approval thresholds), the transaction will be created in a pending state and must be approved by the platform via `POST /agents/{agentId}/actions/{actionId}/approve`.\nOnce executed, the quote cannot be cancelled.\n\n\n### Parameters\n\n- `quoteId: string`\n\n- `Grid-Wallet-Signature?: string`\n\n- `Idempotency-Key?: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.me.quotes.execute('Quote:019542f5-b3e7-1d02-0000-000000000001');\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.quotes.execute', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.me.quotes.execute(\n 'Quote:019542f5-b3e7-1d02-0000-000000000001',\n);\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.me.quotes.execute', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nagent_action = client.agents.me.quotes.execute(\n quote_id="Quote:019542f5-b3e7-1d02-0000-000000000001",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().me().quotes().execute', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.me.quotes.QuoteExecuteParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agentAction: AgentAction = client.agents().me().quotes().execute("Quote:019542f5-b3e7-1d02-0000-000000000001")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/quotes/$QUOTE_ID/execute \\\n -X POST \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'list', + endpoint: '/agents/me/external-accounts', + httpMethod: 'get', + summary: 'List agent external accounts', + description: + "Retrieve a paginated list of external accounts belonging to the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n", + stainlessPath: '(resource) agents.me.external_accounts > (method) list', + qualified: 'client.agents.me.externalAccounts.list', + params: ['currency?: string;', 'cursor?: string;', 'limit?: number;'], + response: + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + markdown: + "## list\n\n`client.agents.me.externalAccounts.list(currency?: string, cursor?: string, limit?: number): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/agents/me/external-accounts`\n\nRetrieve a paginated list of external accounts belonging to the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n\n\n### Parameters\n\n- `currency?: string`\n Filter by currency code\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.agents.me.externalAccounts.list()) {\n console.log(externalAccount);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.externalAccounts.list', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const externalAccount of client.agents.me.externalAccounts.list()) {\n console.log(externalAccount.id);\n}", + }, + python: { + method: 'agents.me.external_accounts.list', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\npage = client.agents.me.external_accounts.list()\npage = page.data[0]\nprint(page.id)', + }, + kotlin: { + method: 'agents().me().externalAccounts().list', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.externalaccounts.ExternalAccountListPage\nimport com.lightspark.grid.models.agents.me.externalaccounts.ExternalAccountListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: ExternalAccountListPage = client.agents().me().externalAccounts().list()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/external-accounts \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'add', + endpoint: '/agents/me/external-accounts', + httpMethod: 'post', + summary: 'Add an external account', + description: + "Register a new external bank account or wallet for the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy. The `customerId` field is optional and will be inferred from the agent's associated customer if omitted.\n", + stainlessPath: '(resource) agents.me.external_accounts > (method) add', + qualified: 'client.agents.me.externalAccounts.add', + params: [ + "accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; };", + 'currency: string;', + 'customerId?: string;', + 'defaultUmaDepositAccount?: boolean;', + 'platformAccountId?: string;', + ], + response: + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + markdown: + "## add\n\n`client.agents.me.externalAccounts.add(accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: aed_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: brl_beneficiary | business_beneficiary; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: bwp_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: cad_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: dkk_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: eur_beneficiary | business_beneficiary; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: gbp_beneficiary | business_beneficiary; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: hkd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: idr_beneficiary | business_beneficiary; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: inr_beneficiary | business_beneficiary; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: kes_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: mwk_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: mxn_beneficiary | business_beneficiary; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: myr_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: ngn_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: php_beneficiary | business_beneficiary; } | { accountType: 'RWF_ACCOUNT'; beneficiary: rwf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: sgd_beneficiary | business_beneficiary; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: thb_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: tzs_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: ugx_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: usd_beneficiary | business_beneficiary; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: vnd_beneficiary | business_beneficiary; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: xaf_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: xof_beneficiary | business_beneficiary; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: zar_beneficiary | business_beneficiary; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: zmw_beneficiary | business_beneficiary; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: bdt_beneficiary | business_beneficiary; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: cop_beneficiary | business_beneficiary; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: egp_beneficiary | business_beneficiary; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: ghs_beneficiary | business_beneficiary; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: gtq_beneficiary | business_beneficiary; } | { accountType: 'HTG_ACCOUNT'; beneficiary: htg_beneficiary | business_beneficiary; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: jmd_beneficiary | business_beneficiary; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: pkr_beneficiary | business_beneficiary; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }, currency: string, customerId?: string, defaultUmaDepositAccount?: boolean, platformAccountId?: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**post** `/agents/me/external-accounts`\n\nRegister a new external bank account or wallet for the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy. The `customerId` field is optional and will be inferred from the agent's associated customer if omitted.\n\n\n### Parameters\n\n- `accountInfo: { accountType: 'AED_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'BRL_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountType: 'BWP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; registrationNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'DKK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban: string; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; vpa: string; } | { accountType: 'KES_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; clabeNumber: string; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'RWF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; swiftCode: string; } | { accountType: 'XAF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'XOF_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'ZMW_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; provider: string; } | { accountType: 'BDT_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; beneficiary: { beneficiaryType: 'INDIVIDUAL'; documentNumber: string; documentType: string; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; countryOfResidence: string; fullName: string; phoneNumber: string; address?: address; birthDate?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; } | { accountType: 'HTG_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; beneficiary: { address: address; beneficiaryType: 'INDIVIDUAL'; fullName: string; phoneNumber: string; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; branchCode: string; } | { accountType: 'PKR_ACCOUNT'; beneficiary: { beneficiaryType: 'INDIVIDUAL'; fullName: string; address?: address; birthDate?: string; countryOfResidence?: string; email?: string; nationality?: string; phoneNumber?: string; } | { beneficiaryType: 'BUSINESS'; legalName: string; address?: address; countryOfResidence?: string; email?: string; phoneNumber?: string; registrationNumber?: string; taxId?: string; }; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; }`\n Lightning payment destination. Exactly one of `invoice`, `bolt12`, or `lightningAddress` must be provided.\n\n\n- `currency: string`\n The ISO 4217 currency code\n\n- `customerId?: string`\n The ID of the customer for whom to create the external account. If not provided, the external account will be created on behalf of the platform.\n\n- `defaultUmaDepositAccount?: boolean`\n Whether to set the external account as the default UMA deposit account. When set to true, incoming payments to this customer's UMA address will be automatically deposited into this external account. False if not provided. Note that only one external account can be set as the default UMA deposit account for a customer, so if there is already a default UMA deposit account, this will override the existing default UMA deposit account. If there is no default UMA deposit account, incoming UMA payments will be deposited into the primary internal account for the customer.\n\n- `platformAccountId?: string`\n Your platform's identifier for the account in your system. This can be used to reference the account by your own identifier.\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.agents.me.externalAccounts.add({\n accountInfo: {\n accountNumber: '12345678901',\n accountType: 'USD_ACCOUNT',\n beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' },\n routingNumber: '123456789',\n},\n currency: 'USD',\n});\n\nconsole.log(externalAccount);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.externalAccounts.add', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst externalAccount = await client.agents.me.externalAccounts.add({\n accountInfo: {\n accountType: 'USD_ACCOUNT',\n accountNumber: '12345678901',\n routingNumber: '123456789',\n beneficiary: {\n beneficiaryType: 'INDIVIDUAL',\n fullName: 'John Doe',\n birthDate: '1990-01-15',\n nationality: 'US',\n address: {\n line1: '123 Main Street',\n city: 'San Francisco',\n state: 'CA',\n postalCode: '94105',\n country: 'US',\n },\n },\n },\n currency: 'USD',\n});\n\nconsole.log(externalAccount.id);", + }, + python: { + method: 'agents.me.external_accounts.add', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nexternal_account = client.agents.me.external_accounts.add(\n account_info={\n "account_type": "USD_ACCOUNT",\n "account_number": "12345678901",\n "routing_number": "123456789",\n "beneficiary": {\n "beneficiary_type": "INDIVIDUAL",\n "full_name": "John Doe",\n "birth_date": "1990-01-15",\n "nationality": "US",\n "address": {\n "line1": "123 Main Street",\n "city": "San Francisco",\n "state": "CA",\n "postal_code": "94105",\n "country": "US",\n },\n },\n },\n currency="USD",\n)\nprint(external_account.id)', + }, + kotlin: { + method: 'agents().me().externalAccounts().add', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.UsdExternalAccountCreateInfo\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccount\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccountCreate\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: ExternalAccountCreate = ExternalAccountCreate.builder()\n .accountInfo(UsdExternalAccountCreateInfo.builder()\n .accountNumber("12345678901")\n .accountType(UsdExternalAccountCreateInfo.AccountType.USD_ACCOUNT)\n .individualBeneficiary("John Doe")\n .routingNumber("123456789")\n .build())\n .currency("USD")\n .build()\n val externalAccount: ExternalAccount = client.agents().me().externalAccounts().add(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/external-accounts \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN" \\\n -d \'{\n "accountInfo": {\n "accountNumber": "12345678901",\n "accountType": "USD_ACCOUNT",\n "beneficiary": {\n "beneficiaryType": "INDIVIDUAL",\n "fullName": "John Doe",\n "address": {\n "country": "US",\n "line1": "123 Main Street",\n "postalCode": "94105",\n "city": "San Francisco",\n "state": "CA"\n },\n "birthDate": "1990-01-15",\n "nationality": "US"\n },\n "routingNumber": "123456789"\n },\n "currency": "USD",\n "customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",\n "platformAccountId": "ext_acc_123456"\n }\'', + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/me/external-accounts/{externalAccountId}', + httpMethod: 'get', + summary: 'Get agent external account by ID', + description: + "Retrieve an external account belonging to the authenticated agent's customer. Returns 404 if the account exists but belongs to a different customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n", + stainlessPath: '(resource) agents.me.external_accounts > (method) retrieve', + qualified: 'client.agents.me.externalAccounts.retrieve', + params: ['externalAccountId: string;'], + response: + "{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }", + markdown: + "## retrieve\n\n`client.agents.me.externalAccounts.retrieve(externalAccountId: string): { id: string; accountInfo: external_account_info_one_of; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: beneficiary_verified_data; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n**get** `/agents/me/external-accounts/{externalAccountId}`\n\nRetrieve an external account belonging to the authenticated agent's customer. Returns 404 if the account exists but belongs to a different customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Returns\n\n- `{ id: string; accountInfo: brl_account_info | cad_account_info | dkk_account_info | eur_account_info | gbp_account_info | hkd_account_info | idr_account_info | inr_account_info | kes_account_info | mwk_account_info | mxn_account_info | myr_account_info | ngn_account_info | php_account_info | rwf_account_info | sgd_account_info | thb_account_info | tzs_account_info | ugx_account_info | usd_account_info | vnd_account_info | xof_account_info | zar_account_info | zmw_account_info | object | object | object | object | object | object | object | aed_account_info | bwp_account_info | xaf_account_info | bdt_account_info | cop_account_info | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info; currency: string; status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'; beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'; beneficiaryVerifiedData?: { fullName?: string; }; customerId?: string; defaultUmaDepositAccount?: boolean; platformAccountId?: string; }`\n\n - `id: string`\n - `accountInfo: { accountType: 'BRL_ACCOUNT'; paymentRails: 'PIX'[]; pixKey: string; pixKeyType: 'CPF' | 'CNPJ' | 'EMAIL' | 'PHONE' | 'RANDOM'; taxId: string; } | { accountNumber: string; accountType: 'CAD_ACCOUNT'; bankCode: string; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'DKK_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountType: 'EUR_ACCOUNT'; iban: string; paymentRails: 'SEPA' | 'SEPA_INSTANT'[]; swiftCode?: string; } | { accountNumber: string; accountType: 'GBP_ACCOUNT'; paymentRails: 'FASTER_PAYMENTS'[]; sortCode: string; } | { accountNumber: string; accountType: 'HKD_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'IDR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; phoneNumber: string; swiftCode: string; } | { accountType: 'INR_ACCOUNT'; paymentRails: 'UPI'[]; vpa: string; } | { accountType: 'KES_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MWK_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'MXN_ACCOUNT'; clabeNumber: string; paymentRails: 'SPEI'[]; } | { accountNumber: string; accountType: 'MYR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'NGN_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'PHP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'RWF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'SGD_ACCOUNT'; bankName: string; paymentRails: 'PAYNOW' | 'FAST' | 'BANK_TRANSFER'[]; swiftCode: string; } | { accountNumber: string; accountType: 'THB_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'TZS_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'UGX_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountNumber: string; accountType: 'USD_ACCOUNT'; paymentRails: 'ACH' | 'WIRE' | 'RTP' | 'FEDNOW'[]; routingNumber: string; } | { accountNumber: string; accountType: 'VND_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode: string; } | { accountType: 'XOF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'BJ' | 'CI' | 'SN' | 'TG'; } | { accountNumber: string; accountType: 'ZAR_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'ZMW_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'SPARK_WALLET'; address: string; } | { accountType: 'LIGHTNING'; bolt12?: string; invoice?: string; lightningAddress?: string; } | { accountType: 'SOLANA_WALLET'; address: string; } | { accountType: 'TRON_WALLET'; address: string; } | { accountType: 'POLYGON_WALLET'; address: string; } | { accountType: 'BASE_WALLET'; address: string; } | { accountType: 'ETHEREUM_WALLET'; address: string; } | { accountType: 'AED_ACCOUNT'; iban: string; paymentRails: 'BANK_TRANSFER'[]; swiftCode?: string; } | { accountType: 'BWP_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; } | { accountType: 'XAF_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; provider: string; region: 'CM' | 'CG'; } | { accountType: 'BDT_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; branchCode?: string; phoneNumber?: string; swiftCode?: string; } | { accountNumber: string; accountType: 'COP_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountNumber: string; accountType: 'EGP_ACCOUNT'; bankName: string; paymentRails: 'BANK_TRANSFER'[]; iban?: string; swiftCode?: string; } | { accountType: 'GHS_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; phoneNumber?: string; } | { accountNumber: string; accountType: 'GTQ_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'HTG_ACCOUNT'; paymentRails: 'MOBILE_MONEY'[]; phoneNumber: string; } | { accountNumber: string; accountType: 'JMD_ACCOUNT'; bankAccountType: 'CHECKING' | 'SAVINGS'; branchCode: string; paymentRails: 'BANK_TRANSFER'[]; } | { accountType: 'PKR_ACCOUNT'; paymentRails: 'BANK_TRANSFER' | 'MOBILE_MONEY'[]; accountNumber?: string; bankName?: string; iban?: string; phoneNumber?: string; }`\n - `currency: string`\n - `status: 'PENDING' | 'ACTIVE' | 'UNDER_REVIEW' | 'INACTIVE'`\n - `beneficiaryVerificationStatus?: 'MATCHED' | 'PARTIAL_MATCH' | 'NOT_MATCHED' | 'UNSUPPORTED' | 'CHECKED_BY_RECEIVING_FI' | 'PENDING'`\n - `beneficiaryVerifiedData?: { fullName?: string; }`\n - `customerId?: string`\n - `defaultUmaDepositAccount?: boolean`\n - `platformAccountId?: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst externalAccount = await client.agents.me.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.externalAccounts.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst externalAccount = await client.agents.me.externalAccounts.retrieve('externalAccountId');\n\nconsole.log(externalAccount.id);", + }, + python: { + method: 'agents.me.external_accounts.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nexternal_account = client.agents.me.external_accounts.retrieve(\n "externalAccountId",\n)\nprint(external_account.id)', + }, + kotlin: { + method: 'agents().me().externalAccounts().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.externalaccounts.ExternalAccountRetrieveParams\nimport com.lightspark.grid.models.customers.externalaccounts.ExternalAccount\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val externalAccount: ExternalAccount = client.agents().me().externalAccounts().retrieve("externalAccountId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/external-accounts/$EXTERNAL_ACCOUNT_ID \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'delete', + endpoint: '/agents/me/external-accounts/{externalAccountId}', + httpMethod: 'delete', + summary: 'Delete agent external account', + description: + "Delete an external account belonging to the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n", + stainlessPath: '(resource) agents.me.external_accounts > (method) delete', + qualified: 'client.agents.me.externalAccounts.delete', + params: ['externalAccountId: string;'], + markdown: + "## delete\n\n`client.agents.me.externalAccounts.delete(externalAccountId: string): void`\n\n**delete** `/agents/me/external-accounts/{externalAccountId}`\n\nDelete an external account belonging to the authenticated agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy.\n\n\n### Parameters\n\n- `externalAccountId: string`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nawait client.agents.me.externalAccounts.delete('externalAccountId')\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.externalAccounts.delete', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nawait client.agents.me.externalAccounts.delete('externalAccountId');", + }, + python: { + method: 'agents.me.external_accounts.delete', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nclient.agents.me.external_accounts.delete(\n "externalAccountId",\n)', + }, + kotlin: { + method: 'agents().me().externalAccounts().delete', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.externalaccounts.ExternalAccountDeleteParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n client.agents().me().externalAccounts().delete("externalAccountId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/external-accounts/$EXTERNAL_ACCOUNT_ID \\\n -X DELETE \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'list', + endpoint: '/agents/me/actions', + httpMethod: 'get', + summary: "List agent's own actions", + description: + 'Retrieve a paginated list of actions submitted by the authenticated agent. Use this to poll for approval decisions after submitting an action that requires approval.\n', + stainlessPath: '(resource) agents.me.actions > (method) list', + qualified: 'client.agents.me.actions.list', + params: [ + 'cursor?: string;', + 'limit?: number;', + "status?: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED';", + ], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## list\n\n`client.agents.me.actions.list(cursor?: string, limit?: number, status?: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**get** `/agents/me/actions`\n\nRetrieve a paginated list of actions submitted by the authenticated agent. Use this to poll for approval decisions after submitting an action that requires approval.\n\n\n### Parameters\n\n- `cursor?: string`\n Cursor for pagination (returned from previous request)\n\n- `limit?: number`\n Maximum number of results to return (default 20, max 100)\n\n- `status?: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n Filter by action status\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// Automatically fetches more pages as needed.\nfor await (const agentAction of client.agents.me.actions.list()) {\n console.log(agentAction);\n}\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.actions.list', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\n// Automatically fetches more pages as needed.\nfor await (const agentAction of client.agents.me.actions.list()) {\n console.log(agentAction.id);\n}", + }, + python: { + method: 'agents.me.actions.list', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\npage = client.agents.me.actions.list()\npage = page.data[0]\nprint(page.id)', + }, + kotlin: { + method: 'agents().me().actions().list', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.me.actions.ActionListPage\nimport com.lightspark.grid.models.agents.me.actions.ActionListParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val page: ActionListPage = client.agents().me().actions().list()\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/actions \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'retrieve', + endpoint: '/agents/me/actions/{actionId}', + httpMethod: 'get', + summary: 'Get an agent action', + description: + 'Retrieve a specific action submitted by the authenticated agent. Poll this endpoint after submitting an action that requires approval to check whether it has been approved, rejected, or has failed.\n', + stainlessPath: '(resource) agents.me.actions > (method) retrieve', + qualified: 'client.agents.me.actions.retrieve', + params: ['actionId: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## retrieve\n\n`client.agents.me.actions.retrieve(actionId: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**get** `/agents/me/actions/{actionId}`\n\nRetrieve a specific action submitted by the authenticated agent. Poll this endpoint after submitting an action that requires approval to check whether it has been approved, rejected, or has failed.\n\n\n### Parameters\n\n- `actionId: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.me.actions.retrieve('actionId');\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.me.actions.retrieve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n agentAccessToken: process.env['GRID_AGENT_ACCESS_TOKEN'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.me.actions.retrieve('actionId');\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.me.actions.retrieve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n agent_access_token=os.environ.get("GRID_AGENT_ACCESS_TOKEN"), # This is the default and can be omitted\n)\nagent_action = client.agents.me.actions.retrieve(\n "actionId",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().me().actions().retrieve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.me.actions.ActionRetrieveParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agentAction: AgentAction = client.agents().me().actions().retrieve("actionId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/me/actions/$ACTION_ID \\\n -H "Authorization: Bearer $GRID_AGENT_ACCESS_TOKEN"', + }, + }, + }, + { + name: 'regenerate', + endpoint: '/agents/{agentId}/device-codes', + httpMethod: 'post', + summary: 'Regenerate a device code', + description: + 'Generate a new device code for an existing agent. Use this when the original device code has expired before being redeemed, or when the agent software needs to be reinstalled. Any previously issued unredeemed device codes for this agent are invalidated.\n', + stainlessPath: '(resource) agents.device_codes > (method) regenerate', + qualified: 'client.agents.deviceCodes.regenerate', + params: ['agentId: string;'], + response: '{ agentId: string; code: string; expiresAt: string; redeemed: boolean; }', + markdown: + "## regenerate\n\n`client.agents.deviceCodes.regenerate(agentId: string): { agentId: string; code: string; expiresAt: string; redeemed: boolean; }`\n\n**post** `/agents/{agentId}/device-codes`\n\nGenerate a new device code for an existing agent. Use this when the original device code has expired before being redeemed, or when the agent software needs to be reinstalled. Any previously issued unredeemed device codes for this agent are invalidated.\n\n\n### Parameters\n\n- `agentId: string`\n\n### Returns\n\n- `{ agentId: string; code: string; expiresAt: string; redeemed: boolean; }`\n\n - `agentId: string`\n - `code: string`\n - `expiresAt: string`\n - `redeemed: boolean`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentDeviceCode = await client.agents.deviceCodes.regenerate('agentId');\n\nconsole.log(agentDeviceCode);\n```", + perLanguage: { + typescript: { + method: 'client.agents.deviceCodes.regenerate', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentDeviceCode = await client.agents.deviceCodes.regenerate('agentId');\n\nconsole.log(agentDeviceCode.agentId);", + }, + python: { + method: 'agents.device_codes.regenerate', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_device_code = client.agents.device_codes.regenerate(\n "agentId",\n)\nprint(agent_device_code.agent_id)', + }, + kotlin: { + method: 'agents().deviceCodes().regenerate', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentDeviceCode\nimport com.lightspark.grid.models.agents.devicecodes.DeviceCodeRegenerateParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agentDeviceCode: AgentDeviceCode = client.agents().deviceCodes().regenerate("agentId")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/device-codes \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'get_status', + endpoint: '/agents/device-codes/{code}/status', + httpMethod: 'get', + summary: 'Get device code status', + description: + 'Check whether a device code has been redeemed. Use this to poll for agent installation completion after creating an agent.\n', + stainlessPath: '(resource) agents.device_codes > (method) get_status', + qualified: 'client.agents.deviceCodes.getStatus', + params: ['code: string;'], + response: '{ code: string; redeemed: boolean; }', + markdown: + "## get_status\n\n`client.agents.deviceCodes.getStatus(code: string): { code: string; redeemed: boolean; }`\n\n**get** `/agents/device-codes/{code}/status`\n\nCheck whether a device code has been redeemed. Use this to poll for agent installation completion after creating an agent.\n\n\n### Parameters\n\n- `code: string`\n\n### Returns\n\n- `{ code: string; redeemed: boolean; }`\n\n - `code: string`\n - `redeemed: boolean`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentDeviceCodeStatusResponse = await client.agents.deviceCodes.getStatus('code');\n\nconsole.log(agentDeviceCodeStatusResponse);\n```", + perLanguage: { + typescript: { + method: 'client.agents.deviceCodes.getStatus', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentDeviceCodeStatusResponse = await client.agents.deviceCodes.getStatus('code');\n\nconsole.log(agentDeviceCodeStatusResponse.code);", + }, + python: { + method: 'agents.device_codes.get_status', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_device_code_status_response = client.agents.device_codes.get_status(\n "code",\n)\nprint(agent_device_code_status_response.code)', + }, + kotlin: { + method: 'agents().deviceCodes().getStatus', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentDeviceCodeStatusResponse\nimport com.lightspark.grid.models.agents.devicecodes.DeviceCodeGetStatusParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agentDeviceCodeStatusResponse: AgentDeviceCodeStatusResponse = client.agents().deviceCodes().getStatus("code")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/device-codes/$CODE/status \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'redeem', + endpoint: '/agents/device-codes/{code}/redeem', + httpMethod: 'post', + summary: 'Redeem device code', + description: + 'Redeem a device code to obtain agent credentials. This endpoint is called by the agent software during installation. On success, returns a Bearer access token that the agent uses for all subsequent API calls. The token is returned only once and must be stored securely.\nThis endpoint does not require platform authentication — the device code itself serves as proof of authorization.\n', + stainlessPath: '(resource) agents.device_codes > (method) redeem', + qualified: 'client.agents.deviceCodes.redeem', + params: ['code: string;'], + response: + "{ accessToken: string; agentId: string; agentName: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; }", + markdown: + "## redeem\n\n`client.agents.deviceCodes.redeem(code: string): { accessToken: string; agentId: string; agentName: string; policy: agent_policy; }`\n\n**post** `/agents/device-codes/{code}/redeem`\n\nRedeem a device code to obtain agent credentials. This endpoint is called by the agent software during installation. On success, returns a Bearer access token that the agent uses for all subsequent API calls. The token is returned only once and must be stored securely.\nThis endpoint does not require platform authentication — the device code itself serves as proof of authorization.\n\n\n### Parameters\n\n- `code: string`\n\n### Returns\n\n- `{ accessToken: string; agentId: string; agentName: string; policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: object; accountRestrictions?: object; approvalThresholds?: object; }; }`\n\n - `accessToken: string`\n - `agentId: string`\n - `agentName: string`\n - `policy: { defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; permissions: string[]; spendingLimits: { currency: string; perTransactionLimit: number; dailyLimit?: number; dailyTransactionLimit?: number; monthlyLimit?: number; }; accountRestrictions?: { accountRules?: { accountId: string; executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; perTransactionLimit?: number; }[]; allowedAccountIds?: string[]; }; approvalThresholds?: { amount?: number; currency?: string; }; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentDeviceCodeRedeemResponse = await client.agents.deviceCodes.redeem('code');\n\nconsole.log(agentDeviceCodeRedeemResponse);\n```", + perLanguage: { + typescript: { + method: 'client.agents.deviceCodes.redeem', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentDeviceCodeRedeemResponse = await client.agents.deviceCodes.redeem('code');\n\nconsole.log(agentDeviceCodeRedeemResponse.accessToken);", + }, + python: { + method: 'agents.device_codes.redeem', + example: + 'from grid import LightsparkGrid\n\nclient = LightsparkGrid()\nagent_device_code_redeem_response = client.agents.device_codes.redeem(\n "code",\n)\nprint(agent_device_code_redeem_response.access_token)', + }, + kotlin: { + method: 'agents().deviceCodes().redeem', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentDeviceCodeRedeemResponse\nimport com.lightspark.grid.models.agents.devicecodes.DeviceCodeRedeemParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val agentDeviceCodeRedeemResponse: AgentDeviceCodeRedeemResponse = client.agents().deviceCodes().redeem("code")\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/device-codes/$CODE/redeem \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'approve', + endpoint: '/agents/{agentId}/actions/{actionId}/approve', + httpMethod: 'post', + summary: 'Approve an agent action', + description: + "Approve a pending agent action, allowing Grid to proceed with execution. The action must have status `PENDING_APPROVAL`. Once approved, Grid executes the underlying operation (quote execution or transfer) and the action transitions to `APPROVED`.\nFor `EXECUTE_QUOTE` actions, note that the underlying quote may have expired between submission and approval — in that case the action will transition to `FAILED` instead.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n", + stainlessPath: '(resource) agents.transactions > (method) approve', + qualified: 'client.agents.transactions.approve', + params: ['agentId: string;', 'actionId: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## approve\n\n`client.agents.transactions.approve(agentId: string, actionId: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/{agentId}/actions/{actionId}/approve`\n\nApprove a pending agent action, allowing Grid to proceed with execution. The action must have status `PENDING_APPROVAL`. Once approved, Grid executes the underlying operation (quote execution or transfer) and the action transitions to `APPROVED`.\nFor `EXECUTE_QUOTE` actions, note that the underlying quote may have expired between submission and approval — in that case the action will transition to `FAILED` instead.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n\n\n### Parameters\n\n- `agentId: string`\n\n- `actionId: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.transactions.approve('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.transactions.approve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.transactions.approve('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.transactions.approve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_action = client.agents.transactions.approve(\n action_id="actionId",\n agent_id="agentId",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().transactions().approve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.transactions.TransactionApproveParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: TransactionApproveParams = TransactionApproveParams.builder()\n .agentId("agentId")\n .actionId("actionId")\n .build()\n val agentAction: AgentAction = client.agents().transactions().approve(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/actions/$ACTION_ID/approve \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'reject', + endpoint: '/agents/{agentId}/actions/{actionId}/reject', + httpMethod: 'post', + summary: 'Reject an agent action', + description: + "Reject a pending agent action, preventing execution. The action must have status `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the underlying operation is not executed.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n", + stainlessPath: '(resource) agents.transactions > (method) reject', + qualified: 'client.agents.transactions.reject', + params: ['agentId: string;', 'actionId: string;', 'reason?: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## reject\n\n`client.agents.transactions.reject(agentId: string, actionId: string, reason?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/{agentId}/actions/{actionId}/reject`\n\nReject a pending agent action, preventing execution. The action must have status `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the underlying operation is not executed.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n\n\n### Parameters\n\n- `agentId: string`\n\n- `actionId: string`\n\n- `reason?: string`\n Optional human-readable reason for the rejection, stored on the action and visible to the platform.\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.transactions.reject('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.transactions.reject', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.transactions.reject('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.transactions.reject', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_action = client.agents.transactions.reject(\n action_id="actionId",\n agent_id="agentId",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().transactions().reject', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.transactions.TransactionRejectParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: TransactionRejectParams = TransactionRejectParams.builder()\n .agentId("agentId")\n .actionId("actionId")\n .build()\n val agentAction: AgentAction = client.agents().transactions().reject(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/actions/$ACTION_ID/reject \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'approve', + endpoint: '/agents/{agentId}/actions/{actionId}/approve', + httpMethod: 'post', + summary: 'Approve an agent action', + description: + "Approve a pending agent action, allowing Grid to proceed with execution. The action must have status `PENDING_APPROVAL`. Once approved, Grid executes the underlying operation (quote execution or transfer) and the action transitions to `APPROVED`.\nFor `EXECUTE_QUOTE` actions, note that the underlying quote may have expired between submission and approval — in that case the action will transition to `FAILED` instead.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n", + stainlessPath: '(resource) agents.actions > (method) approve', + qualified: 'client.agents.actions.approve', + params: ['agentId: string;', 'actionId: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## approve\n\n`client.agents.actions.approve(agentId: string, actionId: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/{agentId}/actions/{actionId}/approve`\n\nApprove a pending agent action, allowing Grid to proceed with execution. The action must have status `PENDING_APPROVAL`. Once approved, Grid executes the underlying operation (quote execution or transfer) and the action transitions to `APPROVED`.\nFor `EXECUTE_QUOTE` actions, note that the underlying quote may have expired between submission and approval — in that case the action will transition to `FAILED` instead.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n\n\n### Parameters\n\n- `agentId: string`\n\n- `actionId: string`\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.actions.approve('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.actions.approve', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.actions.approve('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.actions.approve', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_action = client.agents.actions.approve(\n action_id="actionId",\n agent_id="agentId",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().actions().approve', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.actions.ActionApproveParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: ActionApproveParams = ActionApproveParams.builder()\n .agentId("agentId")\n .actionId("actionId")\n .build()\n val agentAction: AgentAction = client.agents().actions().approve(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/actions/$ACTION_ID/approve \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', + }, + }, + }, + { + name: 'reject', + endpoint: '/agents/{agentId}/actions/{actionId}/reject', + httpMethod: 'post', + summary: 'Reject an agent action', + description: + "Reject a pending agent action, preventing execution. The action must have status `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the underlying operation is not executed.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n", + stainlessPath: '(resource) agents.actions > (method) reject', + qualified: 'client.agents.actions.reject', + params: ['agentId: string;', 'actionId: string;', 'reason?: string;'], + response: + "{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }", + markdown: + "## reject\n\n`client.agents.actions.reject(agentId: string, actionId: string, reason?: string): { id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: quote; rejectionReason?: string; transaction?: transaction; transferDetails?: agent_transfer_details; }`\n\n**post** `/agents/{agentId}/actions/{actionId}/reject`\n\nReject a pending agent action, preventing execution. The action must have status `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the underlying operation is not executed.\nThis endpoint is called by the platform's backend using platform credentials, not by the agent itself.\n\n\n### Parameters\n\n- `agentId: string`\n\n- `actionId: string`\n\n- `reason?: string`\n Optional human-readable reason for the rejection, stored on the action and visible to the platform.\n\n### Returns\n\n- `{ id: string; agentId: string; createdAt: string; customerId: string; platformCustomerId: string; status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; updatedAt: string; quote?: { id: string; createdAt: string; destination: quote_destination_one_of; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: currency; sendingCurrency: currency; source: quote_source_one_of; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: payment_instructions[]; rateDetails?: outgoing_rate_details; }; rejectionReason?: string; transaction?: object | object; transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }; }`\n An action submitted by an agent that may require platform approval before execution. All agent-initiated operations (quote execution, transfers) are represented as AgentActions, giving the platform a consistent object to approve, reject, and audit regardless of the underlying operation type.\n\n - `id: string`\n - `agentId: string`\n - `createdAt: string`\n - `customerId: string`\n - `platformCustomerId: string`\n - `status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'`\n - `type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'`\n - `updatedAt: string`\n - `quote?: { id: string; createdAt: string; destination: { accountId: string; destinationType: 'ACCOUNT'; paymentRail?: string; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; currency?: string; }; exchangeRate: number; expiresAt: string; feesIncluded: number; receivingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; sendingCurrency: { code?: string; decimals?: number; name?: string; symbol?: string; }; source: { accountId: string; sourceType: 'ACCOUNT'; customerId?: string; } | { currency: string; sourceType: 'REALTIME_FUNDING'; cryptoNetwork?: string; customerId?: string; }; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'EXPIRED'; totalReceivingAmount: number; totalSendingAmount: number; transactionId: string; counterpartyInformation?: object; paymentInstructions?: { accountOrWalletInfo: usd_account_info | object | mxn_account_info | dkk_account_info | eur_account_info | inr_account_info | ngn_account_info | cad_account_info | gbp_account_info | hkd_account_info | idr_account_info | myr_account_info | php_account_info | sgd_account_info | thb_account_info | vnd_account_info | aed_account_info | kes_account_info | mwk_account_info | rwf_account_info | tzs_account_info | ugx_account_info | xof_account_info | zar_account_info | zmw_account_info | bwp_account_info | xaf_account_info | bdt_account_info | object | object | egp_account_info | ghs_account_info | gtq_account_info | htg_account_info | jmd_account_info | pkr_account_info | object | object | object | object | object | object | object | object; instructionsNotes?: string; isPlatformAccount?: boolean; }[]; rateDetails?: { counterpartyFixedFee: number; counterpartyMultiplier: number; gridApiFixedFee: number; gridApiMultiplier: number; gridApiVariableFeeAmount: number; gridApiVariableFeeRate: number; }; }`\n - `rejectionReason?: string`\n - `transaction?: { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; receivedAmount: object; status: 'CREATED' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'REJECTED' | 'FAILED' | 'REFUNDED' | 'EXPIRED'; type: 'INCOMING' | 'OUTGOING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; failureReason?: string; rateDetails?: object; reconciliationInstructions?: object; settledAt?: string; source?: object | object | object; updatedAt?: string; } | { id: string; customerId: string; destination: { accountId: string; destinationType: 'ACCOUNT'; } | { destinationType: 'UMA_ADDRESS'; umaAddress: string; }; platformCustomerId: string; sentAmount: object; source: object | object | object; status: 'PENDING' | 'EXPIRED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; type: 'OUTGOING' | 'INCOMING'; agentId?: string; counterpartyInformation?: object; createdAt?: string; description?: string; exchangeRate?: number; failureReason?: string; fees?: number; paymentInstructions?: object[]; quoteId?: string; rateDetails?: object; receivedAmount?: object; refund?: { initiatedAt: string; reference: string; status: 'PENDING' | 'COMPLETED' | 'FAILED'; reason?: 'TRANSACTION_FAILED' | 'USER_CANCELLATION' | 'TIMEOUT'; settledAt?: string; }; settledAt?: string; updatedAt?: string; }`\n - `transferDetails?: { amount: number; currency: string; destinationAccountId: string; sourceAccountId: string; }`\n\n### Example\n\n```typescript\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\nconst agentAction = await client.agents.actions.reject('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction);\n```", + perLanguage: { + typescript: { + method: 'client.agents.actions.reject', + example: + "import LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst agentAction = await client.agents.actions.reject('actionId', { agentId: 'agentId' });\n\nconsole.log(agentAction.id);", + }, + python: { + method: 'agents.actions.reject', + example: + 'import os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\nagent_action = client.agents.actions.reject(\n action_id="actionId",\n agent_id="agentId",\n)\nprint(agent_action.id)', + }, + kotlin: { + method: 'agents().actions().reject', + example: + 'package com.lightspark.grid.example\n\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.agents.AgentAction\nimport com.lightspark.grid.models.agents.actions.ActionRejectParams\n\nfun main() {\n val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\n val params: ActionRejectParams = ActionRejectParams.builder()\n .agentId("agentId")\n .actionId("actionId")\n .build()\n val agentAction: AgentAction = client.agents().actions().reject(params)\n}', + }, + http: { + example: + 'curl https://api.lightspark.com/grid/2025-10-13/agents/$AGENT_ID/actions/$ACTION_ID/reject \\\n -X POST \\\n -u "$GRID_CLIENT_ID:GRID_CLIENT_SECRET"', }, }, }, @@ -2589,17 +3695,17 @@ const EMBEDDED_READMES: { language: string; content: string }[] = [ { language: 'kotlin', content: - '# Lightspark Grid Kotlin API Library\n\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.lightspark.grid/lightspark-grid-kotlin)](https://central.sonatype.com/artifact/com.lightspark.grid/lightspark-grid-kotlin/0.0.1)\n[![javadoc](https://javadoc.io/badge2/com.lightspark.grid/lightspark-grid-kotlin/0.0.1/javadoc.svg)](https://javadoc.io/doc/com.lightspark.grid/lightspark-grid-kotlin/0.0.1)\n\n\nThe Lightspark Grid Kotlin SDK provides convenient access to the [Lightspark Grid REST API](grid.lightspark.com) from applications written in Kotlin.\n\n\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwiWC1HcmlkLVNpZ25hdHVyZSI6Ik15IFdlYmhvb2sgU2lnbmF0dXJlIn19)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n\n\nKDocs are available on [javadoc.io](https://javadoc.io/doc/com.lightspark.grid/lightspark-grid-kotlin/0.0.1).\n\n\n\n## Installation\n\n\n\n### Gradle\n\n~~~kotlin\nimplementation("com.lightspark.grid:lightspark-grid-kotlin:0.0.1")\n~~~\n\n### Maven\n\n~~~xml\n\n com.lightspark.grid\n lightspark-grid-kotlin\n 0.0.1\n\n~~~\n\n\n\n## Requirements\n\nThis library requires Java 8 or later.\n\n## Usage\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.quotes().create(params)\n```\n\n## Client configuration\n\nConfigure the client using system properties or environment variables:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n```\n\nOr manually:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .username("My Username")\n .password("My Password")\n .build()\n```\n\nOr using a combination of the two approaches:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n // Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n // Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\n .fromEnv()\n .username("My Username")\n .build()\n```\n\nSee this table for the available options:\n\n| Setter | System property | Environment variable | Required | Default value |\n| ------------------ | ---------------------------------- | -------------------------- | -------- | ---------------------------------------------- |\n| `username` | `lightsparkgrid.gridClientId` | `GRID_CLIENT_ID` | true | - |\n| `password` | `lightsparkgrid.gridClientSecret` | `GRID_CLIENT_SECRET` | true | - |\n| `webhookSignature` | `lightsparkgrid.gridWebhookPubkey` | `GRID_WEBHOOK_PUBKEY` | false | - |\n| `baseUrl` | `lightsparkgrid.baseUrl` | `LIGHTSPARK_GRID_BASE_URL` | true | `"https://api.lightspark.com/grid/2025-10-13"` |\n\nSystem properties take precedence over environment variables.\n\n> [!TIP]\n> Don\'t create more than one client in the same application. Each client has a connection pool and\n> thread pools, which are more efficient to share between requests.\n\n### Modifying configuration\n\nTo temporarily use a modified client configuration, while reusing the same connection and thread pools, call `withOptions()` on any client or service:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\n\nval clientWithOptions: LightsparkGridClient = client.withOptions {\n it.baseUrl("https://example.com")\n it.maxRetries(42)\n}\n```\n\nThe `withOptions()` method does not affect the original client or service.\n\n## Requests and responses\n\nTo send a request to the Lightspark Grid API, build an instance of some `Params` class and pass it to the corresponding client method. When the response is received, it will be deserialized into an instance of a Kotlin class.\n\nFor example, `client.quotes().create(...)` should be called with an instance of `QuoteCreateParams`, and it will return an instance of `Quote`.\n\n## Immutability\n\nEach class in the SDK has an associated [builder](https://blogs.oracle.com/javamagazine/post/exploring-joshua-blochs-builder-design-pattern-in-java) or factory method for constructing it.\n\nEach class is [immutable](https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html) once constructed. If the class has an associated builder, then it has a `toBuilder()` method, which can be used to convert it back to a builder for making a modified copy.\n\nBecause each class is immutable, builder modification will _never_ affect already built class instances.\n\n## Asynchronous execution\n\nThe default client is synchronous. To switch to asynchronous execution, call the `async()` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.async().quotes().create(params)\n```\n\nOr create an asynchronous client from the beginning:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClientAsync\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClientAsync\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClientAsync = LightsparkGridOkHttpClientAsync.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.quotes().create(params)\n```\n\nThe asynchronous client supports the same options as the synchronous one, except most methods are [suspending](https://kotlinlang.org/docs/coroutines-guide.html).\n\n\n\n## File uploads\n\nThe SDK defines methods that accept files.\n\nTo upload a file, pass a [`Path`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.nio.file.Paths\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(Paths.get("/path/to/file"))\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nOr an arbitrary [`InputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.net.URL\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(URL("https://example.com//path/to/file").openStream())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nOr a `ByteArray`:\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file("content".toByteArray())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nNote that when passing a non-`Path` its filename is unknown so it will not be included in the request. To manually set a filename, pass a [`MultipartField`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt):\n\n```kotlin\nimport com.lightspark.grid.core.MultipartField\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.io.InputStream\nimport java.net.URL\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(MultipartField.builder()\n .value(URL("https://example.com//path/to/file").openStream())\n .filename("/path/to/file")\n .build())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\n\n\n## Raw responses\n\nThe SDK defines methods that deserialize responses into instances of Kotlin classes. However, these methods don\'t provide access to the response headers, status code, or the raw response body.\n\nTo access this data, prefix any HTTP method call on a client or service with `withRawResponse()`:\n\n```kotlin\nimport com.lightspark.grid.core.http.Headers\nimport com.lightspark.grid.core.http.HttpResponseFor\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: HttpResponseFor = client.quotes().withRawResponse().create(params)\n\nval statusCode: Int = quote.statusCode()\nval headers: Headers = quote.headers()\n```\n\nYou can still deserialize the response into an instance of a Kotlin class if needed:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval parsedQuote: Quote = quote.parse()\n```\n\n## Error handling\n\nThe SDK throws custom unchecked exception types:\n\n- [`LightsparkGridServiceException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridServiceException.kt): Base class for HTTP errors. See this table for which exception subclass is thrown for each HTTP status code:\n\n | Status | Exception |\n | ------ | -------------------------------------------------- |\n | 400 | [`BadRequestException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/BadRequestException.kt) |\n | 401 | [`UnauthorizedException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnauthorizedException.kt) |\n | 403 | [`PermissionDeniedException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/PermissionDeniedException.kt) |\n | 404 | [`NotFoundException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/NotFoundException.kt) |\n | 422 | [`UnprocessableEntityException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnprocessableEntityException.kt) |\n | 429 | [`RateLimitException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/RateLimitException.kt) |\n | 5xx | [`InternalServerException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/InternalServerException.kt) |\n | others | [`UnexpectedStatusCodeException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnexpectedStatusCodeException.kt) |\n\n- [`LightsparkGridIoException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridIoException.kt): I/O networking errors.\n\n- [`LightsparkGridRetryableException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridRetryableException.kt): Generic error indicating a failure that could be retried by the client.\n\n- [`LightsparkGridInvalidDataException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridInvalidDataException.kt): Failure to interpret successfully parsed data. For example, when accessing a property that\'s supposed to be required, but the API unexpectedly omitted it from the response.\n\n- [`LightsparkGridException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridException.kt): Base class for all exceptions. Most errors will result in one of the previously mentioned ones, but completely generic errors may be thrown using the base class.\n\n## Pagination\n\nThe SDK defines methods that return a paginated lists of results. It provides convenient ways to access the results either one page at a time or item-by-item across all pages.\n\n### Auto-pagination\n\nTo iterate through all results across all pages, use the `autoPager()` method, which automatically fetches more pages as needed.\n\nWhen using the synchronous client, the method returns a [`Sequence`](https://kotlinlang.org/docs/sequences.html)\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPage\n\nval page: CustomerListPage = client.customers().list()\npage.autoPager()\n .take(50)\n .forEach { customer -> println(customer) }\n```\n\nWhen using the asynchronous client, the method returns a [`Flow`](https://kotlinlang.org/docs/flow.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPageAsync\n\nval page: CustomerListPageAsync = client.async().customers().list()\npage.autoPager()\n .take(50)\n .forEach { customer -> println(customer) }\n```\n\n### Manual pagination\n\nTo access individual page items and manually request the next page, use the `items()`,\n`hasNextPage()`, and `nextPage()` methods:\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPage\nimport com.lightspark.grid.models.customers.CustomerOneOf\n\nval page: CustomerListPage = client.customers().list()\nwhile (true) {\n for (customer in page.items()) {\n println(customer)\n }\n\n if (!page.hasNextPage()) {\n break\n }\n\n page = page.nextPage()\n}\n```\n\n## Logging\n\nThe SDK uses the standard [OkHttp logging interceptor](https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor).\n\nEnable logging by setting the `LIGHTSPARK_GRID_LOG` environment variable to `info`:\n\n```sh\nexport LIGHTSPARK_GRID_LOG=info\n```\n\nOr to `debug` for more verbose logging:\n\n```sh\nexport LIGHTSPARK_GRID_LOG=debug\n```\n\n## ProGuard and R8\n\nAlthough the SDK uses reflection, it is still usable with [ProGuard](https://github.com/Guardsquare/proguard) and [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization) because `lightspark-grid-kotlin-core` is published with a [configuration file](lightspark-grid-kotlin-core/src/main/resources/META-INF/proguard/lightspark-grid-kotlin-core.pro) containing [keep rules](https://www.guardsquare.com/manual/configuration/usage).\n\nProGuard and R8 should automatically detect and use the published rules, but you can also manually copy the keep rules if necessary.\n\n\n\n\n\n## Jackson\n\nThe SDK depends on [Jackson](https://github.com/FasterXML/jackson) for JSON serialization/deserialization. It is compatible with version 2.13.4 or higher, but depends on version 2.18.2 by default.\n\nThe SDK throws an exception if it detects an incompatible Jackson version at runtime (e.g. if the default version was overridden in your Maven or Gradle config).\n\nIf the SDK threw an exception, but you\'re _certain_ the version is compatible, then disable the version check using the `checkJacksonVersionCompatibility` on [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt).\n\n> [!CAUTION]\n> We make no guarantee that the SDK works correctly when the Jackson version check is disabled.\n\nAlso note that there are bugs in older Jackson versions that can affect the SDK. We don\'t work around all Jackson bugs ([example](https://github.com/FasterXML/jackson-databind/issues/3240)) and expect users to upgrade Jackson for those instead.\n\n## Network options\n\n### Retries\n\nThe SDK automatically retries 2 times by default, with a short exponential backoff between requests.\n\nOnly the following error types are retried:\n- Connection errors (for example, due to a network connectivity problem)\n- 408 Request Timeout\n- 409 Conflict\n- 429 Rate Limit\n- 5xx Internal\n\nThe API may also explicitly instruct the SDK to retry or not retry a request.\n\nTo set a custom number of retries, configure the client using the `maxRetries` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .maxRetries(4)\n .build()\n```\n\n### Timeouts\n\nRequests time out after 1 minute by default.\n\nTo set a custom timeout, configure the method call using the `timeout` method:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(\n params, RequestOptions.builder().timeout(Duration.ofSeconds(30)).build()\n)\n```\n\nOr configure the default for all method calls at the client level:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.time.Duration\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .timeout(Duration.ofSeconds(30))\n .build()\n```\n\n### Proxies\n\nTo route requests through a proxy, configure the client using the `proxy` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.net.InetSocketAddress\nimport java.net.Proxy\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .proxy(Proxy(\n Proxy.Type.HTTP, InetSocketAddress(\n "https://example.com", 8080\n )\n ))\n .build()\n```\n\n### Connection pooling\n\nTo customize the underlying OkHttp connection pool, configure the client using the `maxIdleConnections` and `keepAliveDuration` methods:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.time.Duration\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n // If `maxIdleConnections` is set, then `keepAliveDuration` must be set, and vice versa.\n .maxIdleConnections(10)\n .keepAliveDuration(Duration.ofMinutes(2))\n .build()\n```\n\nIf both options are unset, OkHttp\'s default connection pool settings are used.\n\n### HTTPS\n\n> [!NOTE]\n> Most applications should not call these methods, and instead use the system defaults. The defaults include\n> special optimizations that can be lost if the implementations are modified.\n\nTo configure how HTTPS connections are secured, configure the client using the `sslSocketFactory`, `trustManager`, and `hostnameVerifier` methods:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n // If `sslSocketFactory` is set, then `trustManager` must be set, and vice versa.\n .sslSocketFactory(yourSSLSocketFactory)\n .trustManager(yourTrustManager)\n .hostnameVerifier(yourHostnameVerifier)\n .build()\n```\n\n\n\n### Custom HTTP client\n\nThe SDK consists of three artifacts:\n- `lightspark-grid-kotlin-core`\n - Contains core SDK logic\n - Does not depend on [OkHttp](https://square.github.io/okhttp)\n - Exposes [`LightsparkGridClient`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClient.kt), [`LightsparkGridClientAsync`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsync.kt), [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt), and [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), all of which can work with any HTTP client\n- `lightspark-grid-kotlin-client-okhttp`\n - Depends on [OkHttp](https://square.github.io/okhttp)\n - Exposes [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) and [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), which provide a way to construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) and [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), respectively, using OkHttp\n- `lightspark-grid-kotlin`\n - Depends on and exposes the APIs of both `lightspark-grid-kotlin-core` and `lightspark-grid-kotlin-client-okhttp`\n - Does not have its own logic\n\nThis structure allows replacing the SDK\'s default HTTP client without pulling in unnecessary dependencies.\n\n#### Customized [`OkHttpClient`](https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html)\n\n> [!TIP]\n> Try the available [network options](#network-options) before replacing the default client.\n\nTo use a customized `OkHttpClient`:\n\n1. Replace your [`lightspark-grid-kotlin` dependency](#installation) with `lightspark-grid-kotlin-core`\n2. Copy `lightspark-grid-kotlin-client-okhttp`\'s [`OkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/OkHttpClient.kt) class into your code and customize it\n3. Construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) or [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), similarly to [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), using your customized client\n\n### Completely custom HTTP client\n\nTo use a completely custom HTTP client:\n\n1. Replace your [`lightspark-grid-kotlin` dependency](#installation) with `lightspark-grid-kotlin-core`\n2. Write a class that implements the [`HttpClient`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/http/HttpClient.kt) interface\n3. Construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) or [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), similarly to [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), using your new client class\n\n## Undocumented API functionality\n\nThe SDK is typed for convenient usage of the documented API. However, it also supports working with undocumented or not yet supported parts of the API.\n\n### Parameters\n\nTo set undocumented parameters, call the `putAdditionalHeader`, `putAdditionalQueryParam`, or `putAdditionalBodyProperty` methods on any `Params` class:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .putAdditionalHeader("Secret-Header", "42")\n .putAdditionalQueryParam("secret_query_param", "42")\n .putAdditionalBodyProperty("secretProperty", JsonValue.from("42"))\n .build()\n```\n\nThese can be accessed on the built object later using the `_additionalHeaders()`, `_additionalQueryParams()`, and `_additionalBodyProperties()` methods.\n\nTo set undocumented parameters on _nested_ headers, query params, or body classes, call the `putAdditionalProperty` method on the nested class:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.transferin.InternalAccountReference\nimport com.lightspark.grid.models.transferin.TransferInCreateParams\n\nval params: TransferInCreateParams = TransferInCreateParams.builder()\n .destination(InternalAccountReference.builder()\n .putAdditionalProperty("secretProperty", JsonValue.from("42"))\n .build())\n .build()\n```\n\nThese properties can be accessed on the nested built object later using the `_additionalProperties()` method.\n\nTo set a documented parameter or property to an undocumented or not yet supported _value_, pass a [`JsonValue`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt) object to its setter:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(JsonValue.from(42))\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\n```\n\nThe most straightforward way to create a [`JsonValue`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt) is using its `from(...)` method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\n\n// Create primitive JSON values\nval nullValue: JsonValue = JsonValue.from(null)\nval booleanValue: JsonValue = JsonValue.from(true)\nval numberValue: JsonValue = JsonValue.from(42)\nval stringValue: JsonValue = JsonValue.from("Hello World!")\n\n// Create a JSON array value equivalent to `["Hello", "World"]`\nval arrayValue: JsonValue = JsonValue.from(listOf(\n "Hello", "World"\n))\n\n// Create a JSON object value equivalent to `{ "a": 1, "b": 2 }`\nval objectValue: JsonValue = JsonValue.from(mapOf(\n "a" to 1, "b" to 2\n))\n\n// Create an arbitrarily nested JSON equivalent to:\n// {\n// "a": [1, 2],\n// "b": [3, 4]\n// }\nval complexValue: JsonValue = JsonValue.from(mapOf(\n "a" to listOf(\n 1, 2\n ), "b" to listOf(\n 3, 4\n )\n))\n```\n\nNormally a `Builder` class\'s `build` method will throw [`IllegalStateException`](https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalStateException.html) if any required parameter or property is unset.\n\nTo forcibly omit a required parameter or property, pass [`JsonMissing`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt):\n\n```kotlin\nimport com.lightspark.grid.core.JsonMissing\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .destination(JsonMissing.of())\n .build()\n```\n\n### Response properties\n\nTo access undocumented response properties, call the `_additionalProperties()` method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonBoolean\nimport com.lightspark.grid.core.JsonNull\nimport com.lightspark.grid.core.JsonNumber\nimport com.lightspark.grid.core.JsonValue\n\nval additionalProperties: Map = client.quotes().create(params)._additionalProperties()\nval secretPropertyValue: JsonValue = additionalProperties.get("secretProperty")\n\nval result = when (secretPropertyValue) {\n is JsonNull -> "It\'s null!"\n is JsonBoolean -> "It\'s a boolean!"\n is JsonNumber -> "It\'s a number!"\n // Other types include `JsonMissing`, `JsonString`, `JsonArray`, and `JsonObject`\n else -> "It\'s something else!"\n}\n```\n\nTo access a property\'s raw JSON value, which may be undocumented, call its `_` prefixed method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonField\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\n\nval destination: JsonField = client.quotes().create(params)._destination()\n\nif (destination.isMissing()) {\n // The property is absent from the JSON response\n} else if (destination.isNull()) {\n // The property was set to literal null\n} else {\n // Check if value was provided as a string\n // Other methods include `asNumber()`, `asBoolean()`, etc.\n val jsonString: String? = destination.asString();\n\n // Try to deserialize into a custom type\n val myObject: MyClass = destination.asUnknown()!!.convert(MyClass::class.java)\n}\n```\n\n### Response validation\n\nIn rare cases, the API may return a response that doesn\'t match the expected type. For example, the SDK may expect a property to contain a `String`, but the API could return something else.\n\nBy default, the SDK will not throw an exception in this case. It will throw [`LightsparkGridInvalidDataException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridInvalidDataException.kt) only if you directly access the property.\n\nIf you would prefer to check that the response is completely well-typed upfront, then either call `validate()`:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(params).validate()\n```\n\nOr configure the method call to validate the response using the `responseValidation` method:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(\n params, RequestOptions.builder().responseValidation(true).build()\n)\n```\n\nOr configure the default for all method calls at the client level:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .responseValidation(true)\n .build()\n```\n\n## FAQ\n\n### Why don\'t you use plain `enum` classes?\n\nKotlin `enum` classes are not trivially [forwards compatible](https://www.stainless.com/blog/making-java-enums-forwards-compatible). Using them in the SDK could cause runtime exceptions if the API is updated to respond with a new enum value.\n\n### Why do you represent fields using `JsonField` instead of just plain `T`?\n\nUsing `JsonField` enables a few features:\n\n- Allowing usage of [undocumented API functionality](#undocumented-api-functionality)\n- Lazily [validating the API response against the expected shape](#response-validation)\n- Representing absent vs explicitly null values\n\n### Why don\'t you use [`data` classes](https://kotlinlang.org/docs/data-classes.html)?\n\nIt is not [backwards compatible to add new fields to a data class](https://kotlinlang.org/docs/api-guidelines-backward-compatibility.html#avoid-using-data-classes-in-your-api) and we don\'t want to introduce a breaking change every time we add a field to a class.\n\n### Why don\'t you use checked exceptions?\n\nChecked exceptions are widely considered a mistake in the Java programming language. In fact, they were omitted from Kotlin for this reason.\n\nChecked exceptions:\n\n- Are verbose to handle\n- Encourage error handling at the wrong level of abstraction, where nothing can be done about the error\n- Are tedious to propagate due to the [function coloring problem](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function)\n- Don\'t play well with lambdas (also due to the function coloring problem)\n\n## Semantic versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n2. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/lightsparkdev/grid-kotlin-sdk/issues) with questions, bugs, or suggestions.\n', + '# Lightspark Grid Kotlin API Library\n\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.lightspark.grid/lightspark-grid-kotlin)](https://central.sonatype.com/artifact/com.lightspark.grid/lightspark-grid-kotlin/0.0.1)\n[![javadoc](https://javadoc.io/badge2/com.lightspark.grid/lightspark-grid-kotlin/0.0.1/javadoc.svg)](https://javadoc.io/doc/com.lightspark.grid/lightspark-grid-kotlin/0.0.1)\n\n\nThe Lightspark Grid Kotlin SDK provides convenient access to the [Lightspark Grid REST API](grid.lightspark.com) from applications written in Kotlin.\n\n\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwieC1ncmlkLWFnZW50LWFjY2Vzcy10b2tlbiI6Ik15IEFnZW50IEFjY2VzcyBUb2tlbiIsIlgtR3JpZC1TaWduYXR1cmUiOiJNeSBXZWJob29rIFNpZ25hdHVyZSJ9fQ)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22x-grid-agent-access-token%22%3A%22My%20Agent%20Access%20Token%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n\n\nKDocs are available on [javadoc.io](https://javadoc.io/doc/com.lightspark.grid/lightspark-grid-kotlin/0.0.1).\n\n\n\n## Installation\n\n\n\n### Gradle\n\n~~~kotlin\nimplementation("com.lightspark.grid:lightspark-grid-kotlin:0.0.1")\n~~~\n\n### Maven\n\n~~~xml\n\n com.lightspark.grid\n lightspark-grid-kotlin\n 0.0.1\n\n~~~\n\n\n\n## Requirements\n\nThis library requires Java 8 or later.\n\n## Usage\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridAgentAccessToken`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_AGENT_ACCESS_TOKEN`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.quotes().create(params)\n```\n\n## Client configuration\n\nConfigure the client using system properties or environment variables:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridAgentAccessToken`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_AGENT_ACCESS_TOKEN`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n```\n\nOr manually:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .username("My Username")\n .password("My Password")\n .build()\n```\n\nOr using a combination of the two approaches:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n // Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridAgentAccessToken`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n // Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_AGENT_ACCESS_TOKEN`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\n .fromEnv()\n .username("My Username")\n .build()\n```\n\nSee this table for the available options:\n\n| Setter | System property | Environment variable | Required | Default value |\n| ------------------ | ------------------------------------- | -------------------------- | -------- | ---------------------------------------------- |\n| `username` | `lightsparkgrid.gridClientId` | `GRID_CLIENT_ID` | false | - |\n| `password` | `lightsparkgrid.gridClientSecret` | `GRID_CLIENT_SECRET` | false | - |\n| `agentAccessToken` | `lightsparkgrid.gridAgentAccessToken` | `GRID_AGENT_ACCESS_TOKEN` | false | - |\n| `webhookSignature` | `lightsparkgrid.gridWebhookPubkey` | `GRID_WEBHOOK_PUBKEY` | false | - |\n| `baseUrl` | `lightsparkgrid.baseUrl` | `LIGHTSPARK_GRID_BASE_URL` | true | `"https://api.lightspark.com/grid/2025-10-13"` |\n\nSystem properties take precedence over environment variables.\n\n> [!TIP]\n> Don\'t create more than one client in the same application. Each client has a connection pool and\n> thread pools, which are more efficient to share between requests.\n\n### Modifying configuration\n\nTo temporarily use a modified client configuration, while reusing the same connection and thread pools, call `withOptions()` on any client or service:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\n\nval clientWithOptions: LightsparkGridClient = client.withOptions {\n it.baseUrl("https://example.com")\n it.maxRetries(42)\n}\n```\n\nThe `withOptions()` method does not affect the original client or service.\n\n## Requests and responses\n\nTo send a request to the Lightspark Grid API, build an instance of some `Params` class and pass it to the corresponding client method. When the response is received, it will be deserialized into an instance of a Kotlin class.\n\nFor example, `client.quotes().create(...)` should be called with an instance of `QuoteCreateParams`, and it will return an instance of `Quote`.\n\n## Immutability\n\nEach class in the SDK has an associated [builder](https://blogs.oracle.com/javamagazine/post/exploring-joshua-blochs-builder-design-pattern-in-java) or factory method for constructing it.\n\nEach class is [immutable](https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html) once constructed. If the class has an associated builder, then it has a `toBuilder()` method, which can be used to convert it back to a builder for making a modified copy.\n\nBecause each class is immutable, builder modification will _never_ affect already built class instances.\n\n## Asynchronous execution\n\nThe default client is synchronous. To switch to asynchronous execution, call the `async()` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridAgentAccessToken`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_AGENT_ACCESS_TOKEN`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.async().quotes().create(params)\n```\n\nOr create an asynchronous client from the beginning:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClientAsync\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClientAsync\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\n// Configures using the `lightsparkgrid.gridClientId`, `lightsparkgrid.gridClientSecret`, `lightsparkgrid.gridAgentAccessToken`, `lightsparkgrid.gridWebhookPubkey` and `lightsparkgrid.baseUrl` system properties\n// Or configures using the `GRID_CLIENT_ID`, `GRID_CLIENT_SECRET`, `GRID_AGENT_ACCESS_TOKEN`, `GRID_WEBHOOK_PUBKEY` and `LIGHTSPARK_GRID_BASE_URL` environment variables\nval client: LightsparkGridClientAsync = LightsparkGridOkHttpClientAsync.fromEnv()\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: Quote = client.quotes().create(params)\n```\n\nThe asynchronous client supports the same options as the synchronous one, except most methods are [suspending](https://kotlinlang.org/docs/coroutines-guide.html).\n\n\n\n## File uploads\n\nThe SDK defines methods that accept files.\n\nTo upload a file, pass a [`Path`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.nio.file.Paths\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(Paths.get("/path/to/file"))\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nOr an arbitrary [`InputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.net.URL\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(URL("https://example.com//path/to/file").openStream())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nOr a `ByteArray`:\n\n```kotlin\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file("content".toByteArray())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\nNote that when passing a non-`Path` its filename is unknown so it will not be included in the request. To manually set a filename, pass a [`MultipartField`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt):\n\n```kotlin\nimport com.lightspark.grid.core.MultipartField\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvParams\nimport com.lightspark.grid.models.customers.bulk.BulkUploadCsvResponse\nimport java.io.InputStream\nimport java.net.URL\n\nval params: BulkUploadCsvParams = BulkUploadCsvParams.builder()\n .file(MultipartField.builder()\n .value(URL("https://example.com//path/to/file").openStream())\n .filename("/path/to/file")\n .build())\n .build()\nval response: BulkUploadCsvResponse = client.customers().bulk().uploadCsv(params)\n```\n\n\n\n## Raw responses\n\nThe SDK defines methods that deserialize responses into instances of Kotlin classes. However, these methods don\'t provide access to the response headers, status code, or the raw response body.\n\nTo access this data, prefix any HTTP method call on a client or service with `withRawResponse()`:\n\n```kotlin\nimport com.lightspark.grid.core.http.Headers\nimport com.lightspark.grid.core.http.HttpResponseFor\nimport com.lightspark.grid.models.quotes.Quote\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(QuoteDestinationOneOf.AccountDestination.builder()\n .accountId("ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123")\n .build())\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\nval quote: HttpResponseFor = client.quotes().withRawResponse().create(params)\n\nval statusCode: Int = quote.statusCode()\nval headers: Headers = quote.headers()\n```\n\nYou can still deserialize the response into an instance of a Kotlin class if needed:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval parsedQuote: Quote = quote.parse()\n```\n\n## Error handling\n\nThe SDK throws custom unchecked exception types:\n\n- [`LightsparkGridServiceException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridServiceException.kt): Base class for HTTP errors. See this table for which exception subclass is thrown for each HTTP status code:\n\n | Status | Exception |\n | ------ | -------------------------------------------------- |\n | 400 | [`BadRequestException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/BadRequestException.kt) |\n | 401 | [`UnauthorizedException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnauthorizedException.kt) |\n | 403 | [`PermissionDeniedException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/PermissionDeniedException.kt) |\n | 404 | [`NotFoundException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/NotFoundException.kt) |\n | 422 | [`UnprocessableEntityException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnprocessableEntityException.kt) |\n | 429 | [`RateLimitException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/RateLimitException.kt) |\n | 5xx | [`InternalServerException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/InternalServerException.kt) |\n | others | [`UnexpectedStatusCodeException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/UnexpectedStatusCodeException.kt) |\n\n- [`LightsparkGridIoException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridIoException.kt): I/O networking errors.\n\n- [`LightsparkGridRetryableException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridRetryableException.kt): Generic error indicating a failure that could be retried by the client.\n\n- [`LightsparkGridInvalidDataException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridInvalidDataException.kt): Failure to interpret successfully parsed data. For example, when accessing a property that\'s supposed to be required, but the API unexpectedly omitted it from the response.\n\n- [`LightsparkGridException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridException.kt): Base class for all exceptions. Most errors will result in one of the previously mentioned ones, but completely generic errors may be thrown using the base class.\n\n## Pagination\n\nThe SDK defines methods that return a paginated lists of results. It provides convenient ways to access the results either one page at a time or item-by-item across all pages.\n\n### Auto-pagination\n\nTo iterate through all results across all pages, use the `autoPager()` method, which automatically fetches more pages as needed.\n\nWhen using the synchronous client, the method returns a [`Sequence`](https://kotlinlang.org/docs/sequences.html)\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPage\n\nval page: CustomerListPage = client.customers().list()\npage.autoPager()\n .take(50)\n .forEach { customer -> println(customer) }\n```\n\nWhen using the asynchronous client, the method returns a [`Flow`](https://kotlinlang.org/docs/flow.html):\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPageAsync\n\nval page: CustomerListPageAsync = client.async().customers().list()\npage.autoPager()\n .take(50)\n .forEach { customer -> println(customer) }\n```\n\n### Manual pagination\n\nTo access individual page items and manually request the next page, use the `items()`,\n`hasNextPage()`, and `nextPage()` methods:\n\n```kotlin\nimport com.lightspark.grid.models.customers.CustomerListPage\nimport com.lightspark.grid.models.customers.CustomerOneOf\n\nval page: CustomerListPage = client.customers().list()\nwhile (true) {\n for (customer in page.items()) {\n println(customer)\n }\n\n if (!page.hasNextPage()) {\n break\n }\n\n page = page.nextPage()\n}\n```\n\n## Logging\n\nThe SDK uses the standard [OkHttp logging interceptor](https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor).\n\nEnable logging by setting the `LIGHTSPARK_GRID_LOG` environment variable to `info`:\n\n```sh\nexport LIGHTSPARK_GRID_LOG=info\n```\n\nOr to `debug` for more verbose logging:\n\n```sh\nexport LIGHTSPARK_GRID_LOG=debug\n```\n\n## ProGuard and R8\n\nAlthough the SDK uses reflection, it is still usable with [ProGuard](https://github.com/Guardsquare/proguard) and [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization) because `lightspark-grid-kotlin-core` is published with a [configuration file](lightspark-grid-kotlin-core/src/main/resources/META-INF/proguard/lightspark-grid-kotlin-core.pro) containing [keep rules](https://www.guardsquare.com/manual/configuration/usage).\n\nProGuard and R8 should automatically detect and use the published rules, but you can also manually copy the keep rules if necessary.\n\n\n\n\n\n## Jackson\n\nThe SDK depends on [Jackson](https://github.com/FasterXML/jackson) for JSON serialization/deserialization. It is compatible with version 2.13.4 or higher, but depends on version 2.18.2 by default.\n\nThe SDK throws an exception if it detects an incompatible Jackson version at runtime (e.g. if the default version was overridden in your Maven or Gradle config).\n\nIf the SDK threw an exception, but you\'re _certain_ the version is compatible, then disable the version check using the `checkJacksonVersionCompatibility` on [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt).\n\n> [!CAUTION]\n> We make no guarantee that the SDK works correctly when the Jackson version check is disabled.\n\nAlso note that there are bugs in older Jackson versions that can affect the SDK. We don\'t work around all Jackson bugs ([example](https://github.com/FasterXML/jackson-databind/issues/3240)) and expect users to upgrade Jackson for those instead.\n\n## Network options\n\n### Retries\n\nThe SDK automatically retries 2 times by default, with a short exponential backoff between requests.\n\nOnly the following error types are retried:\n- Connection errors (for example, due to a network connectivity problem)\n- 408 Request Timeout\n- 409 Conflict\n- 429 Rate Limit\n- 5xx Internal\n\nThe API may also explicitly instruct the SDK to retry or not retry a request.\n\nTo set a custom number of retries, configure the client using the `maxRetries` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .maxRetries(4)\n .build()\n```\n\n### Timeouts\n\nRequests time out after 1 minute by default.\n\nTo set a custom timeout, configure the method call using the `timeout` method:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(\n params, RequestOptions.builder().timeout(Duration.ofSeconds(30)).build()\n)\n```\n\nOr configure the default for all method calls at the client level:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.time.Duration\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .timeout(Duration.ofSeconds(30))\n .build()\n```\n\n### Proxies\n\nTo route requests through a proxy, configure the client using the `proxy` method:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.net.InetSocketAddress\nimport java.net.Proxy\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .proxy(Proxy(\n Proxy.Type.HTTP, InetSocketAddress(\n "https://example.com", 8080\n )\n ))\n .build()\n```\n\nIf the proxy responds with `407 Proxy Authentication Required`, supply credentials by also configuring `proxyAuthenticator`:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport com.lightspark.grid.core.http.ProxyAuthenticator\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .proxy(...)\n // Or a custom implementation of `ProxyAuthenticator`.\n .proxyAuthenticator(ProxyAuthenticator.basic("username", "password"))\n .build()\n```\n\n### Connection pooling\n\nTo customize the underlying OkHttp connection pool, configure the client using the `maxIdleConnections` and `keepAliveDuration` methods:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\nimport java.time.Duration\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n // If `maxIdleConnections` is set, then `keepAliveDuration` must be set, and vice versa.\n .maxIdleConnections(10)\n .keepAliveDuration(Duration.ofMinutes(2))\n .build()\n```\n\nIf both options are unset, OkHttp\'s default connection pool settings are used.\n\n### HTTPS\n\n> [!NOTE]\n> Most applications should not call these methods, and instead use the system defaults. The defaults include\n> special optimizations that can be lost if the implementations are modified.\n\nTo configure how HTTPS connections are secured, configure the client using the `sslSocketFactory`, `trustManager`, and `hostnameVerifier` methods:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n // If `sslSocketFactory` is set, then `trustManager` must be set, and vice versa.\n .sslSocketFactory(yourSSLSocketFactory)\n .trustManager(yourTrustManager)\n .hostnameVerifier(yourHostnameVerifier)\n .build()\n```\n\n\n\n### Custom HTTP client\n\nThe SDK consists of three artifacts:\n- `lightspark-grid-kotlin-core`\n - Contains core SDK logic\n - Does not depend on [OkHttp](https://square.github.io/okhttp)\n - Exposes [`LightsparkGridClient`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClient.kt), [`LightsparkGridClientAsync`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsync.kt), [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt), and [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), all of which can work with any HTTP client\n- `lightspark-grid-kotlin-client-okhttp`\n - Depends on [OkHttp](https://square.github.io/okhttp)\n - Exposes [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) and [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), which provide a way to construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) and [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), respectively, using OkHttp\n- `lightspark-grid-kotlin`\n - Depends on and exposes the APIs of both `lightspark-grid-kotlin-core` and `lightspark-grid-kotlin-client-okhttp`\n - Does not have its own logic\n\nThis structure allows replacing the SDK\'s default HTTP client without pulling in unnecessary dependencies.\n\n#### Customized [`OkHttpClient`](https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html)\n\n> [!TIP]\n> Try the available [network options](#network-options) before replacing the default client.\n\nTo use a customized `OkHttpClient`:\n\n1. Replace your [`lightspark-grid-kotlin` dependency](#installation) with `lightspark-grid-kotlin-core`\n2. Copy `lightspark-grid-kotlin-client-okhttp`\'s [`OkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/OkHttpClient.kt) class into your code and customize it\n3. Construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) or [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), similarly to [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), using your customized client\n\n### Completely custom HTTP client\n\nTo use a completely custom HTTP client:\n\n1. Replace your [`lightspark-grid-kotlin` dependency](#installation) with `lightspark-grid-kotlin-core`\n2. Write a class that implements the [`HttpClient`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/http/HttpClient.kt) interface\n3. Construct [`LightsparkGridClientImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientImpl.kt) or [`LightsparkGridClientAsyncImpl`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/client/LightsparkGridClientAsyncImpl.kt), similarly to [`LightsparkGridOkHttpClient`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClient.kt) or [`LightsparkGridOkHttpClientAsync`](lightspark-grid-kotlin-client-okhttp/src/main/kotlin/com/lightspark/grid/client/okhttp/LightsparkGridOkHttpClientAsync.kt), using your new client class\n\n## Undocumented API functionality\n\nThe SDK is typed for convenient usage of the documented API. However, it also supports working with undocumented or not yet supported parts of the API.\n\n### Parameters\n\nTo set undocumented parameters, call the `putAdditionalHeader`, `putAdditionalQueryParam`, or `putAdditionalBodyProperty` methods on any `Params` class:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .putAdditionalHeader("Secret-Header", "42")\n .putAdditionalQueryParam("secret_query_param", "42")\n .putAdditionalBodyProperty("secretProperty", JsonValue.from("42"))\n .build()\n```\n\nThese can be accessed on the built object later using the `_additionalHeaders()`, `_additionalQueryParams()`, and `_additionalBodyProperties()` methods.\n\nTo set undocumented parameters on _nested_ headers, query params, or body classes, call the `putAdditionalProperty` method on the nested class:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.transferin.InternalAccountReference\nimport com.lightspark.grid.models.transferin.TransferInCreateParams\n\nval params: TransferInCreateParams = TransferInCreateParams.builder()\n .destination(InternalAccountReference.builder()\n .putAdditionalProperty("secretProperty", JsonValue.from("42"))\n .build())\n .build()\n```\n\nThese properties can be accessed on the nested built object later using the `_additionalProperties()` method.\n\nTo set a documented parameter or property to an undocumented or not yet supported _value_, pass a [`JsonValue`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt) object to its setter:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .destination(JsonValue.from(42))\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .build()\n```\n\nThe most straightforward way to create a [`JsonValue`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt) is using its `from(...)` method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonValue\n\n// Create primitive JSON values\nval nullValue: JsonValue = JsonValue.from(null)\nval booleanValue: JsonValue = JsonValue.from(true)\nval numberValue: JsonValue = JsonValue.from(42)\nval stringValue: JsonValue = JsonValue.from("Hello World!")\n\n// Create a JSON array value equivalent to `["Hello", "World"]`\nval arrayValue: JsonValue = JsonValue.from(listOf(\n "Hello", "World"\n))\n\n// Create a JSON object value equivalent to `{ "a": 1, "b": 2 }`\nval objectValue: JsonValue = JsonValue.from(mapOf(\n "a" to 1, "b" to 2\n))\n\n// Create an arbitrarily nested JSON equivalent to:\n// {\n// "a": [1, 2],\n// "b": [3, 4]\n// }\nval complexValue: JsonValue = JsonValue.from(mapOf(\n "a" to listOf(\n 1, 2\n ), "b" to listOf(\n 3, 4\n )\n))\n```\n\nNormally a `Builder` class\'s `build` method will throw [`IllegalStateException`](https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalStateException.html) if any required parameter or property is unset.\n\nTo forcibly omit a required parameter or property, pass [`JsonMissing`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/core/Values.kt):\n\n```kotlin\nimport com.lightspark.grid.core.JsonMissing\nimport com.lightspark.grid.models.quotes.QuoteCreateParams\nimport com.lightspark.grid.models.quotes.QuoteSourceOneOf\n\nval params: QuoteCreateParams = QuoteCreateParams.builder()\n .lockedCurrencyAmount(10000L)\n .lockedCurrencySide(QuoteCreateParams.LockedCurrencySide.SENDING)\n .source(QuoteSourceOneOf.AccountQuoteSource.builder()\n .accountId("InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965")\n .build())\n .destination(JsonMissing.of())\n .build()\n```\n\n### Response properties\n\nTo access undocumented response properties, call the `_additionalProperties()` method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonBoolean\nimport com.lightspark.grid.core.JsonNull\nimport com.lightspark.grid.core.JsonNumber\nimport com.lightspark.grid.core.JsonValue\n\nval additionalProperties: Map = client.quotes().create(params)._additionalProperties()\nval secretPropertyValue: JsonValue = additionalProperties.get("secretProperty")\n\nval result = when (secretPropertyValue) {\n is JsonNull -> "It\'s null!"\n is JsonBoolean -> "It\'s a boolean!"\n is JsonNumber -> "It\'s a number!"\n // Other types include `JsonMissing`, `JsonString`, `JsonArray`, and `JsonObject`\n else -> "It\'s something else!"\n}\n```\n\nTo access a property\'s raw JSON value, which may be undocumented, call its `_` prefixed method:\n\n```kotlin\nimport com.lightspark.grid.core.JsonField\nimport com.lightspark.grid.models.quotes.QuoteDestinationOneOf\n\nval destination: JsonField = client.quotes().create(params)._destination()\n\nif (destination.isMissing()) {\n // The property is absent from the JSON response\n} else if (destination.isNull()) {\n // The property was set to literal null\n} else {\n // Check if value was provided as a string\n // Other methods include `asNumber()`, `asBoolean()`, etc.\n val jsonString: String? = destination.asString();\n\n // Try to deserialize into a custom type\n val myObject: MyClass = destination.asUnknown()!!.convert(MyClass::class.java)\n}\n```\n\n### Response validation\n\nIn rare cases, the API may return a response that doesn\'t match the expected type. For example, the SDK may expect a property to contain a `String`, but the API could return something else.\n\nBy default, the SDK will not throw an exception in this case. It will throw [`LightsparkGridInvalidDataException`](lightspark-grid-kotlin-core/src/main/kotlin/com/lightspark/grid/errors/LightsparkGridInvalidDataException.kt) only if you directly access the property.\n\nValidating the response is _not_ forwards compatible with new types from the API for existing fields.\n\nIf you would still prefer to check that the response is completely well-typed upfront, then either call `validate()`:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(params).validate()\n```\n\nOr configure the method call to validate the response using the `responseValidation` method:\n\n```kotlin\nimport com.lightspark.grid.models.quotes.Quote\n\nval quote: Quote = client.quotes().create(\n params, RequestOptions.builder().responseValidation(true).build()\n)\n```\n\nOr configure the default for all method calls at the client level:\n\n```kotlin\nimport com.lightspark.grid.client.LightsparkGridClient\nimport com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient\n\nval client: LightsparkGridClient = LightsparkGridOkHttpClient.builder()\n .fromEnv()\n .responseValidation(true)\n .build()\n```\n\n## FAQ\n\n### Why don\'t you use plain `enum` classes?\n\nKotlin `enum` classes are not trivially [forwards compatible](https://www.stainless.com/blog/making-java-enums-forwards-compatible). Using them in the SDK could cause runtime exceptions if the API is updated to respond with a new enum value.\n\n### Why do you represent fields using `JsonField` instead of just plain `T`?\n\nUsing `JsonField` enables a few features:\n\n- Allowing usage of [undocumented API functionality](#undocumented-api-functionality)\n- Lazily [validating the API response against the expected shape](#response-validation)\n- Representing absent vs explicitly null values\n\n### Why don\'t you use [`data` classes](https://kotlinlang.org/docs/data-classes.html)?\n\nIt is not [backwards compatible to add new fields to a data class](https://kotlinlang.org/docs/api-guidelines-backward-compatibility.html#avoid-using-data-classes-in-your-api) and we don\'t want to introduce a breaking change every time we add a field to a class.\n\n### Why don\'t you use checked exceptions?\n\nChecked exceptions are widely considered a mistake in the Java programming language. In fact, they were omitted from Kotlin for this reason.\n\nChecked exceptions:\n\n- Are verbose to handle\n- Encourage error handling at the wrong level of abstraction, where nothing can be done about the error\n- Are tedious to propagate due to the [function coloring problem](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function)\n- Don\'t play well with lambdas (also due to the function coloring problem)\n\n## Semantic versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n2. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/lightsparkdev/grid-kotlin-sdk/issues) with questions, bugs, or suggestions.\n', }, { language: 'python', content: - '# Lightspark Grid Python API library\n\n\n[![PyPI version](https://img.shields.io/pypi/v/grid.svg?label=pypi%20(stable))](https://pypi.org/project/grid/)\n\nThe Lightspark Grid Python library provides convenient access to the Lightspark Grid REST API from any Python 3.9+\napplication. The library includes type definitions for all request params and response fields,\nand offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).\n\n\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwiWC1HcmlkLVNpZ25hdHVyZSI6Ik15IFdlYmhvb2sgU2lnbmF0dXJlIn19)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n## Documentation\n\n The full API of this library can be found in [api.md](api.md).\n\n## Installation\n\n```sh\n# install from this staging repo\npip install git+ssh://git@github.com/stainless-sdks/grid-python.git\n```\n> [!NOTE]\n> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install grid`\n\n## Usage\n\nThe full API of this library can be found in [api.md](api.md).\n\n```python\nimport os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\n\nquote = client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\nprint(quote.id)\n```\n\nWhile you can provide a `username` keyword argument,\nwe recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)\nto add `GRID_CLIENT_ID="My Username"` to your `.env` file\nso that your Username is not stored in source control.\n\n## Async usage\n\nSimply import `AsyncLightsparkGrid` instead of `LightsparkGrid` and use `await` with each API call:\n\n```python\nimport os\nimport asyncio\nfrom grid import AsyncLightsparkGrid\n\nclient = AsyncLightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\n\nasync def main() -> None:\n quote = await client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\n print(quote.id)\n\nasyncio.run(main())\n```\n\nFunctionality between the synchronous and asynchronous clients is otherwise identical.\n\n### With aiohttp\n\nBy default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.\n\nYou can enable this by installing `aiohttp`:\n\n```sh\n# install from this staging repo\npip install \'grid[aiohttp] @ git+ssh://git@github.com/stainless-sdks/grid-python.git\'\n```\n\nThen you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:\n\n```python\nimport os\nimport asyncio\nfrom grid import DefaultAioHttpClient\nfrom grid import AsyncLightsparkGrid\n\nasync def main() -> None:\n async with AsyncLightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n http_client=DefaultAioHttpClient(),\n) as client:\n quote = await client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\n print(quote.id)\n\nasyncio.run(main())\n```\n\n\n\n## Using types\n\nNested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:\n\n- Serializing back into JSON, `model.to_json()`\n- Converting to a dictionary, `model.to_dict()`\n\nTyped requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.\n\n## Pagination\n\nList methods in the Lightspark Grid API are paginated.\n\nThis library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:\n\n```python\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\nall_customers = []\n# Automatically fetches more pages as needed.\nfor customer in client.customers.list():\n # Do something with customer here\n all_customers.append(customer)\nprint(all_customers)\n```\n\nOr, asynchronously:\n\n```python\nimport asyncio\nfrom grid import AsyncLightsparkGrid\n\nclient = AsyncLightsparkGrid()\n\nasync def main() -> None:\n all_customers = []\n # Iterate through items across all pages, issuing requests as needed.\n async for customer in client.customers.list():\n all_customers.append(customer)\n print(all_customers)\n\nasyncio.run(main())\n```\n\nAlternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:\n\n```python\nfirst_page = await client.customers.list()\nif first_page.has_next_page():\n print(f"will fetch next page using these details: {first_page.next_page_info()}")\n next_page = await first_page.get_next_page()\n print(f"number of items we just fetched: {len(next_page.data)}")\n\n# Remove `await` for non-async usage.\n```\n\nOr just work directly with the returned data:\n\n```python\nfirst_page = await client.customers.list()\n\nprint(f"next page cursor: {first_page.next_cursor}") # => "next page cursor: ..."\nfor customer in first_page.data:\n print(customer)\n\n# Remove `await` for non-async usage.\n```\n\n## Nested params\n\nNested parameters are dictionaries, typed using `TypedDict`, for example:\n\n```python\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\ntransaction = client.transfer_in.create(\n destination={\n "account_id": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n source={\n "account_id": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n)\nprint(transaction.destination)\n```\n\n## File uploads\n\nRequest parameters that correspond to file uploads can be passed as `bytes`, or a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance or a tuple of `(filename, contents, media type)`.\n\n```python\nfrom pathlib import Path\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\nclient.customers.bulk.upload_csv(\n file=Path("/path/to/file"),\n)\n```\n\nThe async client uses the exact same interface. If you pass a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance, the file contents will be read asynchronously automatically.\n\n## Handling errors\n\nWhen the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `grid.APIConnectionError` is raised.\n\nWhen the API returns a non-success status code (that is, 4xx or 5xx\nresponse), a subclass of `grid.APIStatusError` is raised, containing `status_code` and `response` properties.\n\nAll errors inherit from `grid.APIError`.\n\n```python\nimport grid\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\ntry:\n client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\nexcept grid.APIConnectionError as e:\n print("The server could not be reached")\n print(e.__cause__) # an underlying Exception, likely raised within httpx.\nexcept grid.RateLimitError as e:\n print("A 429 status code was received; we should back off a bit.")\nexcept grid.APIStatusError as e:\n print("Another non-200-range status code was received")\n print(e.status_code)\n print(e.response)\n```\n\nError codes are as follows:\n\n| Status Code | Error Type |\n| ----------- | -------------------------- |\n| 400 | `BadRequestError` |\n| 401 | `AuthenticationError` |\n| 403 | `PermissionDeniedError` |\n| 404 | `NotFoundError` |\n| 422 | `UnprocessableEntityError` |\n| 429 | `RateLimitError` |\n| >=500 | `InternalServerError` |\n| N/A | `APIConnectionError` |\n\n### Retries\n\nCertain errors are automatically retried 2 times by default, with a short exponential backoff.\nConnection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,\n429 Rate Limit, and >=500 Internal errors are all retried by default.\n\nYou can use the `max_retries` option to configure or disable retry settings:\n\n```python\nfrom grid import LightsparkGrid\n\n# Configure the default for all requests:\nclient = LightsparkGrid(\n # default is 2\n max_retries=0,\n)\n\n# Or, configure per-request:\nclient.with_options(max_retries = 5).quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\n```\n\n### Timeouts\n\nBy default requests time out after 1 minute. You can configure this with a `timeout` option,\nwhich accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object:\n\n```python\nfrom grid import LightsparkGrid\n\n# Configure the default for all requests:\nclient = LightsparkGrid(\n # 20 seconds (default is 1 minute)\n timeout=20.0,\n)\n\n# More granular control:\nclient = LightsparkGrid(\n timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),\n)\n\n# Override per-request:\nclient.with_options(timeout = 5.0).quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\n```\n\nOn timeout, an `APITimeoutError` is thrown.\n\nNote that requests that time out are [retried twice by default](#retries).\n\n\n\n## Advanced\n\n### Logging\n\nWe use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.\n\nYou can enable logging by setting the environment variable `LIGHTSPARK_GRID_LOG` to `info`.\n\n```shell\n$ export LIGHTSPARK_GRID_LOG=info\n```\n\nOr to `debug` for more verbose logging.\n\n### How to tell whether `None` means `null` or missing\n\nIn an API response, a field may be explicitly `null`, or missing entirely; in either case, its value is `None` in this library. You can differentiate the two cases with `.model_fields_set`:\n\n```py\nif response.my_field is None:\n if \'my_field\' not in response.model_fields_set:\n print(\'Got json like {}, without a "my_field" key present at all.\')\n else:\n print(\'Got json like {"my_field": null}.\')\n```\n\n### Accessing raw response data (e.g. headers)\n\nThe "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,\n\n```py\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\nresponse = client.quotes.with_raw_response.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\nprint(response.headers.get(\'X-My-Header\'))\n\nquote = response.parse() # get the object that `quotes.create()` would have returned\nprint(quote.id)\n```\n\nThese methods return an [`APIResponse`](https://github.com/stainless-sdks/grid-python/tree/main/src/grid/_response.py) object.\n\nThe async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/grid-python/tree/main/src/grid/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.\n\n#### `.with_streaming_response`\n\nThe above interface eagerly reads the full response body when you make the request, which may not always be what you want.\n\nTo stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.\n\n```python\nwith client.quotes.with_streaming_response.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n) as response :\n print(response.headers.get(\'X-My-Header\'))\n\n for line in response.iter_lines():\n print(line)\n```\n\nThe context manager is required so that the response will reliably be closed.\n\n### Making custom/undocumented requests\n\nThis library is typed for convenient access to the documented API.\n\nIf you need to access undocumented endpoints, params, or response properties, the library can still be used.\n\n#### Undocumented endpoints\n\nTo make requests to undocumented endpoints, you can make requests using `client.get`, `client.post`, and other\nhttp verbs. Options on the client will be respected (such as retries) when making this request.\n\n```py\nimport httpx\n\nresponse = client.post(\n "/foo",\n cast_to=httpx.Response,\n body={"my_param": True},\n)\n\nprint(response.headers.get("x-foo"))\n```\n\n#### Undocumented request params\n\nIf you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request\noptions.\n\n#### Undocumented response properties\n\nTo access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You\ncan also get all the extra fields on the Pydantic model as a dict with\n[`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra).\n\n### Configuring the HTTP client\n\nYou can directly override the [httpx client](https://www.python-httpx.org/api/#client) to customize it for your use case, including:\n\n- Support for [proxies](https://www.python-httpx.org/advanced/proxies/)\n- Custom [transports](https://www.python-httpx.org/advanced/transports/)\n- Additional [advanced](https://www.python-httpx.org/advanced/clients/) functionality\n\n```python\nimport httpx\nfrom grid import LightsparkGrid, DefaultHttpxClient\n\nclient = LightsparkGrid(\n # Or use the `LIGHTSPARK_GRID_BASE_URL` env var\n base_url="http://my.test.server.example.com:8083",\n http_client=DefaultHttpxClient(proxy="http://my.test.proxy.example.com", transport=httpx.HTTPTransport(local_address="0.0.0.0")),\n)\n```\n\nYou can also customize the client on a per-request basis by using `with_options()`:\n\n```python\nclient.with_options(http_client=DefaultHttpxClient(...))\n```\n\n### Managing HTTP resources\n\nBy default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.\n\n```py\nfrom grid import LightsparkGrid\n\nwith LightsparkGrid() as client:\n # make requests here\n ...\n\n# HTTP client is now closed\n```\n\n## Versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes that only affect static types, without breaking runtime behavior.\n2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n3. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/grid-python/issues) with questions, bugs, or suggestions.\n\n### Determining the installed version\n\nIf you\'ve upgraded to the latest version but aren\'t seeing any new features you were expecting then your python environment is likely still using an older version.\n\nYou can determine the version that is being used at runtime with:\n\n```py\nimport grid\nprint(grid.__version__)\n```\n\n## Requirements\n\nPython 3.9 or higher.\n\n## Contributing\n\nSee [the contributing documentation](./CONTRIBUTING.md).\n', + '# Lightspark Grid Python API library\n\n\n[![PyPI version](https://img.shields.io/pypi/v/grid.svg?label=pypi%20(stable))](https://pypi.org/project/grid/)\n\nThe Lightspark Grid Python library provides convenient access to the Lightspark Grid REST API from any Python 3.9+\napplication. The library includes type definitions for all request params and response fields,\nand offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).\n\n\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwieC1ncmlkLWFnZW50LWFjY2Vzcy10b2tlbiI6Ik15IEFnZW50IEFjY2VzcyBUb2tlbiIsIlgtR3JpZC1TaWduYXR1cmUiOiJNeSBXZWJob29rIFNpZ25hdHVyZSJ9fQ)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22x-grid-agent-access-token%22%3A%22My%20Agent%20Access%20Token%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n## Documentation\n\n The full API of this library can be found in [api.md](api.md).\n\n## Installation\n\n```sh\n# install from this staging repo\npip install git+ssh://git@github.com/stainless-sdks/grid-python.git\n```\n> [!NOTE]\n> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install grid`\n\n## Usage\n\nThe full API of this library can be found in [api.md](api.md).\n\n```python\nimport os\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\n\nquote = client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\nprint(quote.id)\n```\n\nWhile you can provide a `username` keyword argument,\nwe recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)\nto add `GRID_CLIENT_ID="My Username"` to your `.env` file\nso that your Username is not stored in source control.\n\n## Async usage\n\nSimply import `AsyncLightsparkGrid` instead of `LightsparkGrid` and use `await` with each API call:\n\n```python\nimport os\nimport asyncio\nfrom grid import AsyncLightsparkGrid\n\nclient = AsyncLightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n)\n\nasync def main() -> None:\n quote = await client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\n print(quote.id)\n\nasyncio.run(main())\n```\n\nFunctionality between the synchronous and asynchronous clients is otherwise identical.\n\n### With aiohttp\n\nBy default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.\n\nYou can enable this by installing `aiohttp`:\n\n```sh\n# install from this staging repo\npip install \'grid[aiohttp] @ git+ssh://git@github.com/stainless-sdks/grid-python.git\'\n```\n\nThen you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:\n\n```python\nimport os\nimport asyncio\nfrom grid import DefaultAioHttpClient\nfrom grid import AsyncLightsparkGrid\n\nasync def main() -> None:\n async with AsyncLightsparkGrid(\n username=os.environ.get("GRID_CLIENT_ID"), # This is the default and can be omitted\n password=os.environ.get("GRID_CLIENT_SECRET"), # This is the default and can be omitted\n http_client=DefaultAioHttpClient(),\n) as client:\n quote = await client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\n print(quote.id)\n\nasyncio.run(main())\n```\n\n\n\n## Using types\n\nNested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:\n\n- Serializing back into JSON, `model.to_json()`\n- Converting to a dictionary, `model.to_dict()`\n\nTyped requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.\n\n## Pagination\n\nList methods in the Lightspark Grid API are paginated.\n\nThis library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:\n\n```python\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\nall_customers = []\n# Automatically fetches more pages as needed.\nfor customer in client.customers.list():\n # Do something with customer here\n all_customers.append(customer)\nprint(all_customers)\n```\n\nOr, asynchronously:\n\n```python\nimport asyncio\nfrom grid import AsyncLightsparkGrid\n\nclient = AsyncLightsparkGrid()\n\nasync def main() -> None:\n all_customers = []\n # Iterate through items across all pages, issuing requests as needed.\n async for customer in client.customers.list():\n all_customers.append(customer)\n print(all_customers)\n\nasyncio.run(main())\n```\n\nAlternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:\n\n```python\nfirst_page = await client.customers.list()\nif first_page.has_next_page():\n print(f"will fetch next page using these details: {first_page.next_page_info()}")\n next_page = await first_page.get_next_page()\n print(f"number of items we just fetched: {len(next_page.data)}")\n\n# Remove `await` for non-async usage.\n```\n\nOr just work directly with the returned data:\n\n```python\nfirst_page = await client.customers.list()\n\nprint(f"next page cursor: {first_page.next_cursor}") # => "next page cursor: ..."\nfor customer in first_page.data:\n print(customer)\n\n# Remove `await` for non-async usage.\n```\n\n## Nested params\n\nNested parameters are dictionaries, typed using `TypedDict`, for example:\n\n```python\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\ntransaction = client.transfer_in.create(\n destination={\n "account_id": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123"\n },\n source={\n "account_id": "ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965"\n },\n)\nprint(transaction.destination)\n```\n\n## File uploads\n\nRequest parameters that correspond to file uploads can be passed as `bytes`, or a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance or a tuple of `(filename, contents, media type)`.\n\n```python\nfrom pathlib import Path\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\nclient.customers.bulk.upload_csv(\n file=Path("/path/to/file"),\n)\n```\n\nThe async client uses the exact same interface. If you pass a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance, the file contents will be read asynchronously automatically.\n\n## Handling errors\n\nWhen the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `grid.APIConnectionError` is raised.\n\nWhen the API returns a non-success status code (that is, 4xx or 5xx\nresponse), a subclass of `grid.APIStatusError` is raised, containing `status_code` and `response` properties.\n\nAll errors inherit from `grid.APIError`.\n\n```python\nimport grid\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\n\ntry:\n client.quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n )\nexcept grid.APIConnectionError as e:\n print("The server could not be reached")\n print(e.__cause__) # an underlying Exception, likely raised within httpx.\nexcept grid.RateLimitError as e:\n print("A 429 status code was received; we should back off a bit.")\nexcept grid.APIStatusError as e:\n print("Another non-200-range status code was received")\n print(e.status_code)\n print(e.response)\n```\n\nError codes are as follows:\n\n| Status Code | Error Type |\n| ----------- | -------------------------- |\n| 400 | `BadRequestError` |\n| 401 | `AuthenticationError` |\n| 403 | `PermissionDeniedError` |\n| 404 | `NotFoundError` |\n| 422 | `UnprocessableEntityError` |\n| 429 | `RateLimitError` |\n| >=500 | `InternalServerError` |\n| N/A | `APIConnectionError` |\n\n### Retries\n\nCertain errors are automatically retried 2 times by default, with a short exponential backoff.\nConnection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,\n429 Rate Limit, and >=500 Internal errors are all retried by default.\n\nYou can use the `max_retries` option to configure or disable retry settings:\n\n```python\nfrom grid import LightsparkGrid\n\n# Configure the default for all requests:\nclient = LightsparkGrid(\n # default is 2\n max_retries=0,\n)\n\n# Or, configure per-request:\nclient.with_options(max_retries = 5).quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\n```\n\n### Timeouts\n\nBy default requests time out after 1 minute. You can configure this with a `timeout` option,\nwhich accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object:\n\n```python\nfrom grid import LightsparkGrid\n\n# Configure the default for all requests:\nclient = LightsparkGrid(\n # 20 seconds (default is 1 minute)\n timeout=20.0,\n)\n\n# More granular control:\nclient = LightsparkGrid(\n timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),\n)\n\n# Override per-request:\nclient.with_options(timeout = 5.0).quotes.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\n```\n\nOn timeout, an `APITimeoutError` is thrown.\n\nNote that requests that time out are [retried twice by default](#retries).\n\n\n\n## Advanced\n\n### Logging\n\nWe use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.\n\nYou can enable logging by setting the environment variable `LIGHTSPARK_GRID_LOG` to `info`.\n\n```shell\n$ export LIGHTSPARK_GRID_LOG=info\n```\n\nOr to `debug` for more verbose logging.\n\n### How to tell whether `None` means `null` or missing\n\nIn an API response, a field may be explicitly `null`, or missing entirely; in either case, its value is `None` in this library. You can differentiate the two cases with `.model_fields_set`:\n\n```py\nif response.my_field is None:\n if \'my_field\' not in response.model_fields_set:\n print(\'Got json like {}, without a "my_field" key present at all.\')\n else:\n print(\'Got json like {"my_field": null}.\')\n```\n\n### Accessing raw response data (e.g. headers)\n\nThe "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,\n\n```py\nfrom grid import LightsparkGrid\n\nclient = LightsparkGrid()\nresponse = client.quotes.with_raw_response.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n)\nprint(response.headers.get(\'X-My-Header\'))\n\nquote = response.parse() # get the object that `quotes.create()` would have returned\nprint(quote.id)\n```\n\nThese methods return an [`APIResponse`](https://github.com/stainless-sdks/grid-python/tree/main/src/grid/_response.py) object.\n\nThe async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/grid-python/tree/main/src/grid/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.\n\n#### `.with_streaming_response`\n\nThe above interface eagerly reads the full response body when you make the request, which may not always be what you want.\n\nTo stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.\n\n```python\nwith client.quotes.with_streaming_response.create(\n destination={\n "destination_type": "ACCOUNT",\n "account_id": "ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",\n },\n locked_currency_amount=10000,\n locked_currency_side="SENDING",\n source={\n "source_type": "ACCOUNT",\n "account_id": "InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965",\n },\n) as response :\n print(response.headers.get(\'X-My-Header\'))\n\n for line in response.iter_lines():\n print(line)\n```\n\nThe context manager is required so that the response will reliably be closed.\n\n### Making custom/undocumented requests\n\nThis library is typed for convenient access to the documented API.\n\nIf you need to access undocumented endpoints, params, or response properties, the library can still be used.\n\n#### Undocumented endpoints\n\nTo make requests to undocumented endpoints, you can make requests using `client.get`, `client.post`, and other\nhttp verbs. Options on the client will be respected (such as retries) when making this request.\n\n```py\nimport httpx\n\nresponse = client.post(\n "/foo",\n cast_to=httpx.Response,\n body={"my_param": True},\n)\n\nprint(response.headers.get("x-foo"))\n```\n\n#### Undocumented request params\n\nIf you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request\noptions.\n\n#### Undocumented response properties\n\nTo access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You\ncan also get all the extra fields on the Pydantic model as a dict with\n[`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra).\n\n### Configuring the HTTP client\n\nYou can directly override the [httpx client](https://www.python-httpx.org/api/#client) to customize it for your use case, including:\n\n- Support for [proxies](https://www.python-httpx.org/advanced/proxies/)\n- Custom [transports](https://www.python-httpx.org/advanced/transports/)\n- Additional [advanced](https://www.python-httpx.org/advanced/clients/) functionality\n\n```python\nimport httpx\nfrom grid import LightsparkGrid, DefaultHttpxClient\n\nclient = LightsparkGrid(\n # Or use the `LIGHTSPARK_GRID_BASE_URL` env var\n base_url="http://my.test.server.example.com:8083",\n http_client=DefaultHttpxClient(proxy="http://my.test.proxy.example.com", transport=httpx.HTTPTransport(local_address="0.0.0.0")),\n)\n```\n\nYou can also customize the client on a per-request basis by using `with_options()`:\n\n```python\nclient.with_options(http_client=DefaultHttpxClient(...))\n```\n\n### Managing HTTP resources\n\nBy default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.\n\n```py\nfrom grid import LightsparkGrid\n\nwith LightsparkGrid() as client:\n # make requests here\n ...\n\n# HTTP client is now closed\n```\n\n## Versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes that only affect static types, without breaking runtime behavior.\n2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n3. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/grid-python/issues) with questions, bugs, or suggestions.\n\n### Determining the installed version\n\nIf you\'ve upgraded to the latest version but aren\'t seeing any new features you were expecting then your python environment is likely still using an older version.\n\nYou can determine the version that is being used at runtime with:\n\n```py\nimport grid\nprint(grid.__version__)\n```\n\n## Requirements\n\nPython 3.9 or higher.\n\n## Contributing\n\nSee [the contributing documentation](./CONTRIBUTING.md).\n', }, { language: 'typescript', content: - "# Lightspark Grid TypeScript API Library\n\n[![NPM version](https://img.shields.io/npm/v/@lightsparkdev/grid.svg?label=npm%20(stable))](https://npmjs.org/package/@lightsparkdev/grid) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@lightsparkdev/grid) [![JSR Version](https://jsr.io/badges/@lightsparkdev/grid)](https://jsr.io/@lightsparkdev/grid)\n\nThis library provides convenient access to the Lightspark Grid REST API from server-side TypeScript or JavaScript.\n\n\n\nThe full API of this library can be found in [api.md](api.md).\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwiWC1HcmlkLVNpZ25hdHVyZSI6Ik15IFdlYmhvb2sgU2lnbmF0dXJlIn19)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n## Installation\n\n```sh\nnpm install @lightsparkdev/grid\n```\n\n### Installation from JSR\n\n```sh\ndeno add jsr:@lightsparkdev/grid\nnpx jsr add @lightsparkdev/grid\n```\n\nThese commands will make the module importable from the `@lightsparkdev/grid` scope:\n\nYou can also [import directly from JSR](https://jsr.io/docs/using-packages#importing-with-jsr-specifiers) without an install step if you're using the Deno JavaScript runtime:\n\n```ts\nimport LightsparkGrid from 'jsr:@lightsparkdev/grid';\n```\n\n## Usage\n\nThe full API of this library can be found in [api.md](api.md).\n\n\n```js\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst quote = await client.quotes.create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n});\n\nconsole.log(quote.id);\n```\n\n\n\n### Request & Response types\n\nThis library includes TypeScript definitions for all request params and response fields. You may import and use them like so:\n\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst params: LightsparkGrid.QuoteCreateParams = {\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n};\nconst quote: LightsparkGrid.Quote = await client.quotes.create(params);\n```\n\nDocumentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.\n\n## File uploads\n\nRequest parameters that correspond to file uploads can be passed in many different forms:\n- `File` (or an object with the same structure)\n- a `fetch` `Response` (or an object with the same structure)\n- an `fs.ReadStream`\n- the return value of our `toFile` helper\n\n```ts\nimport fs from 'fs';\nimport LightsparkGrid, { toFile } from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// If you have access to Node `fs` we recommend using `fs.createReadStream()`:\nawait client.customers.bulk.uploadCsv({ file: fs.createReadStream('/path/to/file') });\n\n// Or if you have the web `File` API you can pass a `File` instance:\nawait client.customers.bulk.uploadCsv({ file: new File(['my bytes'], 'file') });\n\n// You can also pass a `fetch` `Response`:\nawait client.customers.bulk.uploadCsv({ file: await fetch('https://somesite/file') });\n\n// Finally, if none of the above are convenient, you can use our `toFile` helper:\nawait client.customers.bulk.uploadCsv({ file: await toFile(Buffer.from('my bytes'), 'file') });\nawait client.customers.bulk.uploadCsv({ file: await toFile(new Uint8Array([0, 1, 2]), 'file') });\n```\n\n\n\n## Handling errors\n\nWhen the library is unable to connect to the API,\nor if the API returns a non-success status code (i.e., 4xx or 5xx response),\na subclass of `APIError` will be thrown:\n\n\n```ts\nconst quote = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .catch(async (err) => {\n if (err instanceof LightsparkGrid.APIError) {\n console.log(err.status); // 400\n console.log(err.name); // BadRequestError\n console.log(err.headers); // {server: 'nginx', ...}\n } else {\n throw err;\n }\n });\n```\n\nError codes are as follows:\n\n| Status Code | Error Type |\n| ----------- | -------------------------- |\n| 400 | `BadRequestError` |\n| 401 | `AuthenticationError` |\n| 403 | `PermissionDeniedError` |\n| 404 | `NotFoundError` |\n| 422 | `UnprocessableEntityError` |\n| 429 | `RateLimitError` |\n| >=500 | `InternalServerError` |\n| N/A | `APIConnectionError` |\n\n### Retries\n\nCertain errors will be automatically retried 2 times by default, with a short exponential backoff.\nConnection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,\n429 Rate Limit, and >=500 Internal errors will all be retried by default.\n\nYou can use the `maxRetries` option to configure or disable this:\n\n\n```js\n// Configure the default for all requests:\nconst client = new LightsparkGrid({\n maxRetries: 0, // default is 2\n});\n\n// Or, configure per-request:\nawait client.quotes.create({\n destination: { destinationType: 'ACCOUNT', accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { sourceType: 'ACCOUNT', accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n}, {\n maxRetries: 5,\n});\n```\n\n### Timeouts\n\nRequests time out after 1 minute by default. You can configure this with a `timeout` option:\n\n\n```ts\n// Configure the default for all requests:\nconst client = new LightsparkGrid({\n timeout: 20 * 1000, // 20 seconds (default is 1 minute)\n});\n\n// Override per-request:\nawait client.quotes.create({\n destination: { destinationType: 'ACCOUNT', accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { sourceType: 'ACCOUNT', accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n}, {\n timeout: 5 * 1000,\n});\n```\n\nOn timeout, an `APIConnectionTimeoutError` is thrown.\n\nNote that requests which time out will be [retried twice by default](#retries).\n\n## Auto-pagination\n\nList methods in the LightsparkGrid API are paginated.\nYou can use the `for await … of` syntax to iterate through items across all pages:\n\n```ts\nasync function fetchAllCustomerOneoves(params) {\n const allCustomerOneoves = [];\n // Automatically fetches more pages as needed.\n for await (const customerOneOf of client.customers.list()) {\n allCustomerOneoves.push(customerOneOf);\n }\n return allCustomerOneoves;\n}\n```\n\nAlternatively, you can request a single page at a time:\n\n```ts\nlet page = await client.customers.list();\nfor (const customerOneOf of page.data) {\n console.log(customerOneOf);\n}\n\n// Convenience methods are provided for manually paginating:\nwhile (page.hasNextPage()) {\n page = await page.getNextPage();\n // ...\n}\n```\n\n\n\n## Advanced Usage\n\n### Accessing raw Response data (e.g., headers)\n\nThe \"raw\" `Response` returned by `fetch()` can be accessed through the `.asResponse()` method on the `APIPromise` type that all methods return.\nThis method returns as soon as the headers for a successful response are received and does not consume the response body, so you are free to write custom parsing or streaming logic.\n\nYou can also use the `.withResponse()` method to get the raw `Response` along with the parsed data.\nUnlike `.asResponse()` this method consumes the body, returning once it is parsed.\n\n\n```ts\nconst client = new LightsparkGrid();\n\nconst response = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .asResponse();\nconsole.log(response.headers.get('X-My-Header'));\nconsole.log(response.statusText); // access the underlying Response object\n\nconst { data: quote, response: raw } = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .withResponse();\nconsole.log(raw.headers.get('X-My-Header'));\nconsole.log(quote.id);\n```\n\n### Logging\n\n> [!IMPORTANT]\n> All log messages are intended for debugging only. The format and content of log messages\n> may change between releases.\n\n#### Log levels\n\nThe log level can be configured in two ways:\n\n1. Via the `LIGHTSPARK_GRID_LOG` environment variable\n2. Using the `logLevel` client option (overrides the environment variable if set)\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n logLevel: 'debug', // Show all log messages\n});\n```\n\nAvailable log levels, from most to least verbose:\n\n- `'debug'` - Show debug messages, info, warnings, and errors\n- `'info'` - Show info messages, warnings, and errors\n- `'warn'` - Show warnings and errors (default)\n- `'error'` - Show only errors\n- `'off'` - Disable all logging\n\nAt the `'debug'` level, all HTTP requests and responses are logged, including headers and bodies.\nSome authentication-related headers are redacted, but sensitive data in request and response bodies\nmay still be visible.\n\n#### Custom logger\n\nBy default, this library logs to `globalThis.console`. You can also provide a custom logger.\nMost logging libraries are supported, including [pino](https://www.npmjs.com/package/pino), [winston](https://www.npmjs.com/package/winston), [bunyan](https://www.npmjs.com/package/bunyan), [consola](https://www.npmjs.com/package/consola), [signale](https://www.npmjs.com/package/signale), and [@std/log](https://jsr.io/@std/log). If your logger doesn't work, please open an issue.\n\nWhen providing a custom logger, the `logLevel` option still controls which messages are emitted, messages\nbelow the configured level will not be sent to your logger.\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport pino from 'pino';\n\nconst logger = pino();\n\nconst client = new LightsparkGrid({\n logger: logger.child({ name: 'LightsparkGrid' }),\n logLevel: 'debug', // Send all messages to pino, allowing it to filter\n});\n```\n\n### Making custom/undocumented requests\n\nThis library is typed for convenient access to the documented API. If you need to access undocumented\nendpoints, params, or response properties, the library can still be used.\n\n#### Undocumented endpoints\n\nTo make requests to undocumented endpoints, you can use `client.get`, `client.post`, and other HTTP verbs.\nOptions on the client, such as retries, will be respected when making these requests.\n\n```ts\nawait client.post('/some/path', {\n body: { some_prop: 'foo' },\n query: { some_query_arg: 'bar' },\n});\n```\n\n#### Undocumented request params\n\nTo make requests using undocumented parameters, you may use `// @ts-expect-error` on the undocumented\nparameter. This library doesn't validate at runtime that the request matches the type, so any extra values you\nsend will be sent as-is.\n\n```ts\nclient.quotes.create({\n // ...\n // @ts-expect-error baz is not yet public\n baz: 'undocumented option',\n});\n```\n\nFor requests with the `GET` verb, any extra params will be in the query, all other requests will send the\nextra param in the body.\n\nIf you want to explicitly send an extra argument, you can do so with the `query`, `body`, and `headers` request\noptions.\n\n#### Undocumented response properties\n\nTo access undocumented response properties, you may access the response object with `// @ts-expect-error` on\nthe response object, or cast the response object to the requisite type. Like the request params, we do not\nvalidate or strip extra properties from the response from the API.\n\n### Customizing the fetch client\n\nBy default, this library expects a global `fetch` function is defined.\n\nIf you want to use a different `fetch` function, you can either polyfill the global:\n\n```ts\nimport fetch from 'my-fetch';\n\nglobalThis.fetch = fetch;\n```\n\nOr pass it to the client:\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport fetch from 'my-fetch';\n\nconst client = new LightsparkGrid({ fetch });\n```\n\n### Fetch options\n\nIf you want to set custom `fetch` options without overriding the `fetch` function, you can provide a `fetchOptions` object when instantiating the client or making a request. (Request-specific options override client options.)\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n fetchOptions: {\n // `RequestInit` options\n },\n});\n```\n\n#### Configuring proxies\n\nTo modify proxy behavior, you can provide custom `fetchOptions` that add runtime-specific proxy\noptions to requests:\n\n **Node** [[docs](https://github.com/nodejs/undici/blob/main/docs/docs/api/ProxyAgent.md#example---proxyagent-with-fetch)]\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport * as undici from 'undici';\n\nconst proxyAgent = new undici.ProxyAgent('http://localhost:8888');\nconst client = new LightsparkGrid({\n fetchOptions: {\n dispatcher: proxyAgent,\n },\n});\n```\n\n **Bun** [[docs](https://bun.sh/guides/http/proxy)]\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n fetchOptions: {\n proxy: 'http://localhost:8888',\n },\n});\n```\n\n **Deno** [[docs](https://docs.deno.com/api/deno/~/Deno.createHttpClient)]\n\n```ts\nimport LightsparkGrid from 'jsr:@lightsparkdev/grid';\n\nconst httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } });\nconst client = new LightsparkGrid({\n fetchOptions: {\n client: httpClient,\n },\n});\n```\n\n## Frequently Asked Questions\n\n## Semantic versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes that only affect static types, without breaking runtime behavior.\n2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n3. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/lightsparkdev/grid-js-sdk/issues) with questions, bugs, or suggestions.\n\n## Requirements\n\nTypeScript >= 4.9 is supported.\n\nThe following runtimes are supported:\n\n- Web browsers (Up-to-date Chrome, Firefox, Safari, Edge, and more)\n- Node.js 20 LTS or later ([non-EOL](https://endoflife.date/nodejs)) versions.\n- Deno v1.28.0 or higher.\n- Bun 1.0 or later.\n- Cloudflare Workers.\n- Vercel Edge Runtime.\n- Jest 28 or greater with the `\"node\"` environment (`\"jsdom\"` is not supported at this time).\n- Nitro v2.6 or greater.\n\nNote that React Native is not supported at this time.\n\nIf you are interested in other runtime environments, please open or upvote an issue on GitHub.\n\n## Contributing\n\nSee [the contributing documentation](./CONTRIBUTING.md).\n", + "# Lightspark Grid TypeScript API Library\n\n[![NPM version](https://img.shields.io/npm/v/@lightsparkdev/grid.svg?label=npm%20(stable))](https://npmjs.org/package/@lightsparkdev/grid) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@lightsparkdev/grid) [![JSR Version](https://jsr.io/badges/@lightsparkdev/grid)](https://jsr.io/@lightsparkdev/grid)\n\nThis library provides convenient access to the Lightspark Grid REST API from server-side TypeScript or JavaScript.\n\n\n\nThe full API of this library can be found in [api.md](api.md).\n\nIt is generated with [Stainless](https://www.stainless.com/).\n\n## MCP Server\n\nUse the Lightspark Grid MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=%40lightsparkdev%2Fgrid-mcp&config=eyJuYW1lIjoiQGxpZ2h0c3BhcmtkZXYvZ3JpZC1tY3AiLCJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9ncmlkLW1jcC5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWdyaWQtY2xpZW50LWlkIjoiTXkgVXNlcm5hbWUiLCJ4LWdyaWQtY2xpZW50LXNlY3JldCI6Ik15IFBhc3N3b3JkIiwieC1ncmlkLWFnZW50LWFjY2Vzcy10b2tlbiI6Ik15IEFnZW50IEFjY2VzcyBUb2tlbiIsIlgtR3JpZC1TaWduYXR1cmUiOiJNeSBXZWJob29rIFNpZ25hdHVyZSJ9fQ)\n[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40lightsparkdev%2Fgrid-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fgrid-mcp.stlmcp.com%22%2C%22headers%22%3A%7B%22x-grid-client-id%22%3A%22My%20Username%22%2C%22x-grid-client-secret%22%3A%22My%20Password%22%2C%22x-grid-agent-access-token%22%3A%22My%20Agent%20Access%20Token%22%2C%22X-Grid-Signature%22%3A%22My%20Webhook%20Signature%22%7D%7D)\n\n> Note: You may need to set environment variables in your MCP client.\n\n## Installation\n\n```sh\nnpm install @lightsparkdev/grid\n```\n\n### Installation from JSR\n\n```sh\ndeno add jsr:@lightsparkdev/grid\nnpx jsr add @lightsparkdev/grid\n```\n\nThese commands will make the module importable from the `@lightsparkdev/grid` scope:\n\nYou can also [import directly from JSR](https://jsr.io/docs/using-packages#importing-with-jsr-specifiers) without an install step if you're using the Deno JavaScript runtime:\n\n```ts\nimport LightsparkGrid from 'jsr:@lightsparkdev/grid';\n```\n\n## Usage\n\nThe full API of this library can be found in [api.md](api.md).\n\n\n```js\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst quote = await client.quotes.create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n});\n\nconsole.log(quote.id);\n```\n\n\n\n### Request & Response types\n\nThis library includes TypeScript definitions for all request params and response fields. You may import and use them like so:\n\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted\n password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted\n});\n\nconst params: LightsparkGrid.QuoteCreateParams = {\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n};\nconst quote: LightsparkGrid.Quote = await client.quotes.create(params);\n```\n\nDocumentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.\n\n## File uploads\n\nRequest parameters that correspond to file uploads can be passed in many different forms:\n- `File` (or an object with the same structure)\n- a `fetch` `Response` (or an object with the same structure)\n- an `fs.ReadStream`\n- the return value of our `toFile` helper\n\n```ts\nimport fs from 'fs';\nimport LightsparkGrid, { toFile } from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid();\n\n// If you have access to Node `fs` we recommend using `fs.createReadStream()`:\nawait client.customers.bulk.uploadCsv({ file: fs.createReadStream('/path/to/file') });\n\n// Or if you have the web `File` API you can pass a `File` instance:\nawait client.customers.bulk.uploadCsv({ file: new File(['my bytes'], 'file') });\n\n// You can also pass a `fetch` `Response`:\nawait client.customers.bulk.uploadCsv({ file: await fetch('https://somesite/file') });\n\n// Finally, if none of the above are convenient, you can use our `toFile` helper:\nawait client.customers.bulk.uploadCsv({ file: await toFile(Buffer.from('my bytes'), 'file') });\nawait client.customers.bulk.uploadCsv({ file: await toFile(new Uint8Array([0, 1, 2]), 'file') });\n```\n\n\n\n## Handling errors\n\nWhen the library is unable to connect to the API,\nor if the API returns a non-success status code (i.e., 4xx or 5xx response),\na subclass of `APIError` will be thrown:\n\n\n```ts\nconst quote = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .catch(async (err) => {\n if (err instanceof LightsparkGrid.APIError) {\n console.log(err.status); // 400\n console.log(err.name); // BadRequestError\n console.log(err.headers); // {server: 'nginx', ...}\n } else {\n throw err;\n }\n });\n```\n\nError codes are as follows:\n\n| Status Code | Error Type |\n| ----------- | -------------------------- |\n| 400 | `BadRequestError` |\n| 401 | `AuthenticationError` |\n| 403 | `PermissionDeniedError` |\n| 404 | `NotFoundError` |\n| 422 | `UnprocessableEntityError` |\n| 429 | `RateLimitError` |\n| >=500 | `InternalServerError` |\n| N/A | `APIConnectionError` |\n\n### Retries\n\nCertain errors will be automatically retried 2 times by default, with a short exponential backoff.\nConnection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,\n429 Rate Limit, and >=500 Internal errors will all be retried by default.\n\nYou can use the `maxRetries` option to configure or disable this:\n\n\n```js\n// Configure the default for all requests:\nconst client = new LightsparkGrid({\n maxRetries: 0, // default is 2\n});\n\n// Or, configure per-request:\nawait client.quotes.create({\n destination: { destinationType: 'ACCOUNT', accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { sourceType: 'ACCOUNT', accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n}, {\n maxRetries: 5,\n});\n```\n\n### Timeouts\n\nRequests time out after 1 minute by default. You can configure this with a `timeout` option:\n\n\n```ts\n// Configure the default for all requests:\nconst client = new LightsparkGrid({\n timeout: 20 * 1000, // 20 seconds (default is 1 minute)\n});\n\n// Override per-request:\nawait client.quotes.create({\n destination: { destinationType: 'ACCOUNT', accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: { sourceType: 'ACCOUNT', accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' },\n}, {\n timeout: 5 * 1000,\n});\n```\n\nOn timeout, an `APIConnectionTimeoutError` is thrown.\n\nNote that requests which time out will be [retried twice by default](#retries).\n\n## Auto-pagination\n\nList methods in the LightsparkGrid API are paginated.\nYou can use the `for await … of` syntax to iterate through items across all pages:\n\n```ts\nasync function fetchAllCustomerOneoves(params) {\n const allCustomerOneoves = [];\n // Automatically fetches more pages as needed.\n for await (const customerOneOf of client.customers.list()) {\n allCustomerOneoves.push(customerOneOf);\n }\n return allCustomerOneoves;\n}\n```\n\nAlternatively, you can request a single page at a time:\n\n```ts\nlet page = await client.customers.list();\nfor (const customerOneOf of page.data) {\n console.log(customerOneOf);\n}\n\n// Convenience methods are provided for manually paginating:\nwhile (page.hasNextPage()) {\n page = await page.getNextPage();\n // ...\n}\n```\n\n\n\n## Advanced Usage\n\n### Accessing raw Response data (e.g., headers)\n\nThe \"raw\" `Response` returned by `fetch()` can be accessed through the `.asResponse()` method on the `APIPromise` type that all methods return.\nThis method returns as soon as the headers for a successful response are received and does not consume the response body, so you are free to write custom parsing or streaming logic.\n\nYou can also use the `.withResponse()` method to get the raw `Response` along with the parsed data.\nUnlike `.asResponse()` this method consumes the body, returning once it is parsed.\n\n\n```ts\nconst client = new LightsparkGrid();\n\nconst response = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .asResponse();\nconsole.log(response.headers.get('X-My-Header'));\nconsole.log(response.statusText); // access the underlying Response object\n\nconst { data: quote, response: raw } = await client.quotes\n .create({\n destination: {\n destinationType: 'ACCOUNT',\n accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123',\n },\n lockedCurrencyAmount: 10000,\n lockedCurrencySide: 'SENDING',\n source: {\n sourceType: 'ACCOUNT',\n accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965',\n },\n })\n .withResponse();\nconsole.log(raw.headers.get('X-My-Header'));\nconsole.log(quote.id);\n```\n\n### Logging\n\n> [!IMPORTANT]\n> All log messages are intended for debugging only. The format and content of log messages\n> may change between releases.\n\n#### Log levels\n\nThe log level can be configured in two ways:\n\n1. Via the `LIGHTSPARK_GRID_LOG` environment variable\n2. Using the `logLevel` client option (overrides the environment variable if set)\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n logLevel: 'debug', // Show all log messages\n});\n```\n\nAvailable log levels, from most to least verbose:\n\n- `'debug'` - Show debug messages, info, warnings, and errors\n- `'info'` - Show info messages, warnings, and errors\n- `'warn'` - Show warnings and errors (default)\n- `'error'` - Show only errors\n- `'off'` - Disable all logging\n\nAt the `'debug'` level, all HTTP requests and responses are logged, including headers and bodies.\nSome authentication-related headers are redacted, but sensitive data in request and response bodies\nmay still be visible.\n\n#### Custom logger\n\nBy default, this library logs to `globalThis.console`. You can also provide a custom logger.\nMost logging libraries are supported, including [pino](https://www.npmjs.com/package/pino), [winston](https://www.npmjs.com/package/winston), [bunyan](https://www.npmjs.com/package/bunyan), [consola](https://www.npmjs.com/package/consola), [signale](https://www.npmjs.com/package/signale), and [@std/log](https://jsr.io/@std/log). If your logger doesn't work, please open an issue.\n\nWhen providing a custom logger, the `logLevel` option still controls which messages are emitted, messages\nbelow the configured level will not be sent to your logger.\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport pino from 'pino';\n\nconst logger = pino();\n\nconst client = new LightsparkGrid({\n logger: logger.child({ name: 'LightsparkGrid' }),\n logLevel: 'debug', // Send all messages to pino, allowing it to filter\n});\n```\n\n### Making custom/undocumented requests\n\nThis library is typed for convenient access to the documented API. If you need to access undocumented\nendpoints, params, or response properties, the library can still be used.\n\n#### Undocumented endpoints\n\nTo make requests to undocumented endpoints, you can use `client.get`, `client.post`, and other HTTP verbs.\nOptions on the client, such as retries, will be respected when making these requests.\n\n```ts\nawait client.post('/some/path', {\n body: { some_prop: 'foo' },\n query: { some_query_arg: 'bar' },\n});\n```\n\n#### Undocumented request params\n\nTo make requests using undocumented parameters, you may use `// @ts-expect-error` on the undocumented\nparameter. This library doesn't validate at runtime that the request matches the type, so any extra values you\nsend will be sent as-is.\n\n```ts\nclient.quotes.create({\n // ...\n // @ts-expect-error baz is not yet public\n baz: 'undocumented option',\n});\n```\n\nFor requests with the `GET` verb, any extra params will be in the query, all other requests will send the\nextra param in the body.\n\nIf you want to explicitly send an extra argument, you can do so with the `query`, `body`, and `headers` request\noptions.\n\n#### Undocumented response properties\n\nTo access undocumented response properties, you may access the response object with `// @ts-expect-error` on\nthe response object, or cast the response object to the requisite type. Like the request params, we do not\nvalidate or strip extra properties from the response from the API.\n\n### Customizing the fetch client\n\nBy default, this library expects a global `fetch` function is defined.\n\nIf you want to use a different `fetch` function, you can either polyfill the global:\n\n```ts\nimport fetch from 'my-fetch';\n\nglobalThis.fetch = fetch;\n```\n\nOr pass it to the client:\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport fetch from 'my-fetch';\n\nconst client = new LightsparkGrid({ fetch });\n```\n\n### Fetch options\n\nIf you want to set custom `fetch` options without overriding the `fetch` function, you can provide a `fetchOptions` object when instantiating the client or making a request. (Request-specific options override client options.)\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n fetchOptions: {\n // `RequestInit` options\n },\n});\n```\n\n#### Configuring proxies\n\nTo modify proxy behavior, you can provide custom `fetchOptions` that add runtime-specific proxy\noptions to requests:\n\n **Node** [[docs](https://github.com/nodejs/undici/blob/main/docs/docs/api/ProxyAgent.md#example---proxyagent-with-fetch)]\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\nimport * as undici from 'undici';\n\nconst proxyAgent = new undici.ProxyAgent('http://localhost:8888');\nconst client = new LightsparkGrid({\n fetchOptions: {\n dispatcher: proxyAgent,\n },\n});\n```\n\n **Bun** [[docs](https://bun.sh/guides/http/proxy)]\n\n```ts\nimport LightsparkGrid from '@lightsparkdev/grid';\n\nconst client = new LightsparkGrid({\n fetchOptions: {\n proxy: 'http://localhost:8888',\n },\n});\n```\n\n **Deno** [[docs](https://docs.deno.com/api/deno/~/Deno.createHttpClient)]\n\n```ts\nimport LightsparkGrid from 'jsr:@lightsparkdev/grid';\n\nconst httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } });\nconst client = new LightsparkGrid({\n fetchOptions: {\n client: httpClient,\n },\n});\n```\n\n## Frequently Asked Questions\n\n## Semantic versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes that only affect static types, without breaking runtime behavior.\n2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n3. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/lightsparkdev/grid-js-sdk/issues) with questions, bugs, or suggestions.\n\n## Requirements\n\nTypeScript >= 4.9 is supported.\n\nThe following runtimes are supported:\n\n- Web browsers (Up-to-date Chrome, Firefox, Safari, Edge, and more)\n- Node.js 20 LTS or later ([non-EOL](https://endoflife.date/nodejs)) versions.\n- Deno v1.28.0 or higher.\n- Bun 1.0 or later.\n- Cloudflare Workers.\n- Vercel Edge Runtime.\n- Jest 28 or greater with the `\"node\"` environment (`\"jsdom\"` is not supported at this time).\n- Nitro v2.6 or greater.\n\nNote that React Native is not supported at this time.\n\nIf you are interested in other runtime environments, please open or upvote an issue on GitHub.\n\n## Contributing\n\nSee [the contributing documentation](./CONTRIBUTING.md).\n", }, ]; diff --git a/packages/mcp-server/src/methods.ts b/packages/mcp-server/src/methods.ts index 5a118d82..1c0801dd 100644 --- a/packages/mcp-server/src/methods.ts +++ b/packages/mcp-server/src/methods.ts @@ -52,6 +52,12 @@ export const sdkMethods: SdkMethod[] = [ httpMethod: 'delete', httpPath: '/customers/{customerId}', }, + { + clientCallName: 'client.customers.export', + fullyQualifiedName: 'customers.export', + httpMethod: 'post', + httpPath: '/internal-accounts/{id}/export', + }, { clientCallName: 'client.customers.getKYCLink', fullyQualifiedName: 'customers.getKYCLink', @@ -378,17 +384,17 @@ export const sdkMethods: SdkMethod[] = [ httpPath: '/auth/credentials', }, { - clientCallName: 'client.auth.credentials.resendChallenge', - fullyQualifiedName: 'auth.credentials.resendChallenge', - httpMethod: 'post', - httpPath: '/auth/credentials/{id}/challenge', - }, - { - clientCallName: 'client.auth.credentials.revoke', - fullyQualifiedName: 'auth.credentials.revoke', + clientCallName: 'client.auth.credentials.delete', + fullyQualifiedName: 'auth.credentials.delete', httpMethod: 'delete', httpPath: '/auth/credentials/{id}', }, + { + clientCallName: 'client.auth.credentials.challenge', + fullyQualifiedName: 'auth.credentials.challenge', + httpMethod: 'post', + httpPath: '/auth/credentials/{id}/challenge', + }, { clientCallName: 'client.auth.credentials.verify', fullyQualifiedName: 'auth.credentials.verify', @@ -402,16 +408,184 @@ export const sdkMethods: SdkMethod[] = [ httpPath: '/auth/sessions', }, { - clientCallName: 'client.auth.sessions.revoke', - fullyQualifiedName: 'auth.sessions.revoke', + clientCallName: 'client.auth.sessions.delete', + fullyQualifiedName: 'auth.sessions.delete', httpMethod: 'delete', httpPath: '/auth/sessions/{id}', }, { - clientCallName: 'client.internalAccounts.export', - fullyQualifiedName: 'internalAccounts.export', + clientCallName: 'client.agents.create', + fullyQualifiedName: 'agents.create', httpMethod: 'post', - httpPath: '/internal-accounts/{id}/export', + httpPath: '/agents', + }, + { + clientCallName: 'client.agents.retrieve', + fullyQualifiedName: 'agents.retrieve', + httpMethod: 'get', + httpPath: '/agents/{agentId}', + }, + { + clientCallName: 'client.agents.update', + fullyQualifiedName: 'agents.update', + httpMethod: 'patch', + httpPath: '/agents/{agentId}', + }, + { + clientCallName: 'client.agents.list', + fullyQualifiedName: 'agents.list', + httpMethod: 'get', + httpPath: '/agents', + }, + { + clientCallName: 'client.agents.delete', + fullyQualifiedName: 'agents.delete', + httpMethod: 'delete', + httpPath: '/agents/{agentId}', + }, + { + clientCallName: 'client.agents.listApprovals', + fullyQualifiedName: 'agents.listApprovals', + httpMethod: 'get', + httpPath: '/agents/approvals', + }, + { + clientCallName: 'client.agents.updatePolicy', + fullyQualifiedName: 'agents.updatePolicy', + httpMethod: 'patch', + httpPath: '/agents/{agentId}/policy', + }, + { + clientCallName: 'client.agents.me.retrieve', + fullyQualifiedName: 'agents.me.retrieve', + httpMethod: 'get', + httpPath: '/agents/me', + }, + { + clientCallName: 'client.agents.me.createTransferIn', + fullyQualifiedName: 'agents.me.createTransferIn', + httpMethod: 'post', + httpPath: '/agents/me/transfer-in', + }, + { + clientCallName: 'client.agents.me.createTransferOut', + fullyQualifiedName: 'agents.me.createTransferOut', + httpMethod: 'post', + httpPath: '/agents/me/transfer-out', + }, + { + clientCallName: 'client.agents.me.listInternalAccounts', + fullyQualifiedName: 'agents.me.listInternalAccounts', + httpMethod: 'get', + httpPath: '/agents/me/internal-accounts', + }, + { + clientCallName: 'client.agents.me.transactions.retrieve', + fullyQualifiedName: 'agents.me.transactions.retrieve', + httpMethod: 'get', + httpPath: '/agents/me/transactions/{transactionId}', + }, + { + clientCallName: 'client.agents.me.transactions.list', + fullyQualifiedName: 'agents.me.transactions.list', + httpMethod: 'get', + httpPath: '/agents/me/transactions', + }, + { + clientCallName: 'client.agents.me.quotes.create', + fullyQualifiedName: 'agents.me.quotes.create', + httpMethod: 'post', + httpPath: '/agents/me/quotes', + }, + { + clientCallName: 'client.agents.me.quotes.retrieve', + fullyQualifiedName: 'agents.me.quotes.retrieve', + httpMethod: 'get', + httpPath: '/agents/me/quotes/{quoteId}', + }, + { + clientCallName: 'client.agents.me.quotes.execute', + fullyQualifiedName: 'agents.me.quotes.execute', + httpMethod: 'post', + httpPath: '/agents/me/quotes/{quoteId}/execute', + }, + { + clientCallName: 'client.agents.me.externalAccounts.retrieve', + fullyQualifiedName: 'agents.me.externalAccounts.retrieve', + httpMethod: 'get', + httpPath: '/agents/me/external-accounts/{externalAccountId}', + }, + { + clientCallName: 'client.agents.me.externalAccounts.list', + fullyQualifiedName: 'agents.me.externalAccounts.list', + httpMethod: 'get', + httpPath: '/agents/me/external-accounts', + }, + { + clientCallName: 'client.agents.me.externalAccounts.delete', + fullyQualifiedName: 'agents.me.externalAccounts.delete', + httpMethod: 'delete', + httpPath: '/agents/me/external-accounts/{externalAccountId}', + }, + { + clientCallName: 'client.agents.me.externalAccounts.add', + fullyQualifiedName: 'agents.me.externalAccounts.add', + httpMethod: 'post', + httpPath: '/agents/me/external-accounts', + }, + { + clientCallName: 'client.agents.me.actions.retrieve', + fullyQualifiedName: 'agents.me.actions.retrieve', + httpMethod: 'get', + httpPath: '/agents/me/actions/{actionId}', + }, + { + clientCallName: 'client.agents.me.actions.list', + fullyQualifiedName: 'agents.me.actions.list', + httpMethod: 'get', + httpPath: '/agents/me/actions', + }, + { + clientCallName: 'client.agents.deviceCodes.getStatus', + fullyQualifiedName: 'agents.deviceCodes.getStatus', + httpMethod: 'get', + httpPath: '/agents/device-codes/{code}/status', + }, + { + clientCallName: 'client.agents.deviceCodes.redeem', + fullyQualifiedName: 'agents.deviceCodes.redeem', + httpMethod: 'post', + httpPath: '/agents/device-codes/{code}/redeem', + }, + { + clientCallName: 'client.agents.deviceCodes.regenerate', + fullyQualifiedName: 'agents.deviceCodes.regenerate', + httpMethod: 'post', + httpPath: '/agents/{agentId}/device-codes', + }, + { + clientCallName: 'client.agents.transactions.approve', + fullyQualifiedName: 'agents.transactions.approve', + httpMethod: 'post', + httpPath: '/agents/{agentId}/actions/{actionId}/approve', + }, + { + clientCallName: 'client.agents.transactions.reject', + fullyQualifiedName: 'agents.transactions.reject', + httpMethod: 'post', + httpPath: '/agents/{agentId}/actions/{actionId}/reject', + }, + { + clientCallName: 'client.agents.actions.approve', + fullyQualifiedName: 'agents.actions.approve', + httpMethod: 'post', + httpPath: '/agents/{agentId}/actions/{actionId}/approve', + }, + { + clientCallName: 'client.agents.actions.reject', + fullyQualifiedName: 'agents.actions.reject', + httpMethod: 'post', + httpPath: '/agents/{agentId}/actions/{actionId}/reject', }, ]; diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts index a332b7ab..69485611 100644 --- a/packages/mcp-server/src/server.ts +++ b/packages/mcp-server/src/server.ts @@ -28,7 +28,7 @@ export const newMcpServer = async ({ new McpServer( { name: 'lightsparkdev_grid_api', - version: '1.7.1', + version: '1.8.0', }, { instructions: await getInstructions({ stainlessApiKey, customInstructionsPath }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74cc3670..594fec0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,6 @@ overrides: minimatch: ^9.0.5 importers: - .: devDependencies: '@arethetypeswrong/cli': @@ -38,9 +37,6 @@ importers: eslint: specifier: ^9.39.1 version: 9.39.1 - eslint-plugin-prettier: - specifier: ^5.4.1 - version: 5.4.1(eslint@9.39.1)(prettier@3.1.1) eslint-plugin-unused-imports: specifier: ^4.1.4 version: 4.1.4(@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.39.1)(typescript@5.8.3))(eslint@9.39.1)(typescript@5.8.3))(eslint@9.39.1) @@ -206,344 +202,574 @@ importers: version: 4.2.0 packages: - '@andrewbranch/untar.js@1.0.3': - resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + resolution: + { + integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==, + } '@anthropic-ai/mcpb@2.1.2': - resolution: {integrity: sha512-goRbBC8ySo7SWb7tRzr+tL6FxDc4JPTRCdgfD2omba7freofvjq5rom1lBnYHZHo6Mizs1jAHJeN53aZbDoy8A==} + resolution: + { + integrity: sha512-goRbBC8ySo7SWb7tRzr+tL6FxDc4JPTRCdgfD2omba7freofvjq5rom1lBnYHZHo6Mizs1jAHJeN53aZbDoy8A==, + } hasBin: true '@arethetypeswrong/cli@0.17.0': - resolution: {integrity: sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA==, + } + engines: { node: '>=18' } hasBin: true '@arethetypeswrong/core@0.17.0': - resolution: {integrity: sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA==, + } + engines: { node: '>=18' } '@babel/code-frame@7.28.6': - resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==, + } + engines: { node: '>=6.9.0' } '@babel/compat-data@7.28.6': - resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==, + } + engines: { node: '>=6.9.0' } '@babel/core@7.28.6': - resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==, + } + engines: { node: '>=6.9.0' } '@babel/generator@7.28.6': - resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==, + } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, + } + engines: { node: '>=6.9.0' } '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==, + } + engines: { node: '>=6.9.0' } '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==, + } + engines: { node: '>=6.0.0' } hasBin: true '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==, + } + engines: { node: '>=6.9.0' } '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==, + } + engines: { node: '>=6.9.0' } '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==, + } + engines: { node: '>=6.9.0' } '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } '@cloudflare/cabidela@0.2.4': - resolution: {integrity: sha512-u/1OwwqfcMvjmUFOcb6QtFzVVGpncHJxwl254wjzp0JC5CUlBkV6r5BbRrHI5ZYJEAgu8NeeorirxngmMFPZjQ==} + resolution: + { + integrity: sha512-u/1OwwqfcMvjmUFOcb6QtFzVVGpncHJxwl254wjzp0JC5CUlBkV6r5BbRrHI5ZYJEAgu8NeeorirxngmMFPZjQ==, + } '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: '>=0.1.90' } '@cspotcode/source-map-consumer@0.8.0': - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==, + } + engines: { node: '>= 12' } '@cspotcode/source-map-support@0.7.0': - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==, + } + engines: { node: '>=12' } '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@hono/node-server@1.19.11': - resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} - engines: {node: '>=18.14.1'} + resolution: + { + integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==, + } + engines: { node: '>=18.14.1' } peerDependencies: hono: ^4 '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: '>=18.18.0' } '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, + } + engines: { node: '>=18.18.0' } '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + resolution: + { + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, + } + engines: { node: '>=18.18' } '@inquirer/checkbox@3.0.1': - resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==, + } + engines: { node: '>=18' } '@inquirer/confirm@4.0.1': - resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==, + } + engines: { node: '>=18' } '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==, + } + engines: { node: '>=18' } '@inquirer/editor@3.0.1': - resolution: {integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==, + } + engines: { node: '>=18' } '@inquirer/expand@3.0.1': - resolution: {integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==, + } + engines: { node: '>=18' } '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==, + } + engines: { node: '>=18' } '@inquirer/input@3.0.1': - resolution: {integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==, + } + engines: { node: '>=18' } '@inquirer/number@2.0.1': - resolution: {integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==, + } + engines: { node: '>=18' } '@inquirer/password@3.0.1': - resolution: {integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==, + } + engines: { node: '>=18' } '@inquirer/prompts@6.0.1': - resolution: {integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==, + } + engines: { node: '>=18' } '@inquirer/rawlist@3.0.1': - resolution: {integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==, + } + engines: { node: '>=18' } '@inquirer/search@2.0.1': - resolution: {integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==, + } + engines: { node: '>=18' } '@inquirer/select@3.0.1': - resolution: {integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==, + } + engines: { node: '>=18' } '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==, + } + engines: { node: '>=18' } '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + } + engines: { node: '>=8' } '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -551,32 +777,53 @@ packages: optional: true '@jest/create-cache-key-function@29.7.0': - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -584,54 +831,96 @@ packages: optional: true '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + resolution: + { + integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, + } '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: '>=6.0.0' } '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + resolution: + { + integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, + } '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, + } '@modelcontextprotocol/sdk@1.27.1': - resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==, + } + engines: { node: '>=18' } peerDependencies: '@cfworker/json-schema': ^4.1.1 zod: ^3.25 || ^4.0 @@ -640,104 +929,164 @@ packages: optional: true '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + resolution: + { + integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==, + } '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: '>=10' } '@sinonjs/commons@3.0.0': - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + resolution: + { + integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==, + } '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + resolution: + { + integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, + } '@swc/core-darwin-arm64@1.4.16': - resolution: {integrity: sha512-UOCcH1GvjRnnM/LWT6VCGpIk0OhHRq6v1U6QXuPt5wVsgXnXQwnf5k3sG5Cm56hQHDvhRPY6HCsHi/p0oek8oQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UOCcH1GvjRnnM/LWT6VCGpIk0OhHRq6v1U6QXuPt5wVsgXnXQwnf5k3sG5Cm56hQHDvhRPY6HCsHi/p0oek8oQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [darwin] '@swc/core-darwin-x64@1.4.16': - resolution: {integrity: sha512-t3bgqFoYLWvyVtVL6KkFNCINEoOrIlyggT/kJRgi1y0aXSr0oVgcrQ4ezJpdeahZZ4N+Q6vT3ffM30yIunELNA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t3bgqFoYLWvyVtVL6KkFNCINEoOrIlyggT/kJRgi1y0aXSr0oVgcrQ4ezJpdeahZZ4N+Q6vT3ffM30yIunELNA==, + } + engines: { node: '>=10' } cpu: [x64] os: [darwin] '@swc/core-linux-arm-gnueabihf@1.4.16': - resolution: {integrity: sha512-DvHuwvEF86YvSd0lwnzVcjOTZ0jcxewIbsN0vc/0fqm9qBdMMjr9ox6VCam1n3yYeRtj4VFgrjeNFksqbUejdQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-DvHuwvEF86YvSd0lwnzVcjOTZ0jcxewIbsN0vc/0fqm9qBdMMjr9ox6VCam1n3yYeRtj4VFgrjeNFksqbUejdQ==, + } + engines: { node: '>=10' } cpu: [arm] os: [linux] '@swc/core-linux-arm64-gnu@1.4.16': - resolution: {integrity: sha512-9Uu5YlPbyCvbidjKtYEsPpyZlu16roOZ5c2tP1vHfnU9bgf5Tz5q5VovSduNxPHx+ed2iC1b1URODHvDzbbDuQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9Uu5YlPbyCvbidjKtYEsPpyZlu16roOZ5c2tP1vHfnU9bgf5Tz5q5VovSduNxPHx+ed2iC1b1URODHvDzbbDuQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] libc: [glibc] '@swc/core-linux-arm64-musl@1.4.16': - resolution: {integrity: sha512-/YZq/qB1CHpeoL0eMzyqK5/tYZn/rzKoCYDviFU4uduSUIJsDJQuQA/skdqUzqbheOXKAd4mnJ1hT04RbJ8FPQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/YZq/qB1CHpeoL0eMzyqK5/tYZn/rzKoCYDviFU4uduSUIJsDJQuQA/skdqUzqbheOXKAd4mnJ1hT04RbJ8FPQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] libc: [musl] '@swc/core-linux-x64-gnu@1.4.16': - resolution: {integrity: sha512-UUjaW5VTngZYDcA8yQlrFmqs1tLi1TxbKlnaJwoNhel9zRQ0yG1YEVGrzTvv4YApSuIiDK18t+Ip927bwucuVQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UUjaW5VTngZYDcA8yQlrFmqs1tLi1TxbKlnaJwoNhel9zRQ0yG1YEVGrzTvv4YApSuIiDK18t+Ip927bwucuVQ==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] libc: [glibc] '@swc/core-linux-x64-musl@1.4.16': - resolution: {integrity: sha512-aFhxPifevDTwEDKPi4eRYWzC0p/WYJeiFkkpNU5Uc7a7M5iMWPAbPFUbHesdlb9Jfqs5c07oyz86u+/HySBNPQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-aFhxPifevDTwEDKPi4eRYWzC0p/WYJeiFkkpNU5Uc7a7M5iMWPAbPFUbHesdlb9Jfqs5c07oyz86u+/HySBNPQ==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] libc: [musl] '@swc/core-win32-arm64-msvc@1.4.16': - resolution: {integrity: sha512-bTD43MbhIHL2s5QgCwyleaGwl96Gk/scF2TaVKdUe4QlJCDV/YK9h5oIBAp63ckHtE8GHlH4c8dZNBiAXn4Org==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-bTD43MbhIHL2s5QgCwyleaGwl96Gk/scF2TaVKdUe4QlJCDV/YK9h5oIBAp63ckHtE8GHlH4c8dZNBiAXn4Org==, + } + engines: { node: '>=10' } cpu: [arm64] os: [win32] '@swc/core-win32-ia32-msvc@1.4.16': - resolution: {integrity: sha512-/lmZeAN/qV5XbK2SEvi8e2RkIg8FQNYiSA8y2/Zb4gTUMKVO5JMLH0BSWMiIKMstKDPDSxMWgwJaQHF8UMyPmQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/lmZeAN/qV5XbK2SEvi8e2RkIg8FQNYiSA8y2/Zb4gTUMKVO5JMLH0BSWMiIKMstKDPDSxMWgwJaQHF8UMyPmQ==, + } + engines: { node: '>=10' } cpu: [ia32] os: [win32] '@swc/core-win32-x64-msvc@1.4.16': - resolution: {integrity: sha512-BPAfFfODWXtUu6SwaTTftDHvcbDyWBSI/oanUeRbQR5vVWkXoQ3cxLTsDluc3H74IqXS5z1Uyoe0vNo2hB1opA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-BPAfFfODWXtUu6SwaTTftDHvcbDyWBSI/oanUeRbQR5vVWkXoQ3cxLTsDluc3H74IqXS5z1Uyoe0vNo2hB1opA==, + } + engines: { node: '>=10' } cpu: [x64] os: [win32] '@swc/core@1.4.16': - resolution: {integrity: sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA==, + } + engines: { node: '>=10' } peerDependencies: '@swc/helpers': ^0.5.0 peerDependenciesMeta: @@ -745,204 +1094,366 @@ packages: optional: true '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } '@swc/jest@0.2.36': - resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} - engines: {npm: '>= 7.0.0'} + resolution: + { + integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==, + } + engines: { npm: '>= 7.0.0' } peerDependencies: '@swc/core': '*' '@swc/types@0.1.6': - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + resolution: + { + integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==, + } '@ts-morph/common@0.20.0': - resolution: {integrity: sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==} + resolution: + { + integrity: sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==, + } '@tsconfig/node10@1.0.8': - resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + resolution: + { + integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==, + } '@tsconfig/node12@1.0.9': - resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + resolution: + { + integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==, + } '@tsconfig/node14@1.0.1': - resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + resolution: + { + integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==, + } '@tsconfig/node16@1.0.2': - resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + resolution: + { + integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==, + } '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + resolution: + { + integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, + } '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } '@types/babel__traverse@7.20.4': - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + resolution: + { + integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, + } '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + resolution: + { + integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==, + } '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } '@types/cookie-parser@1.4.10': - resolution: {integrity: sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==} + resolution: + { + integrity: sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==, + } peerDependencies: '@types/express': '*' '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + resolution: + { + integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==, + } '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } '@types/express-serve-static-core@5.0.7': - resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + resolution: + { + integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==, + } '@types/express@5.0.3': - resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + resolution: + { + integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==, + } '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + resolution: + { + integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, + } '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + resolution: + { + integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==, + } '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } '@types/jest@29.5.11': - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + resolution: + { + integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, + } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + resolution: + { + integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==, + } '@types/node@20.19.11': - resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==} + resolution: + { + integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==, + } '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + resolution: + { + integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==, + } '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + resolution: + { + integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==, + } '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + resolution: + { + integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==, + } '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + resolution: + { + integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==, + } '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + resolution: + { + integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, + } '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + resolution: + { + integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==, + } '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + resolution: + { + integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==, + } '@typescript-eslint/eslint-plugin@8.31.1': - resolution: {integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.31.1': - resolution: {integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.31.1': - resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/type-utils@8.31.1': - resolution: {integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.31.1': - resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/typescript-estree@8.31.1': - resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.31.1': - resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.31.1': - resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@valtown/deno-http-worker@0.0.21': - resolution: {integrity: sha512-16kFuUykann75lNytnXXIQlmpzreZjzdyT27ebT3yNGCS3kKaS1iZYWHc3Si9An54Cphwr4qEcviChQkEeJBlA==} - engines: {node: 20 || 22 || 24} + resolution: + { + integrity: sha512-16kFuUykann75lNytnXXIQlmpzreZjzdyT27ebT3yNGCS3kKaS1iZYWHc3Si9An54Cphwr4qEcviChQkEeJBlA==, + } + engines: { node: 20 || 22 || 24 } accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, + } + engines: { node: '>= 0.6' } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: '>=0.4.0' } acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, + } + engines: { node: '>=0.4.0' } hasBin: true acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: '>=0.4.0' } hasBin: true aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: '>=8' } ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + resolution: + { + integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==, + } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -950,262 +1461,466 @@ packages: optional: true ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + resolution: + { + integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==, + } ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, + } + engines: { node: '>=18' } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: '>=12' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: '>=8.0.0' } babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } peerDependencies: '@babel/core': ^7.8.0 babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + } + engines: { node: '>=8' } babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + resolution: + { + integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==, + } peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } peerDependencies: '@babel/core': ^7.0.0 balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } baseline-browser-mapping@2.9.14: - resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + resolution: + { + integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==, + } hasBin: true body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==, + } + engines: { node: '>=18' } brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + resolution: + { + integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, + } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, + } + engines: { node: '>= 6' } bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: '>= 0.8' } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } caniuse-lite@1.0.30001764: - resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} + resolution: + { + integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==, + } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: '>=10' } chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: '>=8' } cjs-module-lexer@1.4.1: - resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + resolution: + { + integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==, + } clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: '>=6' } cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} + resolution: + { + integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==, + } + engines: { node: '>=8.0.0', npm: '>=5.0.0' } hasBin: true cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} + resolution: + { + integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==, + } + engines: { node: 10.* || >= 12.* } cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, + } + engines: { node: '>= 12' } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + resolution: + { + integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==, + } collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + resolution: + { + integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, + } + engines: { node: '>=14' } commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, + } + engines: { node: '>=18' } content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==, + } + engines: { node: '>= 0.6' } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-parser@1.4.7: - resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==, + } + engines: { node: '>= 0.8.0' } cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} + resolution: + { + integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, + } + engines: { node: '>=6.6.0' } cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, + } + engines: { node: '>= 0.6' } cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, + } + engines: { node: '>= 0.10' } create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } hasBin: true create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + resolution: + { + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, + } debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1213,8 +1928,11 @@ packages: optional: true debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1222,7 +1940,10 @@ packages: optional: true dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + resolution: + { + integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, + } peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -1230,96 +1951,171 @@ packages: optional: true deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: '>=0.10.0' } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: '>=8' } diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + resolution: + { + integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==, + } emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + } + engines: { node: '>=12' } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emojilib@2.4.0: - resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + resolution: + { + integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==, + } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: '>= 0.8' } end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + resolution: + { + integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, + } environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, + } + engines: { node: '>=18' } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: '>=6' } escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + } + engines: { node: '>=8' } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } eslint-plugin-prettier@5.4.1: - resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' @@ -1332,7 +2128,10 @@ packages: optional: true eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + resolution: + { + integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==, + } peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -1341,24 +2140,39 @@ packages: optional: true eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: jiti: '*' @@ -1367,392 +2181,695 @@ packages: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: '>= 0.6' } eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==, + } + engines: { node: '>=18.0.0' } eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==, + } + engines: { node: '>=18.0.0' } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + } + engines: { node: '>= 0.8.0' } expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } express-rate-limit@8.3.1: - resolution: {integrity: sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==, + } + engines: { node: '>= 16' } peerDependencies: express: '>= 4.11' express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==, + } + engines: { node: '>= 18' } external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: '>=4' } fast-copy@4.0.2: - resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} + resolution: + { + integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==, + } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + resolution: + { + integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, + } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + } fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + resolution: + { + integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==, + } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: '>=16.0.0' } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==, + } + engines: { node: '>= 0.8' } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: '>=16' } flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } flora-colossus@2.0.0: - resolution: {integrity: sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==, + } + engines: { node: '>= 12' } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: '>= 0.6' } fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, + } + engines: { node: '>= 0.8' } fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } fuse.js@7.1.0: - resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==, + } + engines: { node: '>=10' } galactus@1.0.0: - resolution: {integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==, + } + engines: { node: '>= 12' } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + } + engines: { node: '>=8.0.0' } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } get-stdin@8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==, + } + engines: { node: '>=10' } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: '>=12' } deprecated: Glob versions prior to v9 are no longer supported globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: '>=18' } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, + } + engines: { node: '>=0.4.7' } hasBin: true has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: '>= 0.4' } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + resolution: + { + integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, + } highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + resolution: + { + integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==, + } hono@4.12.5: - resolution: {integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==} - engines: {node: '>=16.9.0'} + resolution: + { + integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==, + } + engines: { node: '>=16.9.0' } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: '>= 0.8' } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==, + } + engines: { node: '>=0.10.0' } ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: '>= 4' } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: '>= 4' } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: '>=6' } import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, + } + engines: { node: '>=8' } hasBin: true imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==, + } + engines: { node: '>= 12' } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + } + engines: { node: '>=6' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + resolution: + { + integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, + } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: '>=8' } istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + } + engines: { node: '>=8' } istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==, + } + engines: { node: '>=10' } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + } + engines: { node: '>=10' } istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==, + } + engines: { node: '>=8' } jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1761,8 +2878,11 @@ packages: optional: true jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -1773,48 +2893,81 @@ packages: optional: true jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + } + engines: { node: '>=6' } peerDependencies: jest-resolve: '*' peerDependenciesMeta: @@ -1822,48 +2975,81 @@ packages: optional: true jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1872,695 +3058,1248 @@ packages: optional: true jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + resolution: + { + integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==, + } joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } jq-web@https://github.com/stainless-api/jq-web/releases/download/v0.8.8/jq-web.tar.gz: - resolution: {integrity: sha512-6nmDSHGJm8Cclf2oSuO9xQ7vt5x5bDiuTKX2rkyW1K7Uo2SHeI4ZvpgMITKy+8p3bbEnKovTPGoHhApa6v/PbA==, tarball: https://github.com/stainless-api/jq-web/releases/download/v0.8.8/jq-web.tar.gz} + resolution: + { + integrity: sha512-6nmDSHGJm8Cclf2oSuO9xQ7vt5x5bDiuTKX2rkyW1K7Uo2SHeI4ZvpgMITKy+8p3bbEnKovTPGoHhApa6v/PbA==, + tarball: https://github.com/stainless-api/jq-web/releases/download/v0.8.8/jq-web.tar.gz, + } version: 0.8.8 js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + resolution: + { + integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==, + } hasBin: true js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + resolution: + { + integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, + } hasBin: true jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + resolution: + { + integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } hasBin: true jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + resolution: + { + integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==, + } jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + resolution: + { + integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==, + } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: '>=6' } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } marked-terminal@7.2.1: - resolution: {integrity: sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==, + } + engines: { node: '>=16.0.0' } peerDependencies: marked: '>=1 <15' marked@9.1.6: - resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==, + } + engines: { node: '>= 16' } hasBin: true math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, + } + engines: { node: '>= 0.8' } merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, + } + engines: { node: '>=18' } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: '>= 0.6' } mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, + } + engines: { node: '>= 0.6' } mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: '>=16 || 14 >=14.17' } minimist@1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + resolution: + { + integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==, + } minisearch@7.2.0: - resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + resolution: + { + integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==, + } mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==, + } + engines: { node: '>=10' } hasBin: true mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: '>=4' } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, + } + engines: { node: '>= 0.6' } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } node-emoji@2.1.3: - resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==, + } + engines: { node: '>=18' } node-forge@1.3.2: - resolution: {integrity: sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==} - engines: {node: '>= 6.13.0'} + resolution: + { + integrity: sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==, + } + engines: { node: '>= 6.13.0' } node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + resolution: + { + integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, + } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } npm-bundled@2.0.1: - resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } npm-packlist@5.1.3: - resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } hasBin: true npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==, + } + engines: { node: '>=14.0.0' } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: '>= 0.8.0' } os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: '>=0.10.0' } p-all@3.0.0: - resolution: {integrity: sha512-qUZbvbBFVXm6uJ7U/WDiO0fv6waBMbjlCm4E66oZdRR+egswICarIdHyVSZZHudH8T5SF8x/JG0q0duFzPnlBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-qUZbvbBFVXm6uJ7U/WDiO0fv6waBMbjlCm4E66oZdRR+egswICarIdHyVSZZHudH8T5SF8x/JG0q0duFzPnlBw==, + } + engines: { node: '>=10' } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: '>=10' } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + resolution: + { + integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==, + } parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + resolution: + { + integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==, + } parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + resolution: + { + integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + resolution: + { + integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } pino-abstract-transport@3.0.0: - resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + resolution: + { + integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==, + } pino-http@11.0.0: - resolution: {integrity: sha512-wqg5XIAGRRIWtTk8qPGxkbrfiwEWz1lgedVLvhLALudKXvg1/L2lTFgTGPJ4Z2e3qcRmxoFxDuSdMdMGNM6I1g==} + resolution: + { + integrity: sha512-wqg5XIAGRRIWtTk8qPGxkbrfiwEWz1lgedVLvhLALudKXvg1/L2lTFgTGPJ4Z2e3qcRmxoFxDuSdMdMGNM6I1g==, + } pino-pretty@13.1.3: - resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} + resolution: + { + integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==, + } hasBin: true pino-std-serializers@7.1.0: - resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + resolution: + { + integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==, + } pino@10.3.1: - resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + resolution: + { + integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==, + } hasBin: true pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: '>= 6' } pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} + resolution: + { + integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==, + } + engines: { node: '>=16.20.0' } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: '>=8' } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: '>=6.0.0' } prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==, + } + engines: { node: '>=14' } hasBin: true pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: '>=6' } pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } process-warning@5.0.0: - resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + resolution: + { + integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==, + } prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: '>= 0.10' } publint@0.2.12: - resolution: {integrity: sha512-YNeUtCVeM4j9nDiTT2OPczmlyzOkIXNtdDZnSuajAxS/nZ6j3t7Vs9SUB4euQNddiltIwu7Tdd3s+hr08fAsMw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-YNeUtCVeM4j9nDiTT2OPczmlyzOkIXNtdDZnSuajAxS/nZ6j3t7Vs9SUB4euQNddiltIwu7Tdd3s+hr08fAsMw==, + } + engines: { node: '>=16' } hasBin: true pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + resolution: + { + integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + resolution: + { + integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, + } qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==, + } + engines: { node: '>=0.6' } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } raw-body@3.0.1: - resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==, + } + engines: { node: '>= 0.10' } react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, + } + engines: { node: '>= 12.13.0' } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: '>=8' } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, + } + engines: { node: '>=10' } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } hasBin: true reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, + } + engines: { node: '>= 18' } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, + } + engines: { node: '>=6' } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, + } + engines: { node: '>=10' } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } secure-json-parse@4.1.0: - resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + resolution: + { + integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==, + } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: '>=10' } hasBin: true semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==, + } + engines: { node: '>=10' } hasBin: true send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, + } + engines: { node: '>= 18' } serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, + } + engines: { node: '>= 18' } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } skin-tone@2.0.0: - resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==, + } + engines: { node: '>=8' } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } sonic-boom@4.2.1: - resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + resolution: + { + integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==, + } source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + resolution: + { + integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, + } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: '>= 10.x' } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + } + engines: { node: '>=10' } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: '>= 0.8' } statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, + } + engines: { node: '>= 0.8' } string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + } + engines: { node: '>=10' } string-to-stream@3.0.1: - resolution: {integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==} + resolution: + { + integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: '>=8' } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } strip-json-comments@5.0.3: - resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==, + } + engines: { node: '>=14.16' } superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==, + } + engines: { node: '>=14.0.0' } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } supports-hyperlinks@3.1.0: - resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} - engines: {node: '>=14.18'} + resolution: + { + integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==, + } + engines: { node: '>=14.18' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==, + } + engines: { node: ^14.18.0 || >=16.0.0 } test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: '>=8' } thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: '>=0.8' } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } thread-stream@4.0.0: - resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==, + } + engines: { node: '>=20' } tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: '>=0.6.0' } tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} - engines: {node: '>=18.12'} + resolution: + { + integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==, + } + engines: { node: '>=18.12' } peerDependencies: typescript: '>=4.8.4' ts-jest@29.4.6: - resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -2586,10 +4325,16 @@ packages: optional: true ts-morph@19.0.0: - resolution: {integrity: sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==} + resolution: + { + integrity: sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==, + } ts-node@10.7.0: - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + resolution: + { + integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, + } hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -2603,195 +4348,330 @@ packages: optional: true tsc-multi@https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz: - resolution: {integrity: sha512-tWyCXnx0WqCkVlo5s+4KMj7HC0/0YrCZY0PustUwX9F2lNwd8Kp07q/Q56uGvV9q80XaSDrhy0YqBmrX5TDNpQ==, tarball: https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz} + resolution: + { + integrity: sha512-tWyCXnx0WqCkVlo5s+4KMj7HC0/0YrCZY0PustUwX9F2lNwd8Kp07q/Q56uGvV9q80XaSDrhy0YqBmrX5TDNpQ==, + tarball: https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz, + } version: 1.1.9 - engines: {node: '>=14'} + engines: { node: '>=14' } hasBin: true peerDependencies: typescript: '>=4.3.0' tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: '>=6' } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, + } + engines: { node: '>=16' } type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, + } + engines: { node: '>= 0.6' } typescript-eslint@8.31.1: - resolution: {integrity: sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' typescript@5.6.1-rc: - resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==, + } + engines: { node: '>=14.17' } hasBin: true typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, + } + engines: { node: '>=14.17' } hasBin: true uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, + } + engines: { node: '>=0.8.0' } hasBin: true undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } unicode-emoji-modifier-base@1.0.0: - resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==, + } + engines: { node: '>=4' } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: '>= 10.0.0' } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + resolution: + { + integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, + } hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } v8-compile-cache-lib@3.0.0: - resolution: {integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==} + resolution: + { + integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==, + } v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + resolution: + { + integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==, + } + engines: { node: '>=10.12.0' } validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: '>=0.10.0' } wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: '>=10' } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: '>=10' } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: '>=12' } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==, + } + engines: { node: '>=18' } zod-to-json-schema@3.24.6: - resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + resolution: + { + integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==, + } peerDependencies: zod: ^3.24.1 zod-to-json-schema@3.25.0: - resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + resolution: + { + integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==, + } peerDependencies: zod: ^3.25 || ^4 zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + resolution: + { + integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==, + } peerDependencies: zod: ^3.25 || ^4 zod-validation-error@4.0.1: - resolution: {integrity: sha512-F3rdaCOHs5ViJ5YTz5zzRtfkQdMdIeKudJAoxy7yB/2ZMEHw73lmCAcQw11r7++20MyGl4WV59EVh7A9rNAyog==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-F3rdaCOHs5ViJ5YTz5zzRtfkQdMdIeKudJAoxy7yB/2ZMEHw73lmCAcQw11r7++20MyGl4WV59EVh7A9rNAyog==, + } + engines: { node: '>=18.0.0' } peerDependencies: zod: ^3.25.0 || ^4.0.0 zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + resolution: + { + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, + } snapshots: - '@andrewbranch/untar.js@1.0.3': {} '@anthropic-ai/mcpb@2.1.2': diff --git a/scripts/detect-breaking-changes b/scripts/detect-breaking-changes index b6ada661..c76d4632 100755 --- a/scripts/detect-breaking-changes +++ b/scripts/detect-breaking-changes @@ -34,7 +34,15 @@ TEST_PATHS=( tests/api-resources/auth/auth.test.ts tests/api-resources/auth/credentials.test.ts tests/api-resources/auth/sessions.test.ts - tests/api-resources/internal-accounts.test.ts + tests/api-resources/agents/agents.test.ts + tests/api-resources/agents/me/me.test.ts + tests/api-resources/agents/me/transactions.test.ts + tests/api-resources/agents/me/quotes.test.ts + tests/api-resources/agents/me/external-accounts.test.ts + tests/api-resources/agents/me/actions.test.ts + tests/api-resources/agents/device-codes.test.ts + tests/api-resources/agents/transactions.test.ts + tests/api-resources/agents/actions.test.ts tests/index.test.ts ) diff --git a/scripts/fast-format b/scripts/fast-format index 53721ac0..f1873aef 100755 --- a/scripts/fast-format +++ b/scripts/fast-format @@ -31,10 +31,7 @@ if ! [ -z "$ESLINT_FILES" ]; then fi echo "==> Running prettier --write" -# format things eslint didn't -PRETTIER_FILES="$(grep '\.\(js\|json\)$' "$FILE_LIST" || true)" -if ! [ -z "$PRETTIER_FILES" ]; then - echo "$PRETTIER_FILES" | xargs ./node_modules/.bin/prettier \ - --write --cache --cache-strategy metadata --no-error-on-unmatched-pattern \ - '!**/dist' '!**/*.ts' '!**/*.mts' '!**/*.cts' '!**/*.js' '!**/*.mjs' '!**/*.cjs' +if ! [ -z "$FILE_LIST" ]; then + cat "$FILE_LIST" | xargs ./node_modules/.bin/prettier \ + --write --cache --cache-strategy metadata --no-error-on-unmatched-pattern --ignore-unknown fi diff --git a/scripts/format b/scripts/format index 7a756401..b1b2c17a 100755 --- a/scripts/format +++ b/scripts/format @@ -8,5 +8,4 @@ echo "==> Running eslint --fix" ./node_modules/.bin/eslint --fix . echo "==> Running prettier --write" -# format things eslint didn't -./node_modules/.bin/prettier --write --cache --cache-strategy metadata . '!**/dist' '!**/*.ts' '!**/*.mts' '!**/*.cts' '!**/*.js' '!**/*.mjs' '!**/*.cjs' +./node_modules/.bin/prettier --write --cache --cache-strategy metadata . diff --git a/scripts/lint b/scripts/lint index 97a3df83..5a15375f 100755 --- a/scripts/lint +++ b/scripts/lint @@ -4,6 +4,9 @@ set -e cd "$(dirname "$0")/.." +echo "==> Running prettier --check" +./node_modules/.bin/prettier --check . + echo "==> Running eslint" ./node_modules/.bin/eslint . diff --git a/src/client.ts b/src/client.ts index d21a0d78..bcc6a38a 100644 --- a/src/client.ts +++ b/src/client.ts @@ -56,11 +56,6 @@ import { Documents, } from './resources/documents'; import { ExchangeRateListParams, ExchangeRateListResponse, ExchangeRates } from './resources/exchange-rates'; -import { - InternalAccountExportParams, - InternalAccountExportResponse, - InternalAccounts, -} from './resources/internal-accounts'; import { CurrencyAmount, InvitationClaimParams, @@ -138,6 +133,7 @@ import { Verifications, } from './resources/verifications'; import { + AgentActionWebhookEvent, BulkUploadWebhookEvent, CustomerUpdateWebhookEvent, IncomingPaymentWebhookEvent, @@ -149,6 +145,29 @@ import { VerificationUpdateWebhookEvent, Webhooks, } from './resources/webhooks'; +import { + Agent, + AgentAction, + AgentActionListResponse, + AgentActionRejectRequest, + AgentActionsDefaultPagination, + AgentCreateParams, + AgentCreateRequest, + AgentCreateResponse, + AgentDeviceCode, + AgentDeviceCodeRedeemResponse, + AgentDeviceCodeStatusResponse, + AgentListApprovalsParams, + AgentListParams, + AgentListResponse, + AgentPolicy, + AgentUpdateParams, + AgentUpdatePolicyParams, + AgentUpdateRequest, + AgentUsage, + Agents, + AgentsDefaultPagination, +} from './resources/agents/agents'; import { Auth } from './resources/auth/auth'; import { BusinessCustomerFields, @@ -156,6 +175,7 @@ import { Customer, CustomerCreate, CustomerCreateParams, + CustomerExportParams, CustomerGetKYCLinkParams, CustomerGetKYCLinkResponse, CustomerListInternalAccountsParams, @@ -167,6 +187,8 @@ import { CustomerUpdateParams, Customers, IndividualCustomerFields, + InternalAccountExportRequest, + InternalAccountExportResponse, } from './resources/customers/customers'; import { Platform, @@ -192,12 +214,17 @@ export interface ClientOptions { /** * API token authentication using format `:` */ - username?: string | undefined; + username?: string | null | undefined; /** * API token authentication using format `:` */ - password?: string | undefined; + password?: string | null | undefined; + + /** + * Bearer access token obtained by redeeming a device code. Required when calling agent-scoped endpoints (e.g. `GET /agents/me/...`). Leave unset for platform-scoped operations. + */ + agentAccessToken?: string | null | undefined; /** * Secp256r1 (P-256) asymmetric signature of the webhook payload, which can be used to verify that the webhook was sent by Grid. @@ -286,8 +313,9 @@ export interface ClientOptions { * API Client for interfacing with the Lightspark Grid API. */ export class LightsparkGrid { - username: string; - password: string; + username: string | null; + password: string | null; + agentAccessToken: string | null; webhookSignature: string | null; baseURL: string; @@ -305,8 +333,9 @@ export class LightsparkGrid { /** * API Client for interfacing with the Lightspark Grid API. * - * @param {string | undefined} [opts.username=process.env['GRID_CLIENT_ID'] ?? undefined] - * @param {string | undefined} [opts.password=process.env['GRID_CLIENT_SECRET'] ?? undefined] + * @param {string | null | undefined} [opts.username=process.env['GRID_CLIENT_ID'] ?? null] + * @param {string | null | undefined} [opts.password=process.env['GRID_CLIENT_SECRET'] ?? null] + * @param {string | null | undefined} [opts.agentAccessToken=process.env['GRID_AGENT_ACCESS_TOKEN'] ?? null] * @param {string | null | undefined} [opts.webhookSignature=process.env['GRID_WEBHOOK_PUBKEY'] ?? null] * @param {string} [opts.baseURL=process.env['LIGHTSPARK_GRID_BASE_URL'] ?? https://api.lightspark.com/grid/2025-10-13] - Override the default base URL for the API. * @param {number} [opts.timeout=1 minute] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. @@ -318,25 +347,16 @@ export class LightsparkGrid { */ constructor({ baseURL = readEnv('LIGHTSPARK_GRID_BASE_URL'), - username = readEnv('GRID_CLIENT_ID'), - password = readEnv('GRID_CLIENT_SECRET'), + username = readEnv('GRID_CLIENT_ID') ?? null, + password = readEnv('GRID_CLIENT_SECRET') ?? null, + agentAccessToken = readEnv('GRID_AGENT_ACCESS_TOKEN') ?? null, webhookSignature = readEnv('GRID_WEBHOOK_PUBKEY') ?? null, ...opts }: ClientOptions = {}) { - if (username === undefined) { - throw new Errors.LightsparkGridError( - "The GRID_CLIENT_ID environment variable is missing or empty; either provide it, or instantiate the LightsparkGrid client with an username option, like new LightsparkGrid({ username: 'My Username' }).", - ); - } - if (password === undefined) { - throw new Errors.LightsparkGridError( - "The GRID_CLIENT_SECRET environment variable is missing or empty; either provide it, or instantiate the LightsparkGrid client with an password option, like new LightsparkGrid({ password: 'My Password' }).", - ); - } - const options: ClientOptions = { username, password, + agentAccessToken, webhookSignature, ...opts, baseURL: baseURL || `https://api.lightspark.com/grid/2025-10-13`, @@ -373,6 +393,7 @@ export class LightsparkGrid { this.username = username; this.password = password; + this.agentAccessToken = agentAccessToken; this.webhookSignature = webhookSignature; } @@ -391,6 +412,7 @@ export class LightsparkGrid { fetchOptions: this.fetchOptions, username: this.username, password: this.password, + agentAccessToken: this.agentAccessToken, webhookSignature: this.webhookSignature, ...options, }); @@ -409,11 +431,38 @@ export class LightsparkGrid { } protected validateHeaders({ values, nulls }: NullableHeaders) { - return; + if (this.username && this.password && values.get('authorization')) { + return; + } + if (nulls.has('authorization')) { + return; + } + + if (this.agentAccessToken && values.get('authorization')) { + return; + } + if (nulls.has('authorization')) { + return; + } + + if (this.webhookSignature && values.get('x-grid-signature')) { + return; + } + if (nulls.has('x-grid-signature')) { + return; + } + + throw new Error( + 'Could not resolve authentication method. Expected one of username, password, agentAccessToken or webhookSignature to be set. Or for one of the "Authorization", "Authorization" or "X-Grid-Signature" headers to be explicitly omitted', + ); } protected async authHeaders(opts: FinalRequestOptions): Promise { - return buildHeaders([await this.basicAuth(opts), await this.webhookSignatureAuth(opts)]); + return buildHeaders([ + await this.basicAuth(opts), + await this.agentAuth(opts), + await this.webhookSignatureAuth(opts), + ]); } protected async basicAuth(opts: FinalRequestOptions): Promise { @@ -430,6 +479,13 @@ export class LightsparkGrid { return buildHeaders([{ Authorization }]); } + protected async agentAuth(opts: FinalRequestOptions): Promise { + if (this.agentAccessToken == null) { + return undefined; + } + return buildHeaders([{ Authorization: `Bearer ${this.agentAccessToken}` }]); + } + protected async webhookSignatureAuth(opts: FinalRequestOptions): Promise { if (this.webhookSignature == null) { return undefined; @@ -1034,9 +1090,9 @@ export class LightsparkGrid { discoveries: API.Discoveries = new API.Discoveries(this); auth: API.Auth = new API.Auth(this); /** - * Internal account management endpoints for creating and managing internal accounts + * Endpoints for creating and managing agents (experimental), called by the partner's backend using platform credentials. Covers the full agent lifecycle: creation, policy configuration, pausing, deletion, the device code installation flow, and approving or rejecting transactions initiated by agents. */ - internalAccounts: API.InternalAccounts = new API.InternalAccounts(this); + agents: API.Agents = new API.Agents(this); } LightsparkGrid.Config = Config; @@ -1059,7 +1115,7 @@ LightsparkGrid.Documents = Documents; LightsparkGrid.Verifications = Verifications; LightsparkGrid.Discoveries = Discoveries; LightsparkGrid.Auth = Auth; -LightsparkGrid.InternalAccounts = InternalAccounts; +LightsparkGrid.Agents = Agents; export declare namespace LightsparkGrid { export type RequestOptions = Opts.RequestOptions; @@ -1088,11 +1144,14 @@ export declare namespace LightsparkGrid { type CustomerType as CustomerType, type CustomerUpdate as CustomerUpdate, type IndividualCustomerFields as IndividualCustomerFields, + type InternalAccountExportRequest as InternalAccountExportRequest, + type InternalAccountExportResponse as InternalAccountExportResponse, type CustomerGetKYCLinkResponse as CustomerGetKYCLinkResponse, type CustomerOneovesDefaultPagination as CustomerOneovesDefaultPagination, type CustomerCreateParams as CustomerCreateParams, type CustomerUpdateParams as CustomerUpdateParams, type CustomerListParams as CustomerListParams, + type CustomerExportParams as CustomerExportParams, type CustomerGetKYCLinkParams as CustomerGetKYCLinkParams, type CustomerListInternalAccountsParams as CustomerListInternalAccountsParams, }; @@ -1188,6 +1247,7 @@ export declare namespace LightsparkGrid { export { Webhooks as Webhooks, + type AgentActionWebhookEvent as AgentActionWebhookEvent, type IncomingPaymentWebhookEvent as IncomingPaymentWebhookEvent, type OutgoingPaymentWebhookEvent as OutgoingPaymentWebhookEvent, type TestWebhookWebhookEvent as TestWebhookWebhookEvent, @@ -1249,13 +1309,32 @@ export declare namespace LightsparkGrid { export { Auth as Auth }; export { - InternalAccounts as InternalAccounts, - type InternalAccountExportResponse as InternalAccountExportResponse, - type InternalAccountExportParams as InternalAccountExportParams, + Agents as Agents, + type Agent as Agent, + type AgentAction as AgentAction, + type AgentActionListResponse as AgentActionListResponse, + type AgentActionRejectRequest as AgentActionRejectRequest, + type AgentCreateRequest as AgentCreateRequest, + type AgentCreateResponse as AgentCreateResponse, + type AgentDeviceCode as AgentDeviceCode, + type AgentDeviceCodeRedeemResponse as AgentDeviceCodeRedeemResponse, + type AgentDeviceCodeStatusResponse as AgentDeviceCodeStatusResponse, + type AgentListResponse as AgentListResponse, + type AgentPolicy as AgentPolicy, + type AgentUpdateRequest as AgentUpdateRequest, + type AgentUsage as AgentUsage, + type AgentsDefaultPagination as AgentsDefaultPagination, + type AgentActionsDefaultPagination as AgentActionsDefaultPagination, + type AgentCreateParams as AgentCreateParams, + type AgentUpdateParams as AgentUpdateParams, + type AgentListParams as AgentListParams, + type AgentListApprovalsParams as AgentListApprovalsParams, + type AgentUpdatePolicyParams as AgentUpdatePolicyParams, }; export type AedBeneficiary = API.AedBeneficiary; export type AedExternalAccountCreateInfo = API.AedExternalAccountCreateInfo; + export type AgentTransferDetails = API.AgentTransferDetails; export type BdtBeneficiary = API.BdtBeneficiary; export type BdtExternalAccountCreateInfo = API.BdtExternalAccountCreateInfo; export type BrlExternalAccountCreateInfo = API.BrlExternalAccountCreateInfo; diff --git a/src/internal/types.ts b/src/internal/types.ts index b668dfc0..a050513a 100644 --- a/src/internal/types.ts +++ b/src/internal/types.ts @@ -40,7 +40,6 @@ type OverloadedParameters = : T extends (...args: infer A) => unknown ? A : never; -/* eslint-disable */ /** * These imports attempt to get types from a parent package's dependencies. * Unresolved bare specifiers can trigger [automatic type acquisition][1] in some projects, which @@ -63,19 +62,18 @@ type OverloadedParameters = * * [1]: https://www.typescriptlang.org/tsconfig/#typeAcquisition */ -/** @ts-ignore For users with \@types/node */ +/** @ts-ignore For users with \@types/node */ /* prettier-ignore */ type UndiciTypesRequestInit = NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny; -/** @ts-ignore For users with undici */ +/** @ts-ignore For users with undici */ /* prettier-ignore */ type UndiciRequestInit = NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny; -/** @ts-ignore For users with \@types/bun */ +/** @ts-ignore For users with \@types/bun */ /* prettier-ignore */ type BunRequestInit = globalThis.FetchRequestInit; -/** @ts-ignore For users with node-fetch@2 */ +/** @ts-ignore For users with node-fetch@2 */ /* prettier-ignore */ type NodeFetch2RequestInit = NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny; -/** @ts-ignore For users with node-fetch@3, doesn't need file extension because types are at ./@types/index.d.ts */ +/** @ts-ignore For users with node-fetch@3, doesn't need file extension because types are at ./@types/index.d.ts */ /* prettier-ignore */ type NodeFetch3RequestInit = NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny | NotAny; -/** @ts-ignore For users who use Deno */ +/** @ts-ignore For users who use Deno */ /* prettier-ignore */ type FetchRequestInit = NonNullable[1]>; -/* eslint-enable */ type RequestInits = | NotAny diff --git a/src/resources/agents.ts b/src/resources/agents.ts new file mode 100644 index 00000000..0c43db07 --- /dev/null +++ b/src/resources/agents.ts @@ -0,0 +1,3 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export * from './agents/index'; diff --git a/src/resources/agents/actions.ts b/src/resources/agents/actions.ts new file mode 100644 index 00000000..e76d2c91 --- /dev/null +++ b/src/resources/agents/actions.ts @@ -0,0 +1,85 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../core/resource'; +import * as AgentsAPI from './agents'; +import { APIPromise } from '../../core/api-promise'; +import { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Endpoints for creating and managing agents (experimental), called by the partner's backend using platform credentials. Covers the full agent lifecycle: creation, policy configuration, pausing, deletion, the device code installation flow, and approving or rejecting transactions initiated by agents. + */ +export class Actions extends APIResource { + /** + * Approve a pending agent action, allowing Grid to proceed with execution. The + * action must have status `PENDING_APPROVAL`. Once approved, Grid executes the + * underlying operation (quote execution or transfer) and the action transitions to + * `APPROVED`. For `EXECUTE_QUOTE` actions, note that the underlying quote may have + * expired between submission and approval — in that case the action will + * transition to `FAILED` instead. This endpoint is called by the platform's + * backend using platform credentials, not by the agent itself. + * + * @example + * ```ts + * const agentAction = await client.agents.actions.approve( + * 'actionId', + * { agentId: 'agentId' }, + * ); + * ``` + */ + approve( + actionID: string, + params: ActionApproveParams, + options?: RequestOptions, + ): APIPromise { + const { agentId } = params; + return this._client.post(path`/agents/${agentId}/actions/${actionID}/approve`, options); + } + + /** + * Reject a pending agent action, preventing execution. The action must have status + * `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the + * underlying operation is not executed. This endpoint is called by the platform's + * backend using platform credentials, not by the agent itself. + * + * @example + * ```ts + * const agentAction = await client.agents.actions.reject( + * 'actionId', + * { agentId: 'agentId' }, + * ); + * ``` + */ + reject( + actionID: string, + params: ActionRejectParams, + options?: RequestOptions, + ): APIPromise { + const { agentId, ...body } = params; + return this._client.post(path`/agents/${agentId}/actions/${actionID}/reject`, { body, ...options }); + } +} + +export interface ActionApproveParams { + /** + * System-generated unique agent identifier + */ + agentId: string; +} + +export interface ActionRejectParams { + /** + * Path param: System-generated unique agent identifier + */ + agentId: string; + + /** + * Body param: Optional human-readable reason for the rejection, stored on the + * action and visible to the platform. + */ + reason?: string; +} + +export declare namespace Actions { + export { type ActionApproveParams as ActionApproveParams, type ActionRejectParams as ActionRejectParams }; +} diff --git a/src/resources/agents/agents.ts b/src/resources/agents/agents.ts new file mode 100644 index 00000000..18c7e530 --- /dev/null +++ b/src/resources/agents/agents.ts @@ -0,0 +1,930 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../core/resource'; +import * as QuotesAPI from '../quotes'; +import * as Shared from '../shared'; +import * as TransferInAPI from '../transfer-in'; +import * as ActionsAPI from './actions'; +import { ActionApproveParams, ActionRejectParams, Actions } from './actions'; +import * as DeviceCodesAPI from './device-codes'; +import { DeviceCodes } from './device-codes'; +import * as TransactionsAPI from './transactions'; +import { TransactionApproveParams, TransactionRejectParams, Transactions } from './transactions'; +import * as MeAPI from './me/me'; +import { + Me, + MeCreateTransferInParams, + MeCreateTransferOutParams, + MeListInternalAccountsParams, +} from './me/me'; +import { APIPromise } from '../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../core/pagination'; +import { buildHeaders } from '../../internal/headers'; +import { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Endpoints for creating and managing agents (experimental), called by the partner's backend using platform credentials. Covers the full agent lifecycle: creation, policy configuration, pausing, deletion, the device code installation flow, and approving or rejecting transactions initiated by agents. + */ +export class Agents extends APIResource { + me: MeAPI.Me = new MeAPI.Me(this._client); + deviceCodes: DeviceCodesAPI.DeviceCodes = new DeviceCodesAPI.DeviceCodes(this._client); + transactions: TransactionsAPI.Transactions = new TransactionsAPI.Transactions(this._client); + actions: ActionsAPI.Actions = new ActionsAPI.Actions(this._client); + + /** + * Create a new agent with a specified policy. Returns the created agent and a + * device code that must be redeemed by the agent software to complete + * installation. + * + * @example + * ```ts + * const agentCreateResponse = await client.agents.create({ + * customerId: + * 'Customer:019542f5-b3e7-1d02-0000-000000000001', + * name: 'Payroll Automation Agent', + * policy: { + * defaultExecutionMode: 'AUTO', + * permissions: ['VIEW_TRANSACTIONS'], + * spendingLimits: { + * currency: 'USD', + * perTransactionLimit: 50000, + * }, + * }, + * }); + * ``` + */ + create(body: AgentCreateParams, options?: RequestOptions): APIPromise { + return this._client.post('/agents', { body, ...options }); + } + + /** + * Retrieve an agent by its system-generated ID. + * + * @example + * ```ts + * const agent = await client.agents.retrieve('agentId'); + * ``` + */ + retrieve(agentID: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/agents/${agentID}`, options); + } + + /** + * Update an agent's name or paused state. + * + * @example + * ```ts + * const agent = await client.agents.update('agentId'); + * ``` + */ + update(agentID: string, body: AgentUpdateParams, options?: RequestOptions): APIPromise { + return this._client.patch(path`/agents/${agentID}`, { body, ...options }); + } + + /** + * Retrieve a paginated list of agents for the authenticated platform. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const agent of client.agents.list()) { + * // ... + * } + * ``` + */ + list( + query: AgentListParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList('/agents', DefaultPagination, { query, ...options }); + } + + /** + * Permanently delete an agent. Connected agent software will lose access + * immediately. + * + * @example + * ```ts + * await client.agents.delete('agentId'); + * ``` + */ + delete(agentID: string, options?: RequestOptions): APIPromise { + return this._client.delete(path`/agents/${agentID}`, { + ...options, + headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), + }); + } + + /** + * Retrieve a paginated list of agent actions that require platform approval. + * Filter by `agentId` or `customerId` to scope results to a specific agent or + * customer. Approve or reject individual actions via + * `POST /agents/{agentId}/actions/{actionId}/approve` or + * `POST /agents/{agentId}/actions/{actionId}/reject`. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const agentAction of client.agents.listApprovals()) { + * // ... + * } + * ``` + */ + listApprovals( + query: AgentListApprovalsParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList('/agents/approvals', DefaultPagination, { + query, + ...options, + }); + } + + /** + * Partially update an agent's policy. Only provided fields will be updated; + * omitted fields retain their current values. Policy changes take effect + * immediately. + * + * @example + * ```ts + * const agent = await client.agents.updatePolicy('agentId'); + * ``` + */ + updatePolicy(agentID: string, body: AgentUpdatePolicyParams, options?: RequestOptions): APIPromise { + return this._client.patch(path`/agents/${agentID}/policy`, { body, ...options }); + } +} + +export type AgentsDefaultPagination = DefaultPagination; + +export type AgentActionsDefaultPagination = DefaultPagination; + +/** + * A programmatic agent with scoped permissions and a spending policy, used to + * automate payment workflows. + */ +export interface Agent { + /** + * System-generated unique identifier for the agent. + */ + id: string; + + /** + * Creation timestamp. + */ + createdAt: string; + + /** + * The ID of the customer this agent operates on behalf of. + */ + customerId: string; + + /** + * Whether the agent has been installed and connected (i.e., its device code has + * been redeemed). + */ + isConnected: boolean; + + /** + * Whether the agent is currently paused. Paused agents cannot initiate any + * actions. + */ + isPaused: boolean; + + /** + * Human-readable name for the agent. + */ + name: string; + + /** + * Policy governing what an agent can do, how it executes actions, and its spending + * boundaries. + */ + policy: AgentPolicy; + + /** + * Last update timestamp. + */ + updatedAt: string; + + /** + * Real-time counters tracking the agent's spending and transaction activity + * against its policy limits. + */ + usage: AgentUsage; +} + +/** + * An action submitted by an agent that may require platform approval before + * execution. All agent-initiated operations (quote execution, transfers) are + * represented as AgentActions, giving the platform a consistent object to approve, + * reject, and audit regardless of the underlying operation type. + */ +export interface AgentAction { + /** + * System-generated unique identifier for this action. + */ + id: string; + + /** + * The agent that submitted this action. + */ + agentId: string; + + /** + * When the action was submitted by the agent. + */ + createdAt: string; + + /** + * The customer on whose behalf the action was submitted. + */ + customerId: string; + + /** + * Platform-specific ID of the customer. + */ + platformCustomerId: string; + + /** + * Status of an agent action. + * + * | Status | Description | + * | ------------------ | ---------------------------------------------------------------------- | + * | `PENDING_APPROVAL` | Submitted by the agent, awaiting platform approval before execution | + * | `APPROVED` | Approved by the platform; execution is in progress or completed | + * | `REJECTED` | Rejected by the platform; the underlying transaction was not executed | + * | `FAILED` | Approved but execution failed (e.g. quote expired, insufficient funds) | + */ + status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; + + /** + * The type of action the agent is requesting. + * + * | Type | Description | + * | --------------- | -------------------------------------------------------- | + * | `EXECUTE_QUOTE` | Execute a cross-currency quote | + * | `TRANSFER_OUT` | Transfer from an internal account to an external account | + * | `TRANSFER_IN` | Transfer from an external account to an internal account | + */ + type: 'EXECUTE_QUOTE' | 'TRANSFER_OUT' | 'TRANSFER_IN'; + + /** + * When the action was last updated. + */ + updatedAt: string; + + /** + * The quote being executed. Populated for `EXECUTE_QUOTE` actions; absent for + * transfer actions. Contains the full amount, currency, destination, and rate + * details needed to present an approval decision to the user. + */ + quote?: QuotesAPI.Quote; + + /** + * Human-readable reason provided by the platform when rejecting the action. Only + * present when status is `REJECTED`. + */ + rejectionReason?: string; + + /** + * The resulting transaction, populated once the action has been approved and + * execution has begun. Absent while the action is `PENDING_APPROVAL` or + * `REJECTED`. + */ + transaction?: TransferInAPI.Transaction; + + /** + * Details of a transfer-type agent action (TRANSFER_OUT or TRANSFER_IN). + */ + transferDetails?: Shared.AgentTransferDetails; +} + +export interface AgentActionListResponse { + /** + * List of agent actions matching the filter criteria. + */ + data: Array; + + /** + * Indicates if more results are available beyond this page. + */ + hasMore: boolean; + + /** + * Cursor to retrieve the next page of results (only present if hasMore is true). + */ + nextCursor?: string; + + /** + * Total number of actions matching the criteria (excluding pagination). + */ + totalCount?: number; +} + +export interface AgentActionRejectRequest { + /** + * Optional human-readable reason for the rejection, stored on the action and + * visible to the platform. + */ + reason?: string; +} + +export interface AgentCreateRequest { + /** + * The ID of the customer this agent will operate on behalf of. + */ + customerId: string; + + /** + * Human-readable name to identify the agent. + */ + name: string; + + /** + * Policy governing what an agent can do, how it executes actions, and its spending + * boundaries. + */ + policy: AgentPolicy; +} + +/** + * Response returned when an agent is created, including the agent and a device + * code for installation. + */ +export interface AgentCreateResponse { + /** + * A programmatic agent with scoped permissions and a spending policy, used to + * automate payment workflows. + */ + agent: Agent; + + deviceCode: AgentDeviceCode; +} + +export interface AgentDeviceCode { + /** + * The agent this device code belongs to. + */ + agentId: string; + + /** + * Human-readable device code used to install and connect the agent software. + */ + code: string; + + /** + * Timestamp when this device code expires. + */ + expiresAt: string; + + /** + * Whether this device code has already been redeemed by the agent. + */ + redeemed: boolean; +} + +export interface AgentDeviceCodeRedeemResponse { + /** + * Bearer token used to authenticate all subsequent API calls as this agent. Pass + * as `Authorization: Bearer `. This token is returned only once and + * must be stored securely — it cannot be retrieved again. + */ + accessToken: string; + + /** + * The agent's system-generated ID. + */ + agentId: string; + + /** + * The agent's name. + */ + agentName: string; + + /** + * Policy governing what an agent can do, how it executes actions, and its spending + * boundaries. + */ + policy: AgentPolicy; +} + +export interface AgentDeviceCodeStatusResponse { + /** + * The device code. + */ + code: string; + + /** + * Whether this device code has been redeemed. + */ + redeemed: boolean; +} + +export interface AgentListResponse { + /** + * List of agents matching the filter criteria. + */ + data: Array; + + /** + * Indicates if more results are available beyond this page. + */ + hasMore: boolean; + + /** + * Cursor to retrieve the next page of results (only present if hasMore is true). + */ + nextCursor?: string; + + /** + * Total number of agents matching the criteria (excluding pagination). + */ + totalCount?: number; +} + +/** + * Policy governing what an agent can do, how it executes actions, and its spending + * boundaries. + */ +export interface AgentPolicy { + /** + * Execution mode controlling whether agent actions require human approval. AUTO: + * The agent can execute actions autonomously without explicit approval. + * APPROVAL_REQUIRED: All agent actions require explicit human approval before + * execution. + */ + defaultExecutionMode: 'AUTO' | 'APPROVAL_REQUIRED'; + + /** + * List of permissions granted to the agent. + */ + permissions: Array< + 'VIEW_TRANSACTIONS' | 'CREATE_TRANSFERS' | 'CREATE_QUOTES' | 'EXECUTE_QUOTES' | 'MANAGE_EXTERNAL_ACCOUNTS' + >; + + /** + * Spending limits that cap the agent's transaction amounts and frequency. All + * amount fields are integers in the smallest unit of the specified currency. When + * a transaction is denominated in a different currency, Grid converts using the + * exchange rate at evaluation time. + */ + spendingLimits: AgentPolicy.SpendingLimits; + + /** + * Optional restrictions that limit the agent to specific accounts or override + * policy per account. + */ + accountRestrictions?: AgentPolicy.AccountRestrictions; + + /** + * Thresholds that force approval for high-value transactions, overriding the + * default execution mode. When a transaction is denominated in a different + * currency than the threshold, Grid converts using the exchange rate at evaluation + * time. + */ + approvalThresholds?: AgentPolicy.ApprovalThresholds; +} + +export namespace AgentPolicy { + /** + * Spending limits that cap the agent's transaction amounts and frequency. All + * amount fields are integers in the smallest unit of the specified currency. When + * a transaction is denominated in a different currency, Grid converts using the + * exchange rate at evaluation time. + */ + export interface SpendingLimits { + /** + * ISO 4217 currency code that all amount limits are denominated in. + */ + currency: string; + + /** + * Maximum amount the agent can transfer in a single transaction. + */ + perTransactionLimit: number; + + /** + * Maximum total amount the agent can transfer per day. Null means no daily limit. + */ + dailyLimit?: number | null; + + /** + * Maximum number of transactions the agent can initiate per day. + */ + dailyTransactionLimit?: number; + + /** + * Maximum total amount the agent can transfer per month. Null means no monthly + * limit. + */ + monthlyLimit?: number | null; + } + + /** + * Optional restrictions that limit the agent to specific accounts or override + * policy per account. + */ + export interface AccountRestrictions { + /** + * Per-account rules that override the agent's default policy for specific + * accounts. + */ + accountRules?: Array; + + /** + * If set, restricts the agent to operate only on the specified internal account + * IDs. Null means the agent can access all accounts. + */ + allowedAccountIds?: Array | null; + } + + export namespace AccountRestrictions { + /** + * Per-account policy override that takes precedence over the agent's default + * policy for a specific account. + */ + export interface AccountRule { + /** + * The internal account ID this rule applies to. + */ + accountId: string; + + /** + * Execution mode controlling whether agent actions require human approval. AUTO: + * The agent can execute actions autonomously without explicit approval. + * APPROVAL_REQUIRED: All agent actions require explicit human approval before + * execution. + */ + executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; + + /** + * Per-transaction limit override, in the smallest unit of the relevant currency. + * Null inherits from the agent's spending limits. + */ + perTransactionLimit?: number | null; + } + } + + /** + * Thresholds that force approval for high-value transactions, overriding the + * default execution mode. When a transaction is denominated in a different + * currency than the threshold, Grid converts using the exchange rate at evaluation + * time. + */ + export interface ApprovalThresholds { + /** + * If set, any transaction above this amount (in the smallest unit of the specified + * currency) will require explicit approval even when the agent's + * defaultExecutionMode is AUTO. Null means no threshold override. + */ + amount?: number | null; + + /** + * ISO 4217 currency code that the amount threshold is denominated in. Required + * when amount is set. + */ + currency?: string; + } +} + +/** + * Partial update to an agent's basic fields. At least one field must be provided. + */ +export interface AgentUpdateRequest { + /** + * Set to true to pause the agent or false to resume it. + */ + isPaused?: boolean; + + /** + * Updated name for the agent. + */ + name?: string; +} + +/** + * Real-time counters tracking the agent's spending and transaction activity + * against its policy limits. + */ +export interface AgentUsage { + /** + * Total amount spent by the agent today, in the smallest unit of the policy's + * `spendingLimits.currency`. + */ + dailySpend: number; + + /** + * Number of transactions initiated by the agent today. + */ + dailyTransactionCount: number; + + /** + * Total amount spent by the agent this month, in the smallest unit of the policy's + * `spendingLimits.currency`. + */ + monthlySpend: number; + + /** + * The date when daily usage counters will reset. + */ + dailyResetDate?: string; + + /** + * The year-month (YYYY-MM) when monthly usage counters will reset. + */ + monthlyResetMonth?: string; +} + +export interface AgentCreateParams { + /** + * The ID of the customer this agent will operate on behalf of. + */ + customerId: string; + + /** + * Human-readable name to identify the agent. + */ + name: string; + + /** + * Policy governing what an agent can do, how it executes actions, and its spending + * boundaries. + */ + policy: AgentPolicy; +} + +export interface AgentUpdateParams { + /** + * Set to true to pause the agent or false to resume it. + */ + isPaused?: boolean; + + /** + * Updated name for the agent. + */ + name?: string; +} + +export interface AgentListParams extends DefaultPaginationParams { + /** + * Filter agents created after this timestamp (inclusive) + */ + createdAfter?: string; + + /** + * Filter agents created before this timestamp (inclusive) + */ + createdBefore?: string; + + /** + * Filter by customer ID + */ + customerId?: string; + + /** + * Filter by connection status (whether the device code has been redeemed) + */ + isConnected?: boolean; + + /** + * Filter by paused status + */ + isPaused?: boolean; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; + + /** + * Filter agents updated after this timestamp (inclusive) + */ + updatedAfter?: string; + + /** + * Filter agents updated before this timestamp (inclusive) + */ + updatedBefore?: string; +} + +export interface AgentListApprovalsParams extends DefaultPaginationParams { + /** + * Filter by agent ID + */ + agentId?: string; + + /** + * Filter by customer ID + */ + customerId?: string; + + /** + * Filter by end date (inclusive) in ISO 8601 format + */ + endDate?: string; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; + + /** + * Order to sort results in + */ + sortOrder?: 'asc' | 'desc'; + + /** + * Filter by start date (inclusive) in ISO 8601 format + */ + startDate?: string; +} + +export interface AgentUpdatePolicyParams { + /** + * Optional restrictions that limit the agent to specific accounts or override + * policy per account. + */ + accountRestrictions?: AgentUpdatePolicyParams.AccountRestrictions; + + /** + * Thresholds that force approval for high-value transactions, overriding the + * default execution mode. When a transaction is denominated in a different + * currency than the threshold, Grid converts using the exchange rate at evaluation + * time. + */ + approvalThresholds?: AgentUpdatePolicyParams.ApprovalThresholds; + + /** + * Execution mode controlling whether agent actions require human approval. AUTO: + * The agent can execute actions autonomously without explicit approval. + * APPROVAL_REQUIRED: All agent actions require explicit human approval before + * execution. + */ + defaultExecutionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; + + /** + * Updated list of permissions. Replaces the entire permissions list when provided. + */ + permissions?: Array< + 'VIEW_TRANSACTIONS' | 'CREATE_TRANSFERS' | 'CREATE_QUOTES' | 'EXECUTE_QUOTES' | 'MANAGE_EXTERNAL_ACCOUNTS' + >; + + /** + * Partial update to spending limits. Only provided fields will be updated; omitted + * fields retain their current values. + */ + spendingLimits?: AgentUpdatePolicyParams.SpendingLimits; +} + +export namespace AgentUpdatePolicyParams { + /** + * Optional restrictions that limit the agent to specific accounts or override + * policy per account. + */ + export interface AccountRestrictions { + /** + * Per-account rules that override the agent's default policy for specific + * accounts. + */ + accountRules?: Array; + + /** + * If set, restricts the agent to operate only on the specified internal account + * IDs. Null means the agent can access all accounts. + */ + allowedAccountIds?: Array | null; + } + + export namespace AccountRestrictions { + /** + * Per-account policy override that takes precedence over the agent's default + * policy for a specific account. + */ + export interface AccountRule { + /** + * The internal account ID this rule applies to. + */ + accountId: string; + + /** + * Execution mode controlling whether agent actions require human approval. AUTO: + * The agent can execute actions autonomously without explicit approval. + * APPROVAL_REQUIRED: All agent actions require explicit human approval before + * execution. + */ + executionMode?: 'AUTO' | 'APPROVAL_REQUIRED'; + + /** + * Per-transaction limit override, in the smallest unit of the relevant currency. + * Null inherits from the agent's spending limits. + */ + perTransactionLimit?: number | null; + } + } + + /** + * Thresholds that force approval for high-value transactions, overriding the + * default execution mode. When a transaction is denominated in a different + * currency than the threshold, Grid converts using the exchange rate at evaluation + * time. + */ + export interface ApprovalThresholds { + /** + * If set, any transaction above this amount (in the smallest unit of the specified + * currency) will require explicit approval even when the agent's + * defaultExecutionMode is AUTO. Null means no threshold override. + */ + amount?: number | null; + + /** + * ISO 4217 currency code that the amount threshold is denominated in. Required + * when amount is set. + */ + currency?: string; + } + + /** + * Partial update to spending limits. Only provided fields will be updated; omitted + * fields retain their current values. + */ + export interface SpendingLimits { + /** + * ISO 4217 currency code that all amount limits are denominated in. Updating this + * recasts all existing limits into the new currency denomination. + */ + currency?: string; + + /** + * Maximum daily spend. Set to null to remove the daily limit. + */ + dailyLimit?: number | null; + + /** + * Maximum number of transactions per day. + */ + dailyTransactionLimit?: number; + + /** + * Maximum monthly spend. Set to null to remove the monthly limit. + */ + monthlyLimit?: number | null; + + /** + * Maximum amount per transaction. + */ + perTransactionLimit?: number; + } +} + +Agents.Me = Me; +Agents.DeviceCodes = DeviceCodes; +Agents.Transactions = Transactions; +Agents.Actions = Actions; + +export declare namespace Agents { + export { + type Agent as Agent, + type AgentAction as AgentAction, + type AgentActionListResponse as AgentActionListResponse, + type AgentActionRejectRequest as AgentActionRejectRequest, + type AgentCreateRequest as AgentCreateRequest, + type AgentCreateResponse as AgentCreateResponse, + type AgentDeviceCode as AgentDeviceCode, + type AgentDeviceCodeRedeemResponse as AgentDeviceCodeRedeemResponse, + type AgentDeviceCodeStatusResponse as AgentDeviceCodeStatusResponse, + type AgentListResponse as AgentListResponse, + type AgentPolicy as AgentPolicy, + type AgentUpdateRequest as AgentUpdateRequest, + type AgentUsage as AgentUsage, + type AgentsDefaultPagination as AgentsDefaultPagination, + type AgentActionsDefaultPagination as AgentActionsDefaultPagination, + type AgentCreateParams as AgentCreateParams, + type AgentUpdateParams as AgentUpdateParams, + type AgentListParams as AgentListParams, + type AgentListApprovalsParams as AgentListApprovalsParams, + type AgentUpdatePolicyParams as AgentUpdatePolicyParams, + }; + + export { + Me as Me, + type MeCreateTransferInParams as MeCreateTransferInParams, + type MeCreateTransferOutParams as MeCreateTransferOutParams, + type MeListInternalAccountsParams as MeListInternalAccountsParams, + }; + + export { DeviceCodes as DeviceCodes }; + + export { + Transactions as Transactions, + type TransactionApproveParams as TransactionApproveParams, + type TransactionRejectParams as TransactionRejectParams, + }; + + export { + Actions as Actions, + type ActionApproveParams as ActionApproveParams, + type ActionRejectParams as ActionRejectParams, + }; +} diff --git a/src/resources/agents/device-codes.ts b/src/resources/agents/device-codes.ts new file mode 100644 index 00000000..1964f9b2 --- /dev/null +++ b/src/resources/agents/device-codes.ts @@ -0,0 +1,59 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../core/resource'; +import * as AgentsAPI from './agents'; +import { APIPromise } from '../../core/api-promise'; +import { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Endpoints for creating and managing agents (experimental), called by the partner's backend using platform credentials. Covers the full agent lifecycle: creation, policy configuration, pausing, deletion, the device code installation flow, and approving or rejecting transactions initiated by agents. + */ +export class DeviceCodes extends APIResource { + /** + * Check whether a device code has been redeemed. Use this to poll for agent + * installation completion after creating an agent. + * + * @example + * ```ts + * const agentDeviceCodeStatusResponse = + * await client.agents.deviceCodes.getStatus('code'); + * ``` + */ + getStatus(code: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/agents/device-codes/${code}/status`, options); + } + + /** + * Redeem a device code to obtain agent credentials. This endpoint is called by the + * agent software during installation. On success, returns a Bearer access token + * that the agent uses for all subsequent API calls. The token is returned only + * once and must be stored securely. This endpoint does not require platform + * authentication — the device code itself serves as proof of authorization. + * + * @example + * ```ts + * const agentDeviceCodeRedeemResponse = + * await client.agents.deviceCodes.redeem('code'); + * ``` + */ + redeem(code: string, options?: RequestOptions): APIPromise { + return this._client.post(path`/agents/device-codes/${code}/redeem`, options); + } + + /** + * Generate a new device code for an existing agent. Use this when the original + * device code has expired before being redeemed, or when the agent software needs + * to be reinstalled. Any previously issued unredeemed device codes for this agent + * are invalidated. + * + * @example + * ```ts + * const agentDeviceCode = + * await client.agents.deviceCodes.regenerate('agentId'); + * ``` + */ + regenerate(agentID: string, options?: RequestOptions): APIPromise { + return this._client.post(path`/agents/${agentID}/device-codes`, options); + } +} diff --git a/src/resources/agents/index.ts b/src/resources/agents/index.ts new file mode 100644 index 00000000..5b9a1f3f --- /dev/null +++ b/src/resources/agents/index.ts @@ -0,0 +1,34 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export { Actions, type ActionApproveParams, type ActionRejectParams } from './actions'; +export { + Agents, + type Agent, + type AgentAction, + type AgentActionListResponse, + type AgentActionRejectRequest, + type AgentCreateRequest, + type AgentCreateResponse, + type AgentDeviceCode, + type AgentDeviceCodeRedeemResponse, + type AgentDeviceCodeStatusResponse, + type AgentListResponse, + type AgentPolicy, + type AgentUpdateRequest, + type AgentUsage, + type AgentCreateParams, + type AgentUpdateParams, + type AgentListParams, + type AgentListApprovalsParams, + type AgentUpdatePolicyParams, + type AgentActionsDefaultPagination, + type AgentsDefaultPagination, +} from './agents'; +export { DeviceCodes } from './device-codes'; +export { + Me, + type MeCreateTransferInParams, + type MeCreateTransferOutParams, + type MeListInternalAccountsParams, +} from './me/index'; +export { Transactions, type TransactionApproveParams, type TransactionRejectParams } from './transactions'; diff --git a/src/resources/agents/me.ts b/src/resources/agents/me.ts new file mode 100644 index 00000000..54b12df0 --- /dev/null +++ b/src/resources/agents/me.ts @@ -0,0 +1,3 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export * from './me/index'; diff --git a/src/resources/agents/me/actions.ts b/src/resources/agents/me/actions.ts new file mode 100644 index 00000000..d2d998df --- /dev/null +++ b/src/resources/agents/me/actions.ts @@ -0,0 +1,71 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../core/resource'; +import * as AgentsAPI from '../agents'; +import { AgentActionsDefaultPagination } from '../agents'; +import { APIPromise } from '../../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../../core/pagination'; +import { RequestOptions } from '../../../internal/request-options'; +import { path } from '../../../internal/utils/path'; + +/** + * Endpoints called by the agent itself using its own credentials (obtained via device code redemption). Scoped to the agent's associated customer — all requests automatically operate on behalf of that customer and are subject to the agent's policy. When an action requires approval, the resulting transaction enters a pending state and must be approved by the platform via `POST /transactions/{transactionId}/approve`. + */ +export class Actions extends APIResource { + /** + * Retrieve a specific action submitted by the authenticated agent. Poll this + * endpoint after submitting an action that requires approval to check whether it + * has been approved, rejected, or has failed. + * + * @example + * ```ts + * const agentAction = await client.agents.me.actions.retrieve( + * 'actionId', + * ); + * ``` + */ + retrieve(actionID: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/agents/me/actions/${actionID}`, options); + } + + /** + * Retrieve a paginated list of actions submitted by the authenticated agent. Use + * this to poll for approval decisions after submitting an action that requires + * approval. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const agentAction of client.agents.me.actions.list()) { + * // ... + * } + * ``` + */ + list( + query: ActionListParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList('/agents/me/actions', DefaultPagination, { + query, + ...options, + }); + } +} + +export interface ActionListParams extends DefaultPaginationParams { + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; + + /** + * Filter by action status + */ + status?: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'FAILED'; +} + +export declare namespace Actions { + export { type ActionListParams as ActionListParams }; +} + +export { type AgentActionsDefaultPagination }; diff --git a/src/resources/agents/me/external-accounts.ts b/src/resources/agents/me/external-accounts.ts new file mode 100644 index 00000000..52ba7460 --- /dev/null +++ b/src/resources/agents/me/external-accounts.ts @@ -0,0 +1,217 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../core/resource'; +import * as Shared from '../../shared'; +import * as ExternalAccountsAPI from '../../customers/external-accounts'; +import { ExternalAccountsDefaultPagination } from '../../customers/external-accounts'; +import { APIPromise } from '../../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../../core/pagination'; +import { buildHeaders } from '../../../internal/headers'; +import { RequestOptions } from '../../../internal/request-options'; +import { path } from '../../../internal/utils/path'; + +/** + * Endpoints called by the agent itself using its own credentials (obtained via device code redemption). Scoped to the agent's associated customer — all requests automatically operate on behalf of that customer and are subject to the agent's policy. When an action requires approval, the resulting transaction enters a pending state and must be approved by the platform via `POST /transactions/{transactionId}/approve`. + */ +export class ExternalAccounts extends APIResource { + /** + * Retrieve an external account belonging to the authenticated agent's customer. + * Returns 404 if the account exists but belongs to a different customer. Requires + * the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy. + * + * @example + * ```ts + * const externalAccount = + * await client.agents.me.externalAccounts.retrieve( + * 'externalAccountId', + * ); + * ``` + */ + retrieve( + externalAccountID: string, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/agents/me/external-accounts/${externalAccountID}`, options); + } + + /** + * Retrieve a paginated list of external accounts belonging to the authenticated + * agent's customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the + * agent's policy. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const externalAccount of client.agents.me.externalAccounts.list()) { + * // ... + * } + * ``` + */ + list( + query: ExternalAccountListParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList( + '/agents/me/external-accounts', + DefaultPagination, + { query, ...options }, + ); + } + + /** + * Delete an external account belonging to the authenticated agent's customer. + * Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's policy. + * + * @example + * ```ts + * await client.agents.me.externalAccounts.delete( + * 'externalAccountId', + * ); + * ``` + */ + delete(externalAccountID: string, options?: RequestOptions): APIPromise { + return this._client.delete(path`/agents/me/external-accounts/${externalAccountID}`, { + ...options, + headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), + }); + } + + /** + * Register a new external bank account or wallet for the authenticated agent's + * customer. Requires the MANAGE_EXTERNAL_ACCOUNTS permission in the agent's + * policy. The `customerId` field is optional and will be inferred from the agent's + * associated customer if omitted. + * + * @example + * ```ts + * const externalAccount = + * await client.agents.me.externalAccounts.add({ + * accountInfo: { + * accountType: 'USD_ACCOUNT', + * accountNumber: '12345678901', + * routingNumber: '123456789', + * beneficiary: { + * beneficiaryType: 'INDIVIDUAL', + * fullName: 'John Doe', + * birthDate: '1990-01-15', + * nationality: 'US', + * address: { + * line1: '123 Main Street', + * city: 'San Francisco', + * state: 'CA', + * postalCode: '94105', + * country: 'US', + * }, + * }, + * }, + * currency: 'USD', + * }); + * ``` + */ + add( + body: ExternalAccountAddParams, + options?: RequestOptions, + ): APIPromise { + return this._client.post('/agents/me/external-accounts', { body, ...options }); + } +} + +export interface ExternalAccountListParams extends DefaultPaginationParams { + /** + * Filter by currency code + */ + currency?: string; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; +} + +export interface ExternalAccountAddParams { + /** + * Lightning payment destination. Exactly one of `invoice`, `bolt12`, or + * `lightningAddress` must be provided. + */ + accountInfo: + | Shared.AedExternalAccountCreateInfo + | Shared.BrlExternalAccountCreateInfo + | Shared.BwpExternalAccountCreateInfo + | Shared.CadExternalAccountCreateInfo + | Shared.DkkExternalAccountCreateInfo + | Shared.EurExternalAccountCreateInfo + | Shared.GbpExternalAccountCreateInfo + | Shared.HkdExternalAccountCreateInfo + | Shared.IdrExternalAccountCreateInfo + | Shared.InrExternalAccountCreateInfo + | Shared.KesExternalAccountCreateInfo + | Shared.MwkExternalAccountCreateInfo + | Shared.MxnExternalAccountCreateInfo + | Shared.MyrExternalAccountCreateInfo + | Shared.NgnExternalAccountCreateInfo + | Shared.PhpExternalAccountCreateInfo + | Shared.RwfExternalAccountCreateInfo + | Shared.SgdExternalAccountCreateInfo + | Shared.ThbExternalAccountCreateInfo + | Shared.TzsExternalAccountCreateInfo + | Shared.UgxExternalAccountCreateInfo + | Shared.UsdExternalAccountCreateInfo + | Shared.VndExternalAccountCreateInfo + | Shared.XafExternalAccountCreateInfo + | Shared.XofExternalAccountCreateInfo + | Shared.ZarExternalAccountCreateInfo + | Shared.ZmwExternalAccountCreateInfo + | Shared.BdtExternalAccountCreateInfo + | Shared.CopExternalAccountCreateInfo + | Shared.EgpExternalAccountCreateInfo + | Shared.GhsExternalAccountCreateInfo + | Shared.GtqExternalAccountCreateInfo + | Shared.HtgExternalAccountCreateInfo + | Shared.JmdExternalAccountCreateInfo + | Shared.PkrExternalAccountCreateInfo + | ExternalAccountsAPI.SparkWalletInfo + | ExternalAccountsAPI.LightningWalletInfo + | ExternalAccountsAPI.SolanaWalletInfo + | ExternalAccountsAPI.TronWalletInfo + | ExternalAccountsAPI.PolygonWalletInfo + | ExternalAccountsAPI.BaseWalletInfo + | Shared.EthereumWalletExternalAccountInfo; + + /** + * The ISO 4217 currency code + */ + currency: string; + + /** + * The ID of the customer for whom to create the external account. If not provided, + * the external account will be created on behalf of the platform. + */ + customerId?: string; + + /** + * Whether to set the external account as the default UMA deposit account. When set + * to true, incoming payments to this customer's UMA address will be automatically + * deposited into this external account. False if not provided. Note that only one + * external account can be set as the default UMA deposit account for a customer, + * so if there is already a default UMA deposit account, this will override the + * existing default UMA deposit account. If there is no default UMA deposit + * account, incoming UMA payments will be deposited into the primary internal + * account for the customer. + */ + defaultUmaDepositAccount?: boolean; + + /** + * Your platform's identifier for the account in your system. This can be used to + * reference the account by your own identifier. + */ + platformAccountId?: string; +} + +export declare namespace ExternalAccounts { + export { + type ExternalAccountListParams as ExternalAccountListParams, + type ExternalAccountAddParams as ExternalAccountAddParams, + }; +} + +export { type ExternalAccountsDefaultPagination }; diff --git a/src/resources/agents/me/index.ts b/src/resources/agents/me/index.ts new file mode 100644 index 00000000..53d25b0b --- /dev/null +++ b/src/resources/agents/me/index.ts @@ -0,0 +1,16 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export { Actions, type ActionListParams } from './actions'; +export { + ExternalAccounts, + type ExternalAccountListParams, + type ExternalAccountAddParams, +} from './external-accounts'; +export { + Me, + type MeCreateTransferInParams, + type MeCreateTransferOutParams, + type MeListInternalAccountsParams, +} from './me'; +export { Quotes, type QuoteCreateParams, type QuoteExecuteParams } from './quotes'; +export { Transactions, type TransactionListParams } from './transactions'; diff --git a/src/resources/agents/me/me.ts b/src/resources/agents/me/me.ts new file mode 100644 index 00000000..f727a61b --- /dev/null +++ b/src/resources/agents/me/me.ts @@ -0,0 +1,250 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../core/resource'; +import * as TransferInAPI from '../../transfer-in'; +import * as AgentsAPI from '../agents'; +import * as InternalAccountsAPI from '../../sandbox/internal-accounts'; +import { InternalAccountsDefaultPagination } from '../../sandbox/internal-accounts'; +import * as ActionsAPI from './actions'; +import { ActionListParams, Actions } from './actions'; +import * as ExternalAccountsAPI from './external-accounts'; +import { ExternalAccountAddParams, ExternalAccountListParams, ExternalAccounts } from './external-accounts'; +import * as QuotesAPI from './quotes'; +import { QuoteCreateParams, QuoteExecuteParams, Quotes } from './quotes'; +import * as TransactionsAPI from './transactions'; +import { TransactionListParams, Transactions } from './transactions'; +import { APIPromise } from '../../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../../core/pagination'; +import { buildHeaders } from '../../../internal/headers'; +import { RequestOptions } from '../../../internal/request-options'; + +/** + * Endpoints called by the agent itself using its own credentials (obtained via device code redemption). Scoped to the agent's associated customer — all requests automatically operate on behalf of that customer and are subject to the agent's policy. When an action requires approval, the resulting transaction enters a pending state and must be approved by the platform via `POST /transactions/{transactionId}/approve`. + */ +export class Me extends APIResource { + transactions: TransactionsAPI.Transactions = new TransactionsAPI.Transactions(this._client); + quotes: QuotesAPI.Quotes = new QuotesAPI.Quotes(this._client); + externalAccounts: ExternalAccountsAPI.ExternalAccounts = new ExternalAccountsAPI.ExternalAccounts( + this._client, + ); + actions: ActionsAPI.Actions = new ActionsAPI.Actions(this._client); + + /** + * Retrieve the authenticated agent's own profile, policy, and current usage. This + * endpoint is called by the agent software itself using its own credentials + * (obtained via device code redemption) rather than platform credentials. + * + * @example + * ```ts + * const agent = await client.agents.me.retrieve(); + * ``` + */ + retrieve(options?: RequestOptions): APIPromise { + return this._client.get('/agents/me', options); + } + + /** + * Transfer funds from an external account to an internal account for the + * authenticated agent's customer. Accounts must belong to the agent's customer. + * Requires the CREATE_TRANSFERS permission in the agent's policy. If the agent's + * policy requires approval for this amount, the transaction will be created in a + * pending state and must be approved by the platform via + * `POST /agents/{agentId}/actions/{actionId}/approve`. This endpoint should only + * be used for external account sources with pull functionality (e.g. ACH Pull). + * Otherwise, use the payment instructions on the internal account to deposit + * funds. + * + * @example + * ```ts + * const agentAction = await client.agents.me.createTransferIn( + * { + * destination: { + * accountId: + * 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', + * }, + * source: { + * accountId: + * 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', + * }, + * amount: 12550, + * }, + * ); + * ``` + */ + createTransferIn( + params: MeCreateTransferInParams, + options?: RequestOptions, + ): APIPromise { + const { 'Idempotency-Key': idempotencyKey, ...body } = params; + return this._client.post('/agents/me/transfer-in', { + body, + ...options, + headers: buildHeaders([ + { ...(idempotencyKey != null ? { 'Idempotency-Key': idempotencyKey } : undefined) }, + options?.headers, + ]), + }); + } + + /** + * Transfer funds from an internal account to an external account for the + * authenticated agent's customer. Accounts must belong to the agent's customer. + * Requires the CREATE_TRANSFERS permission in the agent's policy. If the agent's + * policy requires approval for this amount, the transaction will be created in a + * pending state and must be approved by the platform via + * `POST /agents/{agentId}/actions/{actionId}/approve`. + * + * @example + * ```ts + * const agentAction = + * await client.agents.me.createTransferOut({ + * destination: { + * accountId: + * 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', + * }, + * source: { + * accountId: + * 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', + * }, + * amount: 12550, + * }); + * ``` + */ + createTransferOut( + params: MeCreateTransferOutParams, + options?: RequestOptions, + ): APIPromise { + const { 'Idempotency-Key': idempotencyKey, ...body } = params; + return this._client.post('/agents/me/transfer-out', { + body, + ...options, + headers: buildHeaders([ + { ...(idempotencyKey != null ? { 'Idempotency-Key': idempotencyKey } : undefined) }, + options?.headers, + ]), + }); + } + + /** + * Retrieve the internal accounts belonging to the customer this agent operates on + * behalf of. Use this to discover available source accounts for transfers and + * quotes, and to verify which accounts are accessible under the agent's + * `accountRestrictions` policy. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const internalAccount of client.agents.me.listInternalAccounts()) { + * // ... + * } + * ``` + */ + listInternalAccounts( + query: MeListInternalAccountsParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList( + '/agents/me/internal-accounts', + DefaultPagination, + { query, ...options }, + ); + } +} + +export interface MeCreateTransferInParams { + /** + * Body param: Destination internal account details + */ + destination: TransferInAPI.InternalAccountReference; + + /** + * Body param: Source external account details + */ + source: TransferInAPI.ExternalAccountReference; + + /** + * Body param: Amount in the smallest unit of the currency (e.g., cents for + * USD/EUR, satoshis for BTC) + */ + amount?: number; + + /** + * Header param: A unique identifier for the request. If the same key is sent + * multiple times, the server will return the same response as the first request. + */ + 'Idempotency-Key'?: string; +} + +export interface MeCreateTransferOutParams { + /** + * Body param: Destination external account details + */ + destination: TransferInAPI.ExternalAccountReference; + + /** + * Body param: Source internal account details + */ + source: TransferInAPI.InternalAccountReference; + + /** + * Body param: Amount in the smallest unit of the currency (e.g., cents for + * USD/EUR, satoshis for BTC) + */ + amount?: number; + + /** + * Header param: A unique identifier for the request. If the same key is sent + * multiple times, the server will return the same response as the first request. + */ + 'Idempotency-Key'?: string; +} + +export interface MeListInternalAccountsParams extends DefaultPaginationParams { + /** + * Filter by currency code + */ + currency?: string; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; + + /** + * Filter by internal account type. Use `EMBEDDED_WALLET` to find the + * self-custodial wallet provisioned for the customer, or `INTERNAL_FIAT` / + * `INTERNAL_CRYPTO` for platform-managed holding accounts. + */ + type?: 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET'; +} + +Me.Transactions = Transactions; +Me.Quotes = Quotes; +Me.ExternalAccounts = ExternalAccounts; +Me.Actions = Actions; + +export declare namespace Me { + export { + type MeCreateTransferInParams as MeCreateTransferInParams, + type MeCreateTransferOutParams as MeCreateTransferOutParams, + type MeListInternalAccountsParams as MeListInternalAccountsParams, + }; + + export { Transactions as Transactions, type TransactionListParams as TransactionListParams }; + + export { + Quotes as Quotes, + type QuoteCreateParams as QuoteCreateParams, + type QuoteExecuteParams as QuoteExecuteParams, + }; + + export { + ExternalAccounts as ExternalAccounts, + type ExternalAccountListParams as ExternalAccountListParams, + type ExternalAccountAddParams as ExternalAccountAddParams, + }; + + export { Actions as Actions, type ActionListParams as ActionListParams }; +} + +export { type InternalAccountsDefaultPagination }; diff --git a/src/resources/agents/me/quotes.ts b/src/resources/agents/me/quotes.ts new file mode 100644 index 00000000..ee3d0185 --- /dev/null +++ b/src/resources/agents/me/quotes.ts @@ -0,0 +1,214 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../core/resource'; +import * as QuotesAPI from '../../quotes'; +import * as AgentsAPI from '../agents'; +import { APIPromise } from '../../../core/api-promise'; +import { buildHeaders } from '../../../internal/headers'; +import { RequestOptions } from '../../../internal/request-options'; +import { path } from '../../../internal/utils/path'; + +/** + * Endpoints called by the agent itself using its own credentials (obtained via device code redemption). Scoped to the agent's associated customer — all requests automatically operate on behalf of that customer and are subject to the agent's policy. When an action requires approval, the resulting transaction enters a pending state and must be approved by the platform via `POST /transactions/{transactionId}/approve`. + */ +export class Quotes extends APIResource { + /** + * Generate a quote for a cross-currency transfer on behalf of the authenticated + * agent's customer. Accounts referenced in the request must belong to the agent's + * customer. Requires the CREATE_QUOTES permission in the agent's policy. If the + * agent's defaultExecutionMode is APPROVAL_REQUIRED, or the quote amount exceeds + * the agent's approvalThresholds, the resulting transaction will require explicit + * approval before funds move. + * + * @example + * ```ts + * const quote = await client.agents.me.quotes.create({ + * destination: { + * accountId: + * 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', + * destinationType: 'ACCOUNT', + * }, + * lockedCurrencyAmount: 1000, + * lockedCurrencySide: 'SENDING', + * source: { + * accountId: + * 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', + * sourceType: 'ACCOUNT', + * }, + * }); + * ``` + */ + create(params: QuoteCreateParams, options?: RequestOptions): APIPromise { + const { 'Idempotency-Key': idempotencyKey, ...body } = params; + return this._client.post('/agents/me/quotes', { + body, + ...options, + headers: buildHeaders([ + { ...(idempotencyKey != null ? { 'Idempotency-Key': idempotencyKey } : undefined) }, + options?.headers, + ]), + }); + } + + /** + * Retrieve a quote created by the authenticated agent. Returns 404 if the quote + * exists but was not created by this agent. + * + * @example + * ```ts + * const quote = await client.agents.me.quotes.retrieve( + * 'quoteId', + * ); + * ``` + */ + retrieve(quoteID: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/agents/me/quotes/${quoteID}`, options); + } + + /** + * Execute a quote created by the authenticated agent. Requires the EXECUTE_QUOTES + * permission in the agent's policy. If the agent's policy requires approval for + * this amount (based on execution mode or approval thresholds), the transaction + * will be created in a pending state and must be approved by the platform via + * `POST /agents/{agentId}/actions/{actionId}/approve`. Once executed, the quote + * cannot be cancelled. + * + * @example + * ```ts + * const agentAction = await client.agents.me.quotes.execute( + * 'Quote:019542f5-b3e7-1d02-0000-000000000001', + * ); + * ``` + */ + execute( + quoteID: string, + params: QuoteExecuteParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { 'Grid-Wallet-Signature': gridWalletSignature, 'Idempotency-Key': idempotencyKey } = params ?? {}; + return this._client.post(path`/agents/me/quotes/${quoteID}/execute`, { + ...options, + headers: buildHeaders([ + { + ...(gridWalletSignature != null ? { 'Grid-Wallet-Signature': gridWalletSignature } : undefined), + ...(idempotencyKey != null ? { 'Idempotency-Key': idempotencyKey } : undefined), + }, + options?.headers, + ]), + }); + } +} + +export interface QuoteCreateParams { + /** + * Body param: Destination account details + */ + destination: QuotesAPI.QuoteDestinationOneOf; + + /** + * Body param: The amount to send/receive in the smallest unit of the locked + * currency (eg. cents). See `lockedCurrencySide` for more information. + */ + lockedCurrencyAmount: number; + + /** + * Body param: The side of the quote which should be locked and specified in the + * `lockedCurrencyAmount`. For example, if I want to send exactly $5 MXN from my + * wallet, I would set this to "sending", and the `lockedCurrencyAmount` to 500 (in + * cents). If I want the receiver to receive exactly $10 USD, I would set this to + * "receiving" and the `lockedCurrencyAmount` to 10000 (in cents). + */ + lockedCurrencySide: 'SENDING' | 'RECEIVING'; + + /** + * Body param: Source account details + */ + source: QuotesAPI.QuoteSourceOneOf; + + /** + * Body param: Optional description/memo for the transfer + */ + description?: string; + + /** + * Body param: Whether to immediately execute the quote after creation. If true, + * the quote will be executed and the transaction will be created at the current + * exchange rate. It should only be used if you don't want to lock and view rate + * details before executing the quote. If you are executing a pre-existing quote, + * use the `/quotes/{quoteId}/execute` endpoint instead. This is false by default. + * This can only be used for quotes with a `source` which is either an internal + * account, or has direct pull functionality (e.g. ACH pull with an external + * account). Not supported when the `source` is an internal account of type + * `EMBEDDED_WALLET`: those transfers require a `Grid-Wallet-Signature` over the + * `payloadToSign` returned in the quote response, which is not available in a + * combined create-and-execute call. Create the quote first with + * `immediatelyExecute: false` and then call `POST /quotes/{quoteId}/execute` with + * the signature header. + */ + immediatelyExecute?: boolean; + + /** + * Body param: Lookup ID from a previous receiver lookup request. If provided, this + * can make the quote creation more efficient by reusing cached lookup data. NOTE: + * This is required for UMA destinations due to counterparty institution + * requirements. See `senderCustomerInfo` for more information. + */ + lookupId?: string; + + /** + * Body param: The purpose of the payment. This may be required when sending to + * certain geographies (e.g. India). + */ + purposeOfPayment?: + | 'GIFT' + | 'SELF' + | 'GOODS_OR_SERVICES' + | 'EDUCATION' + | 'HEALTH_OR_MEDICAL' + | 'REAL_ESTATE_PURCHASE' + | 'TAX_PAYMENT' + | 'LOAN_PAYMENT' + | 'UTILITY_BILL' + | 'DONATION' + | 'TRAVEL' + | 'OTHER'; + + /** + * Body param: Key-value pairs of additional information about the sender which was + * requested by the destination. This is relevant when the destination requires + * more sender info than was provided during customer creation. Any fields + * specified in `requiredPayerDataFields` from the response of the + * `/receiver/uma/{receiverUmaAddress}` (lookupUma) or + * `/receiver/external-account/{accountId}` (lookupExternalAccount) endpoints MUST + * be provided here if they were requested. If the destination did not request any + * additional information, this field can be omitted. + */ + senderCustomerInfo?: { [key: string]: unknown }; + + /** + * Header param: A unique identifier for the request. If the same key is sent + * multiple times, the server will return the same response as the first request. + */ + 'Idempotency-Key'?: string; +} + +export interface QuoteExecuteParams { + /** + * Signature over the `payloadToSign` returned in the quote's + * `paymentInstructions[].accountOrWalletInfo` entry, produced with the session + * private key of a verified authentication credential on the source Embedded + * Wallet and base64-encoded. Required when the quote's source is an internal + * account of type `EMBEDDED_WALLET`; ignored for other source types. + */ + 'Grid-Wallet-Signature'?: string; + + /** + * A unique identifier for the request. If the same key is sent multiple times, the + * server will return the same response as the first request. + */ + 'Idempotency-Key'?: string; +} + +export declare namespace Quotes { + export { type QuoteCreateParams as QuoteCreateParams, type QuoteExecuteParams as QuoteExecuteParams }; +} diff --git a/src/resources/agents/me/transactions.ts b/src/resources/agents/me/transactions.ts new file mode 100644 index 00000000..ac6bcbd8 --- /dev/null +++ b/src/resources/agents/me/transactions.ts @@ -0,0 +1,112 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../core/resource'; +import * as TransactionsAPI from '../../transactions'; +import * as TransferInAPI from '../../transfer-in'; +import { TransactionsDefaultPagination } from '../../transfer-in'; +import { APIPromise } from '../../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../../core/pagination'; +import { RequestOptions } from '../../../internal/request-options'; +import { path } from '../../../internal/utils/path'; + +/** + * Endpoints called by the agent itself using its own credentials (obtained via device code redemption). Scoped to the agent's associated customer — all requests automatically operate on behalf of that customer and are subject to the agent's policy. When an action requires approval, the resulting transaction enters a pending state and must be approved by the platform via `POST /transactions/{transactionId}/approve`. + */ +export class Transactions extends APIResource { + /** + * Retrieve a specific transaction belonging to the authenticated agent's customer. + * Returns 404 if the transaction exists but belongs to a different customer. + * + * @example + * ```ts + * const transaction = + * await client.agents.me.transactions.retrieve( + * 'transactionId', + * ); + * ``` + */ + retrieve(transactionID: string, options?: RequestOptions): APIPromise { + return this._client.get(path`/agents/me/transactions/${transactionID}`, options); + } + + /** + * Retrieve a paginated list of transactions for the authenticated agent's + * customer. Results are automatically scoped to the agent's associated customer — + * no customer filter is needed or accepted. + * + * @example + * ```ts + * // Automatically fetches more pages as needed. + * for await (const transaction of client.agents.me.transactions.list()) { + * // ... + * } + * ``` + */ + list( + query: TransactionListParams | null | undefined = {}, + options?: RequestOptions, + ): PagePromise { + return this._client.getAPIList('/agents/me/transactions', DefaultPagination, { + query, + ...options, + }); + } +} + +export interface TransactionListParams extends DefaultPaginationParams { + /** + * Filter by account identifier (matches either sender or receiver) + */ + accountIdentifier?: string; + + /** + * Filter by end date (inclusive) in ISO 8601 format + */ + endDate?: string; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; + + /** + * Filter by receiver account identifier + */ + receiverAccountIdentifier?: string; + + /** + * Filter by reference + */ + reference?: string; + + /** + * Filter by sender account identifier + */ + senderAccountIdentifier?: string; + + /** + * Order to sort results in + */ + sortOrder?: 'asc' | 'desc'; + + /** + * Filter by start date (inclusive) in ISO 8601 format + */ + startDate?: string; + + /** + * Filter by transaction status + */ + status?: TransactionsAPI.TransactionStatus; + + /** + * Filter by transaction type + */ + type?: TransactionsAPI.TransactionType; +} + +export declare namespace Transactions { + export { type TransactionListParams as TransactionListParams }; +} + +export { type TransactionsDefaultPagination }; diff --git a/src/resources/agents/transactions.ts b/src/resources/agents/transactions.ts new file mode 100644 index 00000000..efafb90b --- /dev/null +++ b/src/resources/agents/transactions.ts @@ -0,0 +1,88 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../core/resource'; +import * as AgentsAPI from './agents'; +import { APIPromise } from '../../core/api-promise'; +import { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Endpoints for creating and managing agents (experimental), called by the partner's backend using platform credentials. Covers the full agent lifecycle: creation, policy configuration, pausing, deletion, the device code installation flow, and approving or rejecting transactions initiated by agents. + */ +export class Transactions extends APIResource { + /** + * Approve a pending agent action, allowing Grid to proceed with execution. The + * action must have status `PENDING_APPROVAL`. Once approved, Grid executes the + * underlying operation (quote execution or transfer) and the action transitions to + * `APPROVED`. For `EXECUTE_QUOTE` actions, note that the underlying quote may have + * expired between submission and approval — in that case the action will + * transition to `FAILED` instead. This endpoint is called by the platform's + * backend using platform credentials, not by the agent itself. + * + * @example + * ```ts + * const agentAction = + * await client.agents.transactions.approve('actionId', { + * agentId: 'agentId', + * }); + * ``` + */ + approve( + actionID: string, + params: TransactionApproveParams, + options?: RequestOptions, + ): APIPromise { + const { agentId } = params; + return this._client.post(path`/agents/${agentId}/actions/${actionID}/approve`, options); + } + + /** + * Reject a pending agent action, preventing execution. The action must have status + * `PENDING_APPROVAL`. Once rejected, the action transitions to `REJECTED` and the + * underlying operation is not executed. This endpoint is called by the platform's + * backend using platform credentials, not by the agent itself. + * + * @example + * ```ts + * const agentAction = await client.agents.transactions.reject( + * 'actionId', + * { agentId: 'agentId' }, + * ); + * ``` + */ + reject( + actionID: string, + params: TransactionRejectParams, + options?: RequestOptions, + ): APIPromise { + const { agentId, ...body } = params; + return this._client.post(path`/agents/${agentId}/actions/${actionID}/reject`, { body, ...options }); + } +} + +export interface TransactionApproveParams { + /** + * System-generated unique agent identifier + */ + agentId: string; +} + +export interface TransactionRejectParams { + /** + * Path param: System-generated unique agent identifier + */ + agentId: string; + + /** + * Body param: Optional human-readable reason for the rejection, stored on the + * action and visible to the platform. + */ + reason?: string; +} + +export declare namespace Transactions { + export { + type TransactionApproveParams as TransactionApproveParams, + type TransactionRejectParams as TransactionRejectParams, + }; +} diff --git a/src/resources/auth/auth.ts b/src/resources/auth/auth.ts index ac25ce92..833c86a8 100644 --- a/src/resources/auth/auth.ts +++ b/src/resources/auth/auth.ts @@ -3,26 +3,42 @@ import { APIResource } from '../../core/resource'; import * as CredentialsAPI from './credentials'; import { + AuthCredentialCreateRequest, + AuthCredentialCreateRequestOneOf, + AuthCredentialListResponse, + AuthCredentialResponseOneOf, + AuthCredentialVerifyRequest, + AuthCredentialVerifyRequestOneOf, AuthMethod, + AuthMethodResponse, + AuthMethodType, + AuthSession, + AuthSignedRequestChallenge, + CredentialChallengeParams, CredentialCreateParams, + CredentialDeleteParams, CredentialListParams, - CredentialListResponse, - CredentialResendChallengeParams, - CredentialResendChallengeResponse, - CredentialRevokeParams, - CredentialRevokeResponse, CredentialVerifyParams, - CredentialVerifyResponse, Credentials, + EmailOtpCredentialCreateRequest, + EmailOtpCredentialCreateRequestFields, + EmailOtpCredentialVerifyRequest, + EmailOtpCredentialVerifyRequestFields, + OAuthCredentialCreateRequest, + OAuthCredentialCreateRequestFields, + OAuthCredentialVerifyRequest, + OAuthCredentialVerifyRequestFields, + PasskeyAssertion, + PasskeyAttestation, + PasskeyAuthChallenge, + PasskeyCredentialCreateRequest, + PasskeyCredentialCreateRequestFields, + PasskeyCredentialVerifyRequest, + PasskeyCredentialVerifyRequestFields, + SignedRequestChallenge, } from './credentials'; import * as SessionsAPI from './sessions'; -import { - SessionListParams, - SessionListResponse, - SessionRevokeParams, - SessionRevokeResponse, - Sessions, -} from './sessions'; +import { SessionDeleteParams, SessionListParams, SessionListResponse, Sessions } from './sessions'; export class Auth extends APIResource { credentials: CredentialsAPI.Credentials = new CredentialsAPI.Credentials(this._client); @@ -35,23 +51,44 @@ Auth.Sessions = Sessions; export declare namespace Auth { export { Credentials as Credentials, + type AuthCredentialCreateRequest as AuthCredentialCreateRequest, + type AuthCredentialCreateRequestOneOf as AuthCredentialCreateRequestOneOf, + type AuthCredentialListResponse as AuthCredentialListResponse, + type AuthCredentialResponseOneOf as AuthCredentialResponseOneOf, + type AuthCredentialVerifyRequest as AuthCredentialVerifyRequest, + type AuthCredentialVerifyRequestOneOf as AuthCredentialVerifyRequestOneOf, type AuthMethod as AuthMethod, - type CredentialListResponse as CredentialListResponse, - type CredentialResendChallengeResponse as CredentialResendChallengeResponse, - type CredentialRevokeResponse as CredentialRevokeResponse, - type CredentialVerifyResponse as CredentialVerifyResponse, + type AuthMethodResponse as AuthMethodResponse, + type AuthMethodType as AuthMethodType, + type AuthSession as AuthSession, + type AuthSignedRequestChallenge as AuthSignedRequestChallenge, + type EmailOtpCredentialCreateRequest as EmailOtpCredentialCreateRequest, + type EmailOtpCredentialCreateRequestFields as EmailOtpCredentialCreateRequestFields, + type EmailOtpCredentialVerifyRequest as EmailOtpCredentialVerifyRequest, + type EmailOtpCredentialVerifyRequestFields as EmailOtpCredentialVerifyRequestFields, + type OAuthCredentialCreateRequest as OAuthCredentialCreateRequest, + type OAuthCredentialCreateRequestFields as OAuthCredentialCreateRequestFields, + type OAuthCredentialVerifyRequest as OAuthCredentialVerifyRequest, + type OAuthCredentialVerifyRequestFields as OAuthCredentialVerifyRequestFields, + type PasskeyAssertion as PasskeyAssertion, + type PasskeyAttestation as PasskeyAttestation, + type PasskeyAuthChallenge as PasskeyAuthChallenge, + type PasskeyCredentialCreateRequest as PasskeyCredentialCreateRequest, + type PasskeyCredentialCreateRequestFields as PasskeyCredentialCreateRequestFields, + type PasskeyCredentialVerifyRequest as PasskeyCredentialVerifyRequest, + type PasskeyCredentialVerifyRequestFields as PasskeyCredentialVerifyRequestFields, + type SignedRequestChallenge as SignedRequestChallenge, type CredentialCreateParams as CredentialCreateParams, type CredentialListParams as CredentialListParams, - type CredentialResendChallengeParams as CredentialResendChallengeParams, - type CredentialRevokeParams as CredentialRevokeParams, + type CredentialDeleteParams as CredentialDeleteParams, + type CredentialChallengeParams as CredentialChallengeParams, type CredentialVerifyParams as CredentialVerifyParams, }; export { Sessions as Sessions, type SessionListResponse as SessionListResponse, - type SessionRevokeResponse as SessionRevokeResponse, type SessionListParams as SessionListParams, - type SessionRevokeParams as SessionRevokeParams, + type SessionDeleteParams as SessionDeleteParams, }; } diff --git a/src/resources/auth/credentials.ts b/src/resources/auth/credentials.ts index 16b227f0..e1b11fb3 100644 --- a/src/resources/auth/credentials.ts +++ b/src/resources/auth/credentials.ts @@ -1,7 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from '../../core/resource'; -import * as CredentialsAPI from './credentials'; import { APIPromise } from '../../core/api-promise'; import { buildHeaders } from '../../internal/headers'; import { RequestOptions } from '../../internal/request-options'; @@ -54,16 +53,17 @@ export class Credentials extends APIResource { * * @example * ```ts - * const authMethod = await client.auth.credentials.create({ - * AuthCredentialCreateRequest: { - * accountId: - * 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002', - * type: 'EMAIL_OTP', - * }, - * }); + * const authMethodResponse = + * await client.auth.credentials.create({ + * AuthCredentialCreateRequest: { + * accountId: + * 'InternalAccount:019542f5-b3e7-1d02-0000-000000000002', + * type: 'EMAIL_OTP', + * }, + * }); * ``` */ - create(params: CredentialCreateParams, options?: RequestOptions): APIPromise { + create(params: CredentialCreateParams, options?: RequestOptions): APIPromise { const { AuthCredentialCreateRequest, 'Grid-Wallet-Signature': gridWalletSignature, @@ -93,49 +93,14 @@ export class Credentials extends APIResource { * * @example * ```ts - * const credentials = await client.auth.credentials.list({ - * accountId: 'accountId', - * }); - * ``` - */ - list(query: CredentialListParams, options?: RequestOptions): APIPromise { - return this._client.get('/auth/credentials', { query, ...options }); - } - - /** - * Re-issue the challenge for an existing authentication credential. - * - * For `EMAIL_OTP` credentials, this triggers a new one-time password email to the - * address on file. The response is a plain `AuthMethod`; there is no challenge - * body to surface because the OTP is delivered out-of-band via email. After the - * user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete - * verification and issue a session. - * - * For `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge - * for reauthentication. The request body must carry the client's ephemeral - * `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload - * the returned challenge is computed from — this seals the resulting session - * signing key to the client. The response is a `PasskeyAuthChallenge` — the base - * `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The - * client passes the `challenge` into `navigator.credentials.get()` and submits the - * resulting assertion to `POST /auth/credentials/{id}/verify` with - * `Request-Id: ` to receive a session. - * - * @example - * ```ts - * const response = - * await client.auth.credentials.resendChallenge('id', { - * clientPublicKey: - * '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + * const authCredentialListResponse = + * await client.auth.credentials.list({ + * accountId: 'accountId', * }); * ``` */ - resendChallenge( - id: string, - body: CredentialResendChallengeParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.post(path`/auth/credentials/${id}/challenge`, { body, ...options }); + list(query: CredentialListParams, options?: RequestOptions): APIPromise { + return this._client.get('/auth/credentials', { query, ...options }); } /** @@ -158,14 +123,15 @@ export class Credentials extends APIResource { * * @example * ```ts - * const response = await client.auth.credentials.revoke('id'); + * const authSignedRequestChallenge = + * await client.auth.credentials.delete('id'); * ``` */ - revoke( + delete( id: string, - params: CredentialRevokeParams | null | undefined = {}, + params: CredentialDeleteParams | null | undefined = {}, options?: RequestOptions, - ): APIPromise { + ): APIPromise { const { 'Grid-Wallet-Signature': gridWalletSignature, 'Request-Id': requestID } = params ?? {}; return this._client.delete(path`/auth/credentials/${id}`, { ...options, @@ -179,6 +145,46 @@ export class Credentials extends APIResource { }); } + /** + * Re-issue the challenge for an existing authentication credential. + * + * For `EMAIL_OTP` credentials, this triggers a new one-time password email to the + * address on file. The response is a plain `AuthMethod`; there is no challenge + * body to surface because the OTP is delivered out-of-band via email. After the + * user receives the new OTP, call `POST /auth/credentials/{id}/verify` to complete + * verification and issue a session. + * + * `OAUTH` credentials do not have a challenge step. To authenticate or + * reauthenticate an OAuth credential, call `POST /auth/credentials/{id}/verify` + * with a fresh OIDC token and a `clientPublicKey`. + * + * For `PASSKEY` credentials, this issues a fresh Grid-generated WebAuthn challenge + * for reauthentication. The request body must carry the client's ephemeral + * `clientPublicKey` so Grid can bake it into the Turnkey session-creation payload + * the returned challenge is computed from — this seals the resulting session + * signing key to the client. The response is a `PasskeyAuthChallenge` — the base + * `AuthMethod` fields plus the new `challenge`, `requestId`, and `expiresAt`. The + * client passes the `challenge` into `navigator.credentials.get()` and submits the + * resulting assertion to `POST /auth/credentials/{id}/verify` with + * `Request-Id: ` to receive a session. + * + * @example + * ```ts + * const authCredentialResponseOneOf = + * await client.auth.credentials.challenge('id', { + * clientPublicKey: + * '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + * }); + * ``` + */ + challenge( + id: string, + body: CredentialChallengeParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.post(path`/auth/credentials/${id}/challenge`, { body, ...options }); + } + /** * Complete the verification step for a previously created authentication * credential and issue a session signing key. @@ -205,10 +211,12 @@ export class Credentials extends APIResource { * * @example * ```ts - * const response = await client.auth.credentials.verify( + * const authSession = await client.auth.credentials.verify( * 'id', * { * AuthCredentialVerifyRequest: { + * clientPublicKey: + * '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', * otp: '123456', * type: 'EMAIL_OTP', * }, @@ -216,11 +224,7 @@ export class Credentials extends APIResource { * ); * ``` */ - verify( - id: string, - params: CredentialVerifyParams, - options?: RequestOptions, - ): APIPromise { + verify(id: string, params: CredentialVerifyParams, options?: RequestOptions): APIPromise { const { AuthCredentialVerifyRequest, 'Request-Id': requestID } = params; return this._client.post(path`/auth/credentials/${id}/verify`, { body: AuthCredentialVerifyRequest, @@ -233,6 +237,45 @@ export class Credentials extends APIResource { } } +export interface AuthCredentialCreateRequest { + /** + * Identifier of the internal account that this credential will authenticate. + */ + accountId: string; +} + +export type AuthCredentialCreateRequestOneOf = + | EmailOtpCredentialCreateRequest + | OAuthCredentialCreateRequest + | PasskeyCredentialCreateRequest; + +export interface AuthCredentialListResponse { + /** + * List of authentication credentials registered on the internal account. + */ + data: Array; +} + +/** + * Discriminated response shape returned from + * `POST /auth/credentials/{id}/challenge`. For `EMAIL_OTP` credentials the body is + * a plain `AuthMethod` (wrapped as `AuthMethodResponse` to disambiguate the + * oneOf). For `PASSKEY` credentials the body is a `PasskeyAuthChallenge` — the + * base `AuthMethod` fields plus the Grid-issued `challenge`, `requestId`, and + * `expiresAt` that drive the subsequent assertion. OAuth credentials do not use + * the challenge endpoint; call `POST /auth/credentials/{id}/verify` with a fresh + * OIDC token instead. Registration responses from `POST /auth/credentials` use the + * simpler `AuthMethodResponse` shape directly for all three credential types. + */ +export type AuthCredentialResponseOneOf = AuthMethodResponse | PasskeyAuthChallenge; + +export type AuthCredentialVerifyRequest = unknown; + +export type AuthCredentialVerifyRequestOneOf = + | EmailOtpCredentialVerifyRequestFields + | OAuthCredentialVerifyRequestFields + | PasskeyCredentialVerifyRequestFields; + export interface AuthMethod { /** * System-generated unique identifier for the authentication credential. @@ -252,7 +295,7 @@ export interface AuthMethod { /** * Human-readable identifier for this credential. For EMAIL_OTP credentials this is * the email address; for OAUTH credentials it is typically the email claim from - * the OIDC token; for PASSKEY credentials it is the nickname provided at + * the OIDC token; for PASSKEY credentials it is the validated nickname provided at * registration time. */ nickname: string; @@ -265,7 +308,7 @@ export interface AuthMethod { * - `EMAIL_OTP`: A one-time password delivered to the user's email address. * - `PASSKEY`: A WebAuthn passkey bound to the user's device. */ - type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; + type: AuthMethodType; /** * Last update timestamp. @@ -273,106 +316,65 @@ export interface AuthMethod { updatedAt: string; } -export interface CredentialListResponse { +/** + * Strict wrapper around `AuthMethod`. Used directly as the registration response + * on `POST /auth/credentials` (all three credential types) and inside + * `AuthCredentialResponseOneOf` for the `EMAIL_OTP` branch of + * `POST /auth/credentials/{id}/challenge`. The only difference from `AuthMethod` + * is `unevaluatedProperties: false`, which disambiguates the oneOf against + * `PasskeyAuthChallenge` — without the strictness, an `AuthMethod` with extra + * fields would ambiguously match both branches. + */ +export interface AuthMethodResponse { /** - * List of authentication credentials registered on the internal account. + * System-generated unique identifier for the authentication credential. */ - data: Array; -} + id: string; -/** - * Discriminated response shape returned from - * `POST /auth/credentials/{id}/challenge`. For `EMAIL_OTP` and `OAUTH` credentials - * the body is a plain `AuthMethod` (wrapped as `AuthMethodResponse` to - * disambiguate the oneOf). For `PASSKEY` credentials the body is a - * `PasskeyAuthChallenge` — the base `AuthMethod` fields plus the Grid-issued - * `challenge`, `requestId`, and `expiresAt` that drive the subsequent assertion. - * Registration responses from `POST /auth/credentials` use the simpler - * `AuthMethodResponse` shape directly for all three credential types. - */ -export type CredentialResendChallengeResponse = - | AuthMethod - | CredentialResendChallengeResponse.PasskeyAuthChallenge; - -export namespace CredentialResendChallengeResponse { - /** - * Extended `AuthMethod` shape returned for `PASSKEY` credentials from - * `POST /auth/credentials` (first-authentication case) and - * `POST /auth/credentials/{id}/challenge` (reauthentication case). Adds a - * Grid-issued `challenge`, the corresponding `requestId`, and the challenge's - * `expiresAt` to the base `AuthMethod` fields. The client signs the challenge with - * the passkey to produce the assertion submitted to - * `POST /auth/credentials/{id}/verify`. - */ - export interface PasskeyAuthChallenge extends CredentialsAPI.AuthMethod { - /** - * Base64url-encoded challenge issued by Grid for the pending passkey - * authentication. The client passes it into `navigator.credentials.get()` as the - * WebAuthn challenge; the resulting assertion is submitted to - * `POST /auth/credentials/{id}/verify`. Single-use; a new challenge is issued on - * the next call to `POST /auth/credentials/{id}/challenge`. - */ - challenge: string; - - /** - * Timestamp after which the issued challenge is no longer valid. The assertion - * must reach `POST /auth/credentials/{id}/verify` before this time; otherwise the - * client must request a fresh challenge via - * `POST /auth/credentials/{id}/challenge`. - */ - expiresAt: string; - - /** - * Unique identifier for this pending passkey authentication request. Must be - * echoed as the `Request-Id` header on the subsequent - * `POST /auth/credentials/{id}/verify` call so Grid can correlate the assertion - * with the issued challenge. - */ - requestId: string; - } -} + /** + * Identifier of the internal account that this credential authenticates. + */ + accountId: string; -/** - * 202 response returned from Embedded Wallet Auth endpoints that require a signed - * retry — `POST /auth/credentials` (adding an additional credential), - * `DELETE /auth/credentials/{id}` (revoking a credential), and - * `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields - * from `SignedRequestChallenge` plus the `type` of the authentication credential - * involved (being added, being revoked, or that issued the session being revoked). - * The client already knows the target resource id from the request path / body it - * just sent, so nothing beyond `type` is echoed in the response. - */ -export interface CredentialRevokeResponse { /** - * Timestamp after which this challenge is no longer valid. The signed retry must - * be submitted before this time. + * Creation timestamp. */ - expiresAt: string; + createdAt: string; /** - * Canonical payload for the retry authorization stamp. Build an API-key stamp over - * this exact value with the session API keypair, then send the full - * base64url-encoded stamp in `Grid-Wallet-Signature` on the retry that completes - * the original request. + * Human-readable identifier for this credential. For EMAIL_OTP credentials this is + * the email address; for OAUTH credentials it is typically the email claim from + * the OIDC token; for PASSKEY credentials it is the validated nickname provided at + * registration time. */ - payloadToSign: string; + nickname: string; /** - * Unique identifier for this request. Must be echoed in the `Request-Id` header on - * the signed retry so the server can correlate the retry with the issued - * challenge. + * The type of authentication credential. + * + * - `OAUTH`: OpenID Connect (OIDC) token issued by an identity provider such as + * Google or Apple. + * - `EMAIL_OTP`: A one-time password delivered to the user's email address. + * - `PASSKEY`: A WebAuthn passkey bound to the user's device. */ - requestId: string; + type: AuthMethodType; /** - * Credential type relevant to this challenge: the credential type being added - * (`POST /auth/credentials`), the credential type being revoked - * (`DELETE /auth/credentials/{id}`), or the type of credential that issued the - * session being revoked (`DELETE /auth/sessions/{id}`). + * Last update timestamp. */ - type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; + updatedAt: string; } +/** + * The type of authentication credential. + * + * - `OAUTH`: OpenID Connect (OIDC) token issued by an identity provider such as + * Google or Apple. + * - `EMAIL_OTP`: A one-time password delivered to the user's email address. + * - `PASSKEY`: A WebAuthn passkey bound to the user's device. + */ +export type AuthMethodType = 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; + /** * An authentication session on an Embedded Wallet internal account. Returned from * `GET /auth/sessions` (list) and `POST /auth/credentials/{id}/verify` (on @@ -380,7 +382,7 @@ export interface CredentialRevokeResponse { * `encryptedSessionSigningKey` — it is delivered exactly once at the moment the * session is issued and is never returned by the list endpoint. */ -export interface CredentialVerifyResponse extends AuthMethod { +export interface AuthSession extends AuthMethod { /** * System-generated unique identifier for the session. Pass this value to * `DELETE /auth/sessions/{id}` to revoke the session before `expiresAt`. Overrides @@ -410,14 +412,345 @@ export interface CredentialVerifyResponse extends AuthMethod { encryptedSessionSigningKey?: string; } +/** + * 202 response returned from Embedded Wallet Auth endpoints that require a signed + * retry — `POST /auth/credentials` (adding an additional credential), + * `DELETE /auth/credentials/{id}` (revoking a credential), and + * `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields + * from `SignedRequestChallenge` plus the `type` of the authentication credential + * involved (being added, being revoked, or that issued the session being revoked). + * The client already knows the target resource id from the request path / body it + * just sent, so nothing beyond `type` is echoed in the response. + */ +export interface AuthSignedRequestChallenge extends SignedRequestChallenge { + /** + * Credential type relevant to this challenge: the credential type being added + * (`POST /auth/credentials`), the credential type being revoked + * (`DELETE /auth/credentials/{id}`), or the type of credential that issued the + * session being revoked (`DELETE /auth/sessions/{id}`). + */ + type: AuthMethodType; +} + +export interface EmailOtpCredentialCreateRequest + extends AuthCredentialCreateRequest, + EmailOtpCredentialCreateRequestFields {} + +export interface EmailOtpCredentialCreateRequestFields { + /** + * Discriminator value identifying this as an email OTP credential. + */ + type: 'EMAIL_OTP'; +} + +export interface EmailOtpCredentialVerifyRequestFields { + /** + * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 + * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters + * total). The matching private key must remain on the client. Grid encrypts the + * session signing key returned in the response to this public key. The key is + * ephemeral and one-time-use per verification request. + */ + clientPublicKey: string; + + /** + * The one-time password received by the user via email. + */ + otp: string; + + /** + * Discriminator value identifying this as an email OTP verification. + */ + type: 'EMAIL_OTP'; +} + +export interface EmailOtpCredentialVerifyRequestFields { + /** + * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 + * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters + * total). The matching private key must remain on the client. Grid encrypts the + * session signing key returned in the response to this public key. The key is + * ephemeral and one-time-use per verification request. + */ + clientPublicKey: string; + + /** + * The one-time password received by the user via email. + */ + otp: string; + + /** + * Discriminator value identifying this as an email OTP verification. + */ + type: 'EMAIL_OTP'; +} + +export interface OAuthCredentialCreateRequest + extends AuthCredentialCreateRequest, + OAuthCredentialCreateRequestFields {} + +export interface OAuthCredentialCreateRequestFields { + /** + * OIDC ID token issued by the identity provider (e.g. Google, Apple). Grid fetches + * the issuer's signing key from the `iss` claim's `.well-known` OpenID + * configuration and verifies the token signature. The token's `iat` claim must be + * less than 60 seconds before the request timestamp. + */ + oidcToken: string; + + /** + * Discriminator value identifying this as an OAuth credential. + */ + type: 'OAUTH'; +} + +export interface OAuthCredentialVerifyRequestFields { + /** + * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 + * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters + * total). The matching private key must remain on the client. Grid encrypts the + * session signing key returned in the response to this public key. The key is + * ephemeral and one-time-use per verification request. + */ + clientPublicKey: string; + + /** + * OIDC ID token issued by the identity provider. For reauthentication after a + * prior session expired, supply a fresh token — the token's `iat` claim must be + * less than 60 seconds before the request timestamp. Grid fetches the issuer's + * signing key from the `iss` claim's `.well-known` OpenID configuration and + * verifies the token signature. + */ + oidcToken: string; + + /** + * Discriminator value identifying this as an OAuth verification. + */ + type: 'OAUTH'; +} + +export interface OAuthCredentialVerifyRequestFields { + /** + * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 + * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters + * total). The matching private key must remain on the client. Grid encrypts the + * session signing key returned in the response to this public key. The key is + * ephemeral and one-time-use per verification request. + */ + clientPublicKey: string; + + /** + * OIDC ID token issued by the identity provider. For reauthentication after a + * prior session expired, supply a fresh token — the token's `iat` claim must be + * less than 60 seconds before the request timestamp. Grid fetches the issuer's + * signing key from the `iss` claim's `.well-known` OpenID configuration and + * verifies the token signature. + */ + oidcToken: string; + + /** + * Discriminator value identifying this as an OAuth verification. + */ + type: 'OAUTH'; +} + +export interface PasskeyAssertion { + /** + * Base64url-encoded authenticator data returned by the authenticator during the + * assertion. Corresponds to `AuthenticatorAssertionResponse.authenticatorData`. + */ + authenticatorData: string; + + /** + * Base64url-encoded JSON client data collected by the browser during the WebAuthn + * `navigator.credentials.get()` call. Corresponds to + * `AuthenticatorAssertionResponse.clientDataJSON` from the WebAuthn spec — Grid's + * field name is intentionally camelCased as `clientDataJson` (lowercase JSON) for + * consistency with the rest of the API; the value is the same bytes the browser + * returns. Contains the challenge, origin, and `type: "webauthn.get"`. + */ + clientDataJson: string; + + /** + * Base64url-encoded credential identifier returned during the WebAuthn assertion. + * Corresponds to `PublicKeyCredential.rawId`. + */ + credentialId: string; + + /** + * Base64url-encoded signature produced by the authenticator over + * `authenticatorData || SHA-256(clientDataJSON)`. Corresponds to + * `AuthenticatorAssertionResponse.signature`. The signature byte format is + * determined by the credential's public-key algorithm — DER-encoded ECDSA for + * ES256 (P-256, typical for passkeys), PKCS#1 v1.5 for RS256, or a raw 64-byte + * signature for EdDSA. + */ + signature: string; + + /** + * Base64url-encoded user handle returned by the authenticator. Corresponds to + * `AuthenticatorAssertionResponse.userHandle`. Populated (and required by the + * WebAuthn spec) for discoverable credentials — resident keys used in the "Sign in + * with passkey" autofill flow — and typically present for passkey registrations. + * Omit this field entirely for non-discoverable credentials specified via + * `allowCredentials` where the authenticator returns no user handle. + */ + userHandle?: string; +} + +export interface PasskeyAttestation { + /** + * Base64url-encoded CBOR attestation object produced by the authenticator during + * registration. Corresponds to + * `AuthenticatorAttestationResponse.attestationObject`. + */ + attestationObject: string; + + /** + * Base64url-encoded JSON client data collected by the browser during the WebAuthn + * `navigator.credentials.create()` call. Corresponds to + * `AuthenticatorAttestationResponse.clientDataJSON` from the WebAuthn spec — + * Grid's field name is intentionally camelCased as `clientDataJson` (lowercase + * JSON) for consistency with the rest of the API; the value is the same bytes the + * browser returns. Contains the challenge, origin, and `type: "webauthn.create"`. + */ + clientDataJson: string; + + /** + * Base64url-encoded credential identifier produced by the authenticator at + * registration time. Typically the base64url of `PublicKeyCredential.rawId`. + */ + credentialId: string; + + /** + * Optional. WebAuthn transports as returned by + * `AuthenticatorAttestationResponse.getTransports()`. Values follow the W3C + * `AuthenticatorTransport` enum — pass the raw values through to Grid; + * provider-specific translation is handled server-side. Some authenticators return + * an empty array; omit the field or send `[]` in that case. + */ + transports?: Array<'usb' | 'nfc' | 'ble' | 'internal' | 'hybrid'>; +} + +/** + * Extended `AuthMethod` shape returned for `PASSKEY` credentials from + * `POST /auth/credentials` (first-authentication case) and + * `POST /auth/credentials/{id}/challenge` (reauthentication case). Adds a + * Grid-issued `challenge`, the corresponding `requestId`, and the challenge's + * `expiresAt` to the base `AuthMethod` fields. The client signs the challenge with + * the passkey to produce the assertion submitted to + * `POST /auth/credentials/{id}/verify`. + */ +export interface PasskeyAuthChallenge extends AuthMethod { + /** + * Base64url-encoded challenge issued by Grid for the pending passkey + * authentication. The client passes it into `navigator.credentials.get()` as the + * WebAuthn challenge; the resulting assertion is submitted to + * `POST /auth/credentials/{id}/verify`. Single-use; a new challenge is issued on + * the next call to `POST /auth/credentials/{id}/challenge`. + */ + challenge: string; + + /** + * Timestamp after which the issued challenge is no longer valid. The assertion + * must reach `POST /auth/credentials/{id}/verify` before this time; otherwise the + * client must request a fresh challenge via + * `POST /auth/credentials/{id}/challenge`. + */ + expiresAt: string; + + /** + * Unique identifier for this pending passkey authentication request. Must be + * echoed as the `Request-Id` header on the subsequent + * `POST /auth/credentials/{id}/verify` call so Grid can correlate the assertion + * with the issued challenge. + */ + requestId: string; +} + +export interface PasskeyCredentialCreateRequest + extends AuthCredentialCreateRequest, + PasskeyCredentialCreateRequestFields {} + +export interface PasskeyCredentialCreateRequestFields { + attestation: PasskeyAttestation; + + /** + * Base64url-encoded WebAuthn challenge issued by the platform backend and passed + * to the client before `navigator.credentials.create()`. Grid verifies it matches + * the challenge embedded in the attestation's `clientDataJson`, binding the + * attestation to this registration. Must be single-use. + */ + challenge: string; + + /** + * Human-readable identifier for the passkey, chosen by the user at registration + * time (e.g. "iPhone Face-ID", "YubiKey 5C"). Leading and trailing whitespace is + * ignored. Must be 1-100 characters and may contain Unicode letters, numbers, + * spaces, and the following separators: period, underscore, hyphen, apostrophe, + * and parentheses. Shown back on AuthMethod responses and in credential listings. + */ + nickname: string; + + /** + * Discriminator value identifying this as a passkey credential. + */ + type: 'PASSKEY'; +} + +export interface PasskeyCredentialVerifyRequestFields { + assertion: PasskeyAssertion; + + /** + * Discriminator value identifying this as a passkey verification. + */ + type: 'PASSKEY'; +} + +export interface PasskeyCredentialVerifyRequestFields { + assertion: PasskeyAssertion; + + /** + * Discriminator value identifying this as a passkey verification. + */ + type: 'PASSKEY'; +} + +/** + * Common base for two-step signed-retry challenge responses on Embedded Wallet + * endpoints (credential revocation, session revocation, wallet export, and + * similar). Holds the signing fields shared across every challenge shape; each + * variant composes this base via `allOf` and adds its own resource `id` (and + * `type`, when applicable) with variant-specific description and example. + */ +export interface SignedRequestChallenge { + /** + * Timestamp after which this challenge is no longer valid. The signed retry must + * be submitted before this time. + */ + expiresAt: string; + + /** + * Canonical payload for the retry authorization stamp. Build an API-key stamp over + * this exact value with the session API keypair, then send the full + * base64url-encoded stamp in `Grid-Wallet-Signature` on the retry that completes + * the original request. + */ + payloadToSign: string; + + /** + * Unique identifier for this request. Must be echoed in the `Request-Id` header on + * the signed retry so the server can correlate the retry with the issued + * challenge. + */ + requestId: string; +} + export interface CredentialCreateParams { /** * Body param */ - AuthCredentialCreateRequest: - | CredentialCreateParams.EmailOtpCredentialCreateRequest - | CredentialCreateParams.OAuthCredentialCreateRequest - | CredentialCreateParams.PasskeyCredentialCreateRequest; + AuthCredentialCreateRequest: AuthCredentialCreateRequestOneOf; /** * Header param: Full API-key stamp built over the prior `payloadToSign` with the @@ -437,105 +770,6 @@ export interface CredentialCreateParams { 'Request-Id'?: string; } -export namespace CredentialCreateParams { - export interface EmailOtpCredentialCreateRequest { - /** - * Identifier of the internal account that this credential will authenticate. - */ - accountId: string; - - /** - * Discriminator value identifying this as an email OTP credential. - */ - type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; - } - - export interface OAuthCredentialCreateRequest { - /** - * Identifier of the internal account that this credential will authenticate. - */ - accountId: string; - - /** - * OIDC ID token issued by the identity provider (e.g. Google, Apple). Grid fetches - * the issuer's signing key from the `iss` claim's `.well-known` OpenID - * configuration and verifies the token signature. The token's `iat` claim must be - * less than 60 seconds before the request timestamp. - */ - oidcToken: string; - - /** - * Discriminator value identifying this as an OAuth credential. - */ - type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; - } - - export interface PasskeyCredentialCreateRequest { - /** - * Identifier of the internal account that this credential will authenticate. - */ - accountId: string; - - attestation: PasskeyCredentialCreateRequest.Attestation; - - /** - * Base64url-encoded WebAuthn challenge issued by the platform backend and passed - * to the client before `navigator.credentials.create()`. Grid verifies it matches - * the challenge embedded in the attestation's `clientDataJson`, binding the - * attestation to this registration. Must be single-use. - */ - challenge: string; - - /** - * Human-readable identifier for the passkey, chosen by the user at registration - * time (e.g. "iPhone Face-ID", "YubiKey 5C"). Shown back on `AuthMethod` responses - * and in credential listings. - */ - nickname: string; - - /** - * Discriminator value identifying this as a passkey credential. - */ - type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; - } - - export namespace PasskeyCredentialCreateRequest { - export interface Attestation { - /** - * Base64url-encoded CBOR attestation object produced by the authenticator during - * registration. Corresponds to - * `AuthenticatorAttestationResponse.attestationObject`. - */ - attestationObject: string; - - /** - * Base64url-encoded JSON client data collected by the browser during the WebAuthn - * `navigator.credentials.create()` call. Corresponds to - * `AuthenticatorAttestationResponse.clientDataJSON` from the WebAuthn spec — - * Grid's field name is intentionally camelCased as `clientDataJson` (lowercase - * JSON) for consistency with the rest of the API; the value is the same bytes the - * browser returns. Contains the challenge, origin, and `type: "webauthn.create"`. - */ - clientDataJson: string; - - /** - * Base64url-encoded credential identifier produced by the authenticator at - * registration time. Typically the base64url of `PublicKeyCredential.rawId`. - */ - credentialId: string; - - /** - * Optional. WebAuthn transports as returned by - * `AuthenticatorAttestationResponse.getTransports()`. Values follow the W3C - * `AuthenticatorTransport` enum — pass the raw values through to Grid; - * provider-specific translation is handled server-side. Some authenticators return - * an empty array; omit the field or send `[]` in that case. - */ - transports?: Array<'usb' | 'nfc' | 'ble' | 'internal' | 'hybrid'>; - } - } -} - export interface CredentialListParams { /** * Internal account id whose authentication credentials to list. @@ -543,20 +777,7 @@ export interface CredentialListParams { accountId: string; } -export interface CredentialResendChallengeParams { - /** - * Required for `PASSKEY` credentials. Client-generated P-256 public key, - * hex-encoded in uncompressed SEC1 format (`04` prefix followed by the 32-byte X - * and 32-byte Y coordinates; 130 hex characters total). The matching private key - * must remain on the client. Grid bakes this key into the Turnkey session-creation - * payload that the returned `challenge` is computed from, so the resulting session - * signing key is sealed to the client. Ignored for `EMAIL_OTP` and `OAUTH` - * credentials. - */ - clientPublicKey?: string; -} - -export interface CredentialRevokeParams { +export interface CredentialDeleteParams { /** * Full API-key stamp built over the prior `payloadToSign` with the session API * keypair of an existing verified authentication credential on the same internal @@ -573,14 +794,23 @@ export interface CredentialRevokeParams { 'Request-Id'?: string; } +export interface CredentialChallengeParams { + /** + * Required for `PASSKEY` credentials. Client-generated P-256 public key, + * hex-encoded in uncompressed SEC1 format (`04` prefix followed by the 32-byte X + * and 32-byte Y coordinates; 130 hex characters total). The matching private key + * must remain on the client. Grid bakes this key into the Turnkey session-creation + * payload that the returned `challenge` is computed from, so the resulting session + * signing key is sealed to the client. Ignored for `EMAIL_OTP`. + */ + clientPublicKey?: string; +} + export interface CredentialVerifyParams { /** * Body param */ - AuthCredentialVerifyRequest: - | CredentialVerifyParams.EmailOtpCredentialVerifyRequest - | CredentialVerifyParams.OAuthCredentialVerifyRequest - | CredentialVerifyParams.PasskeyCredentialVerifyRequest; + AuthCredentialVerifyRequest: AuthCredentialVerifyRequestOneOf; /** * Header param: The `requestId` returned alongside the Grid-issued `challenge` @@ -591,120 +821,39 @@ export interface CredentialVerifyParams { 'Request-Id'?: string; } -export namespace CredentialVerifyParams { - export interface EmailOtpCredentialVerifyRequest { - /** - * The one-time password received by the user via email. - */ - otp: string; - - /** - * Discriminator value identifying this as an email OTP verification. - */ - type: 'EMAIL_OTP' | 'OAUTH' | 'PASSKEY'; - - /** - * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 - * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters - * total). The matching private key must remain on the client. Grid encrypts the - * session signing key returned in the response to this public key. The key is - * ephemeral and one-time-use per verification request. - */ - clientPublicKey?: string; - } - - export interface OAuthCredentialVerifyRequest { - /** - * Client-generated P-256 public key, hex-encoded in uncompressed SEC1 format (0x04 - * prefix followed by the 32-byte X and 32-byte Y coordinates; 130 hex characters - * total). The matching private key must remain on the client. Grid encrypts the - * session signing key returned in the response to this public key. The key is - * ephemeral and one-time-use per verification request. - */ - clientPublicKey: string; - - /** - * OIDC ID token issued by the identity provider. For reauthentication after a - * prior session expired, supply a fresh token — the token's `iat` claim must be - * less than 60 seconds before the request timestamp. Grid fetches the issuer's - * signing key from the `iss` claim's `.well-known` OpenID configuration and - * verifies the token signature. - */ - oidcToken: string; - - /** - * Discriminator value identifying this as an OAuth verification. - */ - type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; - } - - export interface PasskeyCredentialVerifyRequest { - assertion: PasskeyCredentialVerifyRequest.Assertion; - - /** - * Discriminator value identifying this as a passkey verification. - */ - type: 'PASSKEY' | 'OAUTH' | 'EMAIL_OTP'; - } - - export namespace PasskeyCredentialVerifyRequest { - export interface Assertion { - /** - * Base64url-encoded authenticator data returned by the authenticator during the - * assertion. Corresponds to `AuthenticatorAssertionResponse.authenticatorData`. - */ - authenticatorData: string; - - /** - * Base64url-encoded JSON client data collected by the browser during the WebAuthn - * `navigator.credentials.get()` call. Corresponds to - * `AuthenticatorAssertionResponse.clientDataJSON` from the WebAuthn spec — Grid's - * field name is intentionally camelCased as `clientDataJson` (lowercase JSON) for - * consistency with the rest of the API; the value is the same bytes the browser - * returns. Contains the challenge, origin, and `type: "webauthn.get"`. - */ - clientDataJson: string; - - /** - * Base64url-encoded credential identifier returned during the WebAuthn assertion. - * Corresponds to `PublicKeyCredential.rawId`. - */ - credentialId: string; - - /** - * Base64url-encoded signature produced by the authenticator over - * `authenticatorData || SHA-256(clientDataJSON)`. Corresponds to - * `AuthenticatorAssertionResponse.signature`. The signature byte format is - * determined by the credential's public-key algorithm — DER-encoded ECDSA for - * ES256 (P-256, typical for passkeys), PKCS#1 v1.5 for RS256, or a raw 64-byte - * signature for EdDSA. - */ - signature: string; - - /** - * Base64url-encoded user handle returned by the authenticator. Corresponds to - * `AuthenticatorAssertionResponse.userHandle`. Populated (and required by the - * WebAuthn spec) for discoverable credentials — resident keys used in the "Sign in - * with passkey" autofill flow — and typically present for passkey registrations. - * Omit this field entirely for non-discoverable credentials specified via - * `allowCredentials` where the authenticator returns no user handle. - */ - userHandle?: string; - } - } -} - export declare namespace Credentials { export { + type AuthCredentialCreateRequest as AuthCredentialCreateRequest, + type AuthCredentialCreateRequestOneOf as AuthCredentialCreateRequestOneOf, + type AuthCredentialListResponse as AuthCredentialListResponse, + type AuthCredentialResponseOneOf as AuthCredentialResponseOneOf, + type AuthCredentialVerifyRequest as AuthCredentialVerifyRequest, + type AuthCredentialVerifyRequestOneOf as AuthCredentialVerifyRequestOneOf, type AuthMethod as AuthMethod, - type CredentialListResponse as CredentialListResponse, - type CredentialResendChallengeResponse as CredentialResendChallengeResponse, - type CredentialRevokeResponse as CredentialRevokeResponse, - type CredentialVerifyResponse as CredentialVerifyResponse, + type AuthMethodResponse as AuthMethodResponse, + type AuthMethodType as AuthMethodType, + type AuthSession as AuthSession, + type AuthSignedRequestChallenge as AuthSignedRequestChallenge, + type EmailOtpCredentialCreateRequest as EmailOtpCredentialCreateRequest, + type EmailOtpCredentialCreateRequestFields as EmailOtpCredentialCreateRequestFields, + type EmailOtpCredentialVerifyRequest as EmailOtpCredentialVerifyRequest, + type EmailOtpCredentialVerifyRequestFields as EmailOtpCredentialVerifyRequestFields, + type OAuthCredentialCreateRequest as OAuthCredentialCreateRequest, + type OAuthCredentialCreateRequestFields as OAuthCredentialCreateRequestFields, + type OAuthCredentialVerifyRequest as OAuthCredentialVerifyRequest, + type OAuthCredentialVerifyRequestFields as OAuthCredentialVerifyRequestFields, + type PasskeyAssertion as PasskeyAssertion, + type PasskeyAttestation as PasskeyAttestation, + type PasskeyAuthChallenge as PasskeyAuthChallenge, + type PasskeyCredentialCreateRequest as PasskeyCredentialCreateRequest, + type PasskeyCredentialCreateRequestFields as PasskeyCredentialCreateRequestFields, + type PasskeyCredentialVerifyRequest as PasskeyCredentialVerifyRequest, + type PasskeyCredentialVerifyRequestFields as PasskeyCredentialVerifyRequestFields, + type SignedRequestChallenge as SignedRequestChallenge, type CredentialCreateParams as CredentialCreateParams, type CredentialListParams as CredentialListParams, - type CredentialResendChallengeParams as CredentialResendChallengeParams, - type CredentialRevokeParams as CredentialRevokeParams, + type CredentialDeleteParams as CredentialDeleteParams, + type CredentialChallengeParams as CredentialChallengeParams, type CredentialVerifyParams as CredentialVerifyParams, }; } diff --git a/src/resources/auth/index.ts b/src/resources/auth/index.ts index 51b7604d..4f96bb30 100644 --- a/src/resources/auth/index.ts +++ b/src/resources/auth/index.ts @@ -3,21 +3,42 @@ export { Auth } from './auth'; export { Credentials, + type AuthCredentialCreateRequest, + type AuthCredentialCreateRequestOneOf, + type AuthCredentialListResponse, + type AuthCredentialResponseOneOf, + type AuthCredentialVerifyRequest, + type AuthCredentialVerifyRequestOneOf, type AuthMethod, - type CredentialListResponse, - type CredentialResendChallengeResponse, - type CredentialRevokeResponse, - type CredentialVerifyResponse, + type AuthMethodResponse, + type AuthMethodType, + type AuthSession, + type AuthSignedRequestChallenge, + type EmailOtpCredentialCreateRequest, + type EmailOtpCredentialCreateRequestFields, + type EmailOtpCredentialVerifyRequest, + type EmailOtpCredentialVerifyRequestFields, + type OAuthCredentialCreateRequest, + type OAuthCredentialCreateRequestFields, + type OAuthCredentialVerifyRequest, + type OAuthCredentialVerifyRequestFields, + type PasskeyAssertion, + type PasskeyAttestation, + type PasskeyAuthChallenge, + type PasskeyCredentialCreateRequest, + type PasskeyCredentialCreateRequestFields, + type PasskeyCredentialVerifyRequest, + type PasskeyCredentialVerifyRequestFields, + type SignedRequestChallenge, type CredentialCreateParams, type CredentialListParams, - type CredentialResendChallengeParams, - type CredentialRevokeParams, + type CredentialDeleteParams, + type CredentialChallengeParams, type CredentialVerifyParams, } from './credentials'; export { Sessions, type SessionListResponse, - type SessionRevokeResponse, type SessionListParams, - type SessionRevokeParams, + type SessionDeleteParams, } from './sessions'; diff --git a/src/resources/auth/sessions.ts b/src/resources/auth/sessions.ts index 807a3047..ff3603a1 100644 --- a/src/resources/auth/sessions.ts +++ b/src/resources/auth/sessions.ts @@ -23,9 +23,9 @@ export class Sessions extends APIResource { * * @example * ```ts - * const sessions = await client.auth.sessions.list({ - * accountId: 'accountId', - * }); + * const sessionListResponse = await client.auth.sessions.list( + * { accountId: 'accountId' }, + * ); * ``` */ list(query: SessionListParams, options?: RequestOptions): APIPromise { @@ -47,14 +47,15 @@ export class Sessions extends APIResource { * * @example * ```ts - * const response = await client.auth.sessions.revoke('id'); + * const authSignedRequestChallenge = + * await client.auth.sessions.delete('id'); * ``` */ - revoke( + delete( id: string, - params: SessionRevokeParams | null | undefined = {}, + params: SessionDeleteParams | null | undefined = {}, options?: RequestOptions, - ): APIPromise { + ): APIPromise { const { 'Grid-Wallet-Signature': gridWalletSignature, 'Request-Id': requestID } = params ?? {}; return this._client.delete(path`/auth/sessions/${id}`, { ...options, @@ -73,87 +74,7 @@ export interface SessionListResponse { /** * List of active authentication sessions for the internal account. */ - data: Array; -} - -export namespace SessionListResponse { - /** - * An authentication session on an Embedded Wallet internal account. Returned from - * `GET /auth/sessions` (list) and `POST /auth/credentials/{id}/verify` (on - * credential verification). Only the verify response includes - * `encryptedSessionSigningKey` — it is delivered exactly once at the moment the - * session is issued and is never returned by the list endpoint. - */ - export interface Data extends CredentialsAPI.AuthMethod { - /** - * System-generated unique identifier for the session. Pass this value to - * `DELETE /auth/sessions/{id}` to revoke the session before `expiresAt`. Overrides - * the `id` inherited from `AuthMethod` so this response identifies the session - * rather than the authenticating credential. - */ - id: string; - - /** - * Timestamp after which the session is no longer valid and the - * `encryptedSessionSigningKey` must not be used to sign further requests. - */ - expiresAt: string; - - /** - * HPKE-encrypted session signing key, sealed to the `clientPublicKey` supplied on - * the verify request. Encoded as a base58check string: the decoded payload is a - * 33-byte compressed P-256 encapsulated public key followed by AES-256-GCM - * ciphertext. The client decrypts this key with its private key and uses it to - * sign subsequent Embedded Wallet requests until `expiresAt`. - * - * Only returned from `POST /auth/credentials/{id}/verify` (where the session is - * first issued). Omitted from responses that simply surface existing sessions - * (e.g. `GET /auth/sessions`) — Grid does not retain the plaintext key after the - * client has decrypted it. - */ - encryptedSessionSigningKey?: string; - } -} - -/** - * 202 response returned from Embedded Wallet Auth endpoints that require a signed - * retry — `POST /auth/credentials` (adding an additional credential), - * `DELETE /auth/credentials/{id}` (revoking a credential), and - * `DELETE /auth/sessions/{id}` (revoking a session). Carries the signing fields - * from `SignedRequestChallenge` plus the `type` of the authentication credential - * involved (being added, being revoked, or that issued the session being revoked). - * The client already knows the target resource id from the request path / body it - * just sent, so nothing beyond `type` is echoed in the response. - */ -export interface SessionRevokeResponse { - /** - * Timestamp after which this challenge is no longer valid. The signed retry must - * be submitted before this time. - */ - expiresAt: string; - - /** - * Canonical payload for the retry authorization stamp. Build an API-key stamp over - * this exact value with the session API keypair, then send the full - * base64url-encoded stamp in `Grid-Wallet-Signature` on the retry that completes - * the original request. - */ - payloadToSign: string; - - /** - * Unique identifier for this request. Must be echoed in the `Request-Id` header on - * the signed retry so the server can correlate the retry with the issued - * challenge. - */ - requestId: string; - - /** - * Credential type relevant to this challenge: the credential type being added - * (`POST /auth/credentials`), the credential type being revoked - * (`DELETE /auth/credentials/{id}`), or the type of credential that issued the - * session being revoked (`DELETE /auth/sessions/{id}`). - */ - type: 'OAUTH' | 'EMAIL_OTP' | 'PASSKEY'; + data: Array; } export interface SessionListParams { @@ -163,7 +84,7 @@ export interface SessionListParams { accountId: string; } -export interface SessionRevokeParams { +export interface SessionDeleteParams { /** * Full API-key stamp built over the prior `payloadToSign` with the session API * keypair of a verified session on the same internal account. Required on the @@ -182,8 +103,7 @@ export interface SessionRevokeParams { export declare namespace Sessions { export { type SessionListResponse as SessionListResponse, - type SessionRevokeResponse as SessionRevokeResponse, type SessionListParams as SessionListParams, - type SessionRevokeParams as SessionRevokeParams, + type SessionDeleteParams as SessionDeleteParams, }; } diff --git a/src/resources/crypto.ts b/src/resources/crypto.ts index 2fbde663..78bd7c3e 100644 --- a/src/resources/crypto.ts +++ b/src/resources/crypto.ts @@ -17,7 +17,7 @@ export class Crypto extends APIResource { * ```ts * const response = await client.crypto.estimateWithdrawalFee({ * amount: 1000000, - * cryptoNetwork: 'SOLANA_MAINNET', + * cryptoNetwork: 'SOLANA', * currency: 'USDC', * destinationAddress: * '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', @@ -77,9 +77,8 @@ export interface CryptoEstimateWithdrawalFeeParams { amount: number; /** - * The blockchain network for the withdrawal. Example values: SOLANA_MAINNET, - * SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, BASE_TESTNET, - * SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, LIGHTNING_REGTEST. + * The blockchain network for the withdrawal. Example values: SOLANA, ETHEREUM, + * BASE, POLYGON, SPARK, LIGHTNING, BITCOIN. */ cryptoNetwork: string; diff --git a/src/resources/customers/customers.ts b/src/resources/customers/customers.ts index c40da8aa..02f92540 100644 --- a/src/resources/customers/customers.ts +++ b/src/resources/customers/customers.ts @@ -76,6 +76,7 @@ import * as InternalAccountsAPI from '../sandbox/internal-accounts'; import { InternalAccountsDefaultPagination } from '../sandbox/internal-accounts'; import { APIPromise } from '../../core/api-promise'; import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../core/pagination'; +import { buildHeaders } from '../../internal/headers'; import { RequestOptions } from '../../internal/request-options'; import { path } from '../../internal/utils/path'; @@ -169,6 +170,62 @@ export class Customers extends APIResource { return this._client.delete(path`/customers/${customerID}`, options); } + /** + * Export the wallet credentials of an Embedded Wallet internal account. The + * returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied + * in the request body. + * + * Export is a two-step signed-retry flow (same pattern as add-additional + * credential, revoke credential, and revoke session): + * + * 1. Call `POST /internal-accounts/{id}/export` with the request body + * `{ "clientPublicKey": "..." }` and no signature headers. Grid binds the + * `clientPublicKey` into the `payloadToSign` it returns, so the subsequent + * stamp in `Grid-Wallet-Signature` commits to the target encryption key. The + * response is `202` with `payloadToSign`, `requestId`, and `expiresAt`. + * + * 2. Use the session API keypair of a verified authentication credential on the + * same internal account to build an API-key stamp over `payloadToSign`, then + * retry with that full stamp as the `Grid-Wallet-Signature` header and the + * `requestId` echoed back as the `Request-Id` header. The retry body must carry + * the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry + * with `401` if it disagrees with what was bound into `payloadToSign`. The + * signed retry returns `200` with `encryptedWalletCredentials`, which the + * client decrypts with the matching private key. + * + * The `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this + * export and discard the private key after decrypting. Do not reuse the keypair + * from any prior verify call — that private key was already discarded after + * decrypting the session signing key it was issued against. + * + * @example + * ```ts + * const internalAccountExportResponse = + * await client.customers.export('id', { + * clientPublicKey: + * '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + * }); + * ``` + */ + export( + id: string, + params: CustomerExportParams, + options?: RequestOptions, + ): APIPromise { + const { 'Grid-Wallet-Signature': gridWalletSignature, 'Request-Id': requestID, ...body } = params; + return this._client.post(path`/internal-accounts/${id}/export`, { + body, + ...options, + headers: buildHeaders([ + { + ...(gridWalletSignature != null ? { 'Grid-Wallet-Signature': gridWalletSignature } : undefined), + ...(requestID != null ? { 'Request-Id': requestID } : undefined), + }, + options?.headers, + ]), + }); + } + /** * Generate a hosted KYC link to onboard a customer * @@ -686,6 +743,47 @@ export interface IndividualCustomerFields { nationality?: string; } +/** + * Request body for `POST /internal-accounts/{id}/export`. The `clientPublicKey` is + * required on both steps of the signed-retry flow. On step 1 Grid binds it into + * `payloadToSign` so the subsequent stamp in `Grid-Wallet-Signature` commits to + * the target pubkey; on step 2 the client echoes the same `clientPublicKey` back + * and Grid uses it to encrypt the wallet credentials returned in the `200` + * response. + */ +export interface InternalAccountExportRequest { + /** + * Fresh P-256 public key, uncompressed SEC1 hex — 130 hex chars where the first + * two are `04` (the uncompressed-point indicator). Generate a new keypair for each + * export and discard the private key after decrypting the response. + */ + clientPublicKey: string; +} + +export interface InternalAccountExportResponse { + /** + * The id of the internal account that was exported. + */ + id: string; + + /** + * Encrypted wallet mnemonic, sealed to the `clientPublicKey` from the request body + * using HPKE: DHKEM(P-256, HKDF-SHA256) + HKDF-SHA256 + AES-256-GCM. Decrypt with + * the matching private key, then manage the mnemonic securely because it is the + * master key of the self-custodial Embedded Wallet. The value is a JSON string of + * the form + * `{"version": "v1.0.0", "data": "", "dataSignature": "", "enclaveQuorumPublic": ""}`. + * `data` hex-decodes to JSON + * `{"encappedPublic": "", "ciphertext": "", "organizationId": ""}`, + * where `encappedPublic` is the uncompressed SEC1 ephemeral public key. + * `dataSignature` is an ECDSA-P256-SHA256 signature over the `data` bytes produced + * by the issuer key in `enclaveQuorumPublic`; verify before decrypting. In + * sandbox, `dataSignature` and `enclaveQuorumPublic` are empty strings. Clients + * should bypass attestation verification when calling against sandbox. + */ + encryptedWalletCredentials: string; +} + export interface CustomerGetKYCLinkResponse { /** * The customer id of the newly created customer on the system @@ -798,6 +896,30 @@ export interface CustomerListParams extends DefaultPaginationParams { updatedBefore?: string; } +export interface CustomerExportParams { + /** + * Body param: Fresh P-256 public key, uncompressed SEC1 hex — 130 hex chars where + * the first two are `04` (the uncompressed-point indicator). Generate a new + * keypair for each export and discard the private key after decrypting the + * response. + */ + clientPublicKey: string; + + /** + * Header param: Full API-key stamp built over the prior `payloadToSign` with the + * session API keypair of a verified authentication credential on the target + * internal account. Required on the signed retry; ignored on the initial call. + */ + 'Grid-Wallet-Signature'?: string; + + /** + * Header param: The `requestId` returned in a prior `202` response, echoed back on + * the signed retry so the server can correlate it with the issued challenge. + * Required on the signed retry; must be paired with `Grid-Wallet-Signature`. + */ + 'Request-Id'?: string; +} + export interface CustomerGetKYCLinkParams { /** * The platform id of the customer to onboard @@ -848,11 +970,14 @@ export declare namespace Customers { type CustomerType as CustomerType, type CustomerUpdate as CustomerUpdate, type IndividualCustomerFields as IndividualCustomerFields, + type InternalAccountExportRequest as InternalAccountExportRequest, + type InternalAccountExportResponse as InternalAccountExportResponse, type CustomerGetKYCLinkResponse as CustomerGetKYCLinkResponse, type CustomerOneovesDefaultPagination as CustomerOneovesDefaultPagination, type CustomerCreateParams as CustomerCreateParams, type CustomerUpdateParams as CustomerUpdateParams, type CustomerListParams as CustomerListParams, + type CustomerExportParams as CustomerExportParams, type CustomerGetKYCLinkParams as CustomerGetKYCLinkParams, type CustomerListInternalAccountsParams as CustomerListInternalAccountsParams, }; diff --git a/src/resources/customers/external-accounts.ts b/src/resources/customers/external-accounts.ts index f35b9b83..ba5dca70 100644 --- a/src/resources/customers/external-accounts.ts +++ b/src/resources/customers/external-accounts.ts @@ -321,14 +321,6 @@ export interface ExternalAccount { */ beneficiaryVerifiedData?: BeneficiaryVerifiedData; - /** - * The blockchain network for this external account, if applicable. Present when - * the account is a cryptocurrency wallet. Example values: SOLANA_MAINNET, - * SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, BASE_TESTNET, - * SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, LIGHTNING_REGTEST. - */ - cryptoNetwork?: string; - /** * The customer this account is tied to, or null if the account is on behalf of the * platform. @@ -406,15 +398,6 @@ export interface ExternalAccountCreate { */ currency: string; - /** - * The blockchain network for this external account. Required when the account is a - * cryptocurrency wallet. Specifies which network the wallet is on. Example values: - * SOLANA_MAINNET, SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, - * BASE_TESTNET, SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, - * LIGHTNING_REGTEST. - */ - cryptoNetwork?: string; - /** * The ID of the customer for whom to create the external account. If not provided, * the external account will be created on behalf of the platform. @@ -1051,15 +1034,6 @@ export interface ExternalAccountCreateParams { */ currency: string; - /** - * The blockchain network for this external account. Required when the account is a - * cryptocurrency wallet. Specifies which network the wallet is on. Example values: - * SOLANA_MAINNET, SOLANA_DEVNET, ETHEREUM_MAINNET, ETHEREUM_TESTNET, BASE_MAINNET, - * BASE_TESTNET, SPARK_MAINNET, SPARK_TESTNET, LIGHTNING_MAINNET, - * LIGHTNING_REGTEST. - */ - cryptoNetwork?: string; - /** * The ID of the customer for whom to create the external account. If not provided, * the external account will be created on behalf of the platform. diff --git a/src/resources/customers/index.ts b/src/resources/customers/index.ts index cceb9a7b..be240a02 100644 --- a/src/resources/customers/index.ts +++ b/src/resources/customers/index.ts @@ -16,10 +16,13 @@ export { type CustomerType, type CustomerUpdate, type IndividualCustomerFields, + type InternalAccountExportRequest, + type InternalAccountExportResponse, type CustomerGetKYCLinkResponse, type CustomerCreateParams, type CustomerUpdateParams, type CustomerListParams, + type CustomerExportParams, type CustomerGetKYCLinkParams, type CustomerListInternalAccountsParams, type CustomerOneovesDefaultPagination, diff --git a/src/resources/documents.ts b/src/resources/documents.ts index ec06274b..d865a55d 100644 --- a/src/resources/documents.ts +++ b/src/resources/documents.ts @@ -144,15 +144,11 @@ export interface DocumentRetrieveResponse { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -172,6 +168,13 @@ export interface DocumentRetrieveResponse { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; @@ -224,15 +227,11 @@ export interface DocumentListResponse { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -252,6 +251,13 @@ export interface DocumentListResponse { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; @@ -304,15 +310,11 @@ export interface DocumentReplaceResponse { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -332,6 +334,13 @@ export interface DocumentReplaceResponse { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; @@ -384,15 +393,11 @@ export interface DocumentUploadResponse { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -412,6 +417,13 @@ export interface DocumentUploadResponse { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; @@ -460,15 +472,11 @@ export interface DocumentReplaceParams { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -488,6 +496,13 @@ export interface DocumentReplaceParams { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; @@ -524,15 +539,11 @@ export interface DocumentUploadParams { * by verification category: **Identity** — PASSPORT, DRIVERS_LICENSE, NATIONAL_ID * **Business — Legal presence** — CERTIFICATE_OF_INCORPORATION, * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT - * **Business — Company details** — INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, - * ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, - * CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE - * **Business — Control structure** — ARTICLES_OF_INCORPORATION, - * ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, - * STATE_REGISTRY_EXCERPT **Business — Ownership structure** — - * SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, - * STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION - * **Proof of address** — PROOF_OF_ADDRESS + * **Business — Control structure** — DIRECTOR_REGISTRY, TRUST_AGREEMENT, + * STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT **Business — Ownership + * structure** — SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT + * **Proof of address** — UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, + * BANK_STATEMENT, TAX_RETURN */ documentType: | 'PASSPORT' @@ -552,6 +563,13 @@ export interface DocumentUploadParams { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER'; diff --git a/src/resources/index.ts b/src/resources/index.ts index b73cf02c..d97f8d5d 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -1,6 +1,29 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. export * from './shared'; +export { + Agents, + type Agent, + type AgentAction, + type AgentActionListResponse, + type AgentActionRejectRequest, + type AgentCreateRequest, + type AgentCreateResponse, + type AgentDeviceCode, + type AgentDeviceCodeRedeemResponse, + type AgentDeviceCodeStatusResponse, + type AgentListResponse, + type AgentPolicy, + type AgentUpdateRequest, + type AgentUsage, + type AgentCreateParams, + type AgentUpdateParams, + type AgentListParams, + type AgentListApprovalsParams, + type AgentUpdatePolicyParams, + type AgentActionsDefaultPagination, + type AgentsDefaultPagination, +} from './agents/agents'; export { Auth } from './auth/auth'; export { BeneficialOwners, @@ -36,10 +59,13 @@ export { type CustomerType, type CustomerUpdate, type IndividualCustomerFields, + type InternalAccountExportRequest, + type InternalAccountExportResponse, type CustomerGetKYCLinkResponse, type CustomerCreateParams, type CustomerUpdateParams, type CustomerListParams, + type CustomerExportParams, type CustomerGetKYCLinkParams, type CustomerListInternalAccountsParams, type CustomerOneovesDefaultPagination, @@ -57,11 +83,6 @@ export { type DocumentListResponsesDefaultPagination, } from './documents'; export { ExchangeRates, type ExchangeRateListResponse, type ExchangeRateListParams } from './exchange-rates'; -export { - InternalAccounts, - type InternalAccountExportResponse, - type InternalAccountExportParams, -} from './internal-accounts'; export { Invitations, type CurrencyAmount, @@ -147,6 +168,7 @@ export { } from './verifications'; export { Webhooks, + type AgentActionWebhookEvent, type IncomingPaymentWebhookEvent, type OutgoingPaymentWebhookEvent, type TestWebhookWebhookEvent, diff --git a/src/resources/internal-accounts.ts b/src/resources/internal-accounts.ts deleted file mode 100644 index 8d429a35..00000000 --- a/src/resources/internal-accounts.ts +++ /dev/null @@ -1,125 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -import { APIResource } from '../core/resource'; -import { APIPromise } from '../core/api-promise'; -import { buildHeaders } from '../internal/headers'; -import { RequestOptions } from '../internal/request-options'; -import { path } from '../internal/utils/path'; - -/** - * Internal account management endpoints for creating and managing internal accounts - */ -export class InternalAccounts extends APIResource { - /** - * Export the wallet credentials of an Embedded Wallet internal account. The - * returned wallet credentials are HPKE-encrypted to the `clientPublicKey` supplied - * in the request body. - * - * Export is a two-step signed-retry flow (same pattern as add-additional - * credential, revoke credential, and revoke session): - * - * 1. Call `POST /internal-accounts/{id}/export` with the request body - * `{ "clientPublicKey": "..." }` and no signature headers. Grid binds the - * `clientPublicKey` into the `payloadToSign` it returns, so the subsequent - * stamp in `Grid-Wallet-Signature` commits to the target encryption key. The - * response is `202` with `payloadToSign`, `requestId`, and `expiresAt`. - * - * 2. Use the session API keypair of a verified authentication credential on the - * same internal account to build an API-key stamp over `payloadToSign`, then - * retry with that full stamp as the `Grid-Wallet-Signature` header and the - * `requestId` echoed back as the `Request-Id` header. The retry body must carry - * the **same** `clientPublicKey` submitted in step 1 — Grid rejects the retry - * with `401` if it disagrees with what was bound into `payloadToSign`. The - * signed retry returns `200` with `encryptedWalletCredentials`, which the - * client decrypts with the matching private key. - * - * The `clientPublicKey` is ephemeral: generate a fresh P-256 keypair for this - * export and discard the private key after decrypting. Do not reuse the keypair - * from any prior verify call — that private key was already discarded after - * decrypting the session signing key it was issued against. - * - * @example - * ```ts - * const response = await client.internalAccounts.export( - * 'id', - * { - * clientPublicKey: - * '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', - * }, - * ); - * ``` - */ - export( - id: string, - params: InternalAccountExportParams, - options?: RequestOptions, - ): APIPromise { - const { 'Grid-Wallet-Signature': gridWalletSignature, 'Request-Id': requestID, ...body } = params; - return this._client.post(path`/internal-accounts/${id}/export`, { - body, - ...options, - headers: buildHeaders([ - { - ...(gridWalletSignature != null ? { 'Grid-Wallet-Signature': gridWalletSignature } : undefined), - ...(requestID != null ? { 'Request-Id': requestID } : undefined), - }, - options?.headers, - ]), - }); - } -} - -export interface InternalAccountExportResponse { - /** - * The id of the internal account that was exported. - */ - id: string; - - /** - * Encrypted wallet mnemonic, sealed to the `clientPublicKey` from the request body - * using HPKE: DHKEM(P-256, HKDF-SHA256) + HKDF-SHA256 + AES-256-GCM. Decrypt with - * the matching private key, then manage the mnemonic securely because it is the - * master key of the self-custodial Embedded Wallet. The value is a JSON string of - * the form - * `{"version": "v1.0.0", "data": "", "dataSignature": "", "enclaveQuorumPublic": ""}`. - * `data` hex-decodes to JSON - * `{"encappedPublic": "", "ciphertext": "", "organizationId": ""}`, - * where `encappedPublic` is the uncompressed SEC1 ephemeral public key. - * `dataSignature` is an ECDSA-P256-SHA256 signature over the `data` bytes produced - * by the issuer key in `enclaveQuorumPublic`; verify before decrypting. In - * sandbox, `dataSignature` and `enclaveQuorumPublic` are empty strings. Clients - * should bypass attestation verification when calling against sandbox. - */ - encryptedWalletCredentials: string; -} - -export interface InternalAccountExportParams { - /** - * Body param: Fresh P-256 public key, uncompressed SEC1 hex — 130 hex chars where - * the first two are `04` (the uncompressed-point indicator). Generate a new - * keypair for each export and discard the private key after decrypting the - * response. - */ - clientPublicKey: string; - - /** - * Header param: Full API-key stamp built over the prior `payloadToSign` with the - * session API keypair of a verified authentication credential on the target - * internal account. Required on the signed retry; ignored on the initial call. - */ - 'Grid-Wallet-Signature'?: string; - - /** - * Header param: The `requestId` returned in a prior `202` response, echoed back on - * the signed retry so the server can correlate it with the issued challenge. - * Required on the signed retry; must be paired with `Grid-Wallet-Signature`. - */ - 'Request-Id'?: string; -} - -export declare namespace InternalAccounts { - export { - type InternalAccountExportResponse as InternalAccountExportResponse, - type InternalAccountExportParams as InternalAccountExportParams, - }; -} diff --git a/src/resources/platform/external-accounts.ts b/src/resources/platform/external-accounts.ts index 3a7e8e6e..c34fb424 100644 --- a/src/resources/platform/external-accounts.ts +++ b/src/resources/platform/external-accounts.ts @@ -3,7 +3,9 @@ import { APIResource } from '../../core/resource'; import * as Shared from '../shared'; import * as ExternalAccountsAPI from '../customers/external-accounts'; +import { ExternalAccountsDefaultPagination } from '../customers/external-accounts'; import { APIPromise } from '../../core/api-promise'; +import { DefaultPagination, type DefaultPaginationParams, PagePromise } from '../../core/pagination'; import { buildHeaders } from '../../internal/headers'; import { RequestOptions } from '../../internal/request-options'; import { path } from '../../internal/utils/path'; @@ -75,15 +77,21 @@ export class ExternalAccounts extends APIResource { * * @example * ```ts - * const externalAccounts = - * await client.platform.externalAccounts.list(); + * // Automatically fetches more pages as needed. + * for await (const externalAccount of client.platform.externalAccounts.list()) { + * // ... + * } * ``` */ list( query: ExternalAccountListParams | null | undefined = {}, options?: RequestOptions, - ): APIPromise { - return this._client.get('/platform/external-accounts', { query, ...options }); + ): PagePromise { + return this._client.getAPIList( + '/platform/external-accounts', + DefaultPagination, + { query, ...options }, + ); } /** @@ -121,29 +129,24 @@ export interface AedAccountInfo { } export interface BdtAccountInfo { - /** - * The account number of the bank - */ - accountNumber: string; - accountType: 'BDT_ACCOUNT'; + paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + /** - * The name of the bank + * The account number of the bank */ - bankName: string; + accountNumber?: string; /** * The branch code */ - branchCode: string; - - paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + branchCode?: string; /** * The phone number in international format */ - phoneNumber: string; + phoneNumber?: string; /** * The SWIFT/BIC code of the bank @@ -305,24 +308,19 @@ export interface GbpAccountInfo { } export interface GhsAccountInfo { - /** - * The account number of the bank - */ - accountNumber: string; - accountType: 'GHS_ACCOUNT'; + paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + /** - * The name of the bank + * The account number of the bank */ - bankName: string; - - paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + accountNumber?: string; /** * The phone number in international format */ - phoneNumber: string; + phoneNumber?: string; } export interface GtqAccountInfo { @@ -338,11 +336,6 @@ export interface GtqAccountInfo { */ bankAccountType: 'CHECKING' | 'SAVINGS'; - /** - * The name of the bank - */ - bankName: string; - paymentRails: Array<'BANK_TRANSFER'>; } @@ -428,11 +421,6 @@ export interface JmdAccountInfo { */ bankAccountType: 'CHECKING' | 'SAVINGS'; - /** - * The name of the bank - */ - bankName: string; - /** * The branch code */ @@ -538,29 +526,29 @@ export interface PhpAccountInfo { } export interface PkrAccountInfo { + accountType: 'PKR_ACCOUNT'; + + paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + /** * The account number of the bank */ - accountNumber: string; - - accountType: 'PKR_ACCOUNT'; + accountNumber?: string; /** * The name of the bank */ - bankName: string; - - paymentRails: Array<'BANK_TRANSFER' | 'MOBILE_MONEY'>; + bankName?: string; /** - * The phone number in international format + * Pakistani IBAN (24 characters, starting with PK) */ - phoneNumber: string; + iban?: string; /** - * Pakistani IBAN (24 characters, starting with PK) + * The phone number in international format */ - iban?: string; + phoneNumber?: string; } export interface RwfAccountInfo { @@ -764,13 +752,6 @@ export interface ZmwAccountInfo { provider: string; } -export interface ExternalAccountListResponse { - /** - * List of external accounts matching the filter criteria - */ - data: Array; -} - export interface ExternalAccountCreateParams { /** * Lightning payment destination. Exactly one of `invoice`, `bolt12`, or @@ -832,11 +813,16 @@ export interface ExternalAccountCreateParams { platformAccountId?: string; } -export interface ExternalAccountListParams { +export interface ExternalAccountListParams extends DefaultPaginationParams { /** * Filter by currency code */ currency?: string; + + /** + * Maximum number of results to return (default 20, max 100) + */ + limit?: number; } export declare namespace ExternalAccounts { @@ -876,8 +862,9 @@ export declare namespace ExternalAccounts { type XofAccountInfo as XofAccountInfo, type ZarAccountInfo as ZarAccountInfo, type ZmwAccountInfo as ZmwAccountInfo, - type ExternalAccountListResponse as ExternalAccountListResponse, type ExternalAccountCreateParams as ExternalAccountCreateParams, type ExternalAccountListParams as ExternalAccountListParams, }; } + +export { type ExternalAccountsDefaultPagination }; diff --git a/src/resources/platform/index.ts b/src/resources/platform/index.ts index f9d5a1a2..9dc05a7b 100644 --- a/src/resources/platform/index.ts +++ b/src/resources/platform/index.ts @@ -37,7 +37,6 @@ export { type XofAccountInfo, type ZarAccountInfo, type ZmwAccountInfo, - type ExternalAccountListResponse, type ExternalAccountCreateParams, type ExternalAccountListParams, } from './external-accounts'; diff --git a/src/resources/platform/platform.ts b/src/resources/platform/platform.ts index 9a5864e6..5a5ea6b8 100644 --- a/src/resources/platform/platform.ts +++ b/src/resources/platform/platform.ts @@ -14,7 +14,6 @@ import { EurAccountInfo, ExternalAccountCreateParams, ExternalAccountListParams, - ExternalAccountListResponse, ExternalAccounts, GbpAccountInfo, GhsAccountInfo, @@ -143,7 +142,6 @@ export declare namespace Platform { type XofAccountInfo as XofAccountInfo, type ZarAccountInfo as ZarAccountInfo, type ZmwAccountInfo as ZmwAccountInfo, - type ExternalAccountListResponse as ExternalAccountListResponse, type ExternalAccountCreateParams as ExternalAccountCreateParams, type ExternalAccountListParams as ExternalAccountListParams, }; diff --git a/src/resources/quotes.ts b/src/resources/quotes.ts index d0061a39..7eec3cde 100644 --- a/src/resources/quotes.ts +++ b/src/resources/quotes.ts @@ -654,10 +654,8 @@ export namespace QuoteSourceOneOf { /** * The crypto network to use for the funding source. Required when `currency` is a * stablecoin (e.g. USDC, USDT). Specifies which network the customer will deposit - * on, so the correct deposit address can be generated. Example values: - * `SOLANA_MAINNET`, `SOLANA_DEVNET`, `ETHEREUM_MAINNET`, `ETHEREUM_TESTNET`, - * `BASE_MAINNET`, `BASE_TESTNET`, `SPARK_MAINNET`, `SPARK_TESTNET`, - * `LIGHTNING_MAINNET`, `LIGHTNING_REGTEST`. + * on, so the correct deposit address can be generated. Example values: `SOLANA`, + * `ETHEREUM`, `BASE`, `POLYGON`, `SPARK`, `LIGHTNING`, `BITCOIN`. */ cryptoNetwork?: string; diff --git a/src/resources/shared.ts b/src/resources/shared.ts index fd735527..6e65a546 100644 --- a/src/resources/shared.ts +++ b/src/resources/shared.ts @@ -54,6 +54,31 @@ export interface AedExternalAccountCreateInfo { swiftCode?: string; } +/** + * Details of a transfer-type agent action (TRANSFER_OUT or TRANSFER_IN). + */ +export interface AgentTransferDetails { + /** + * Transfer amount in the smallest unit of the specified currency. + */ + amount: number; + + /** + * ISO 4217 currency code for the transfer amount. + */ + currency: string; + + /** + * ID of the destination account (internal or external). + */ + destinationAccountId: string; + + /** + * ID of the source account (internal or external). + */ + sourceAccountId: string; +} + export interface BdtBeneficiary { beneficiaryType: 'INDIVIDUAL'; @@ -91,29 +116,24 @@ export interface BdtBeneficiary { } export interface BdtExternalAccountCreateInfo { - /** - * The account number of the bank - */ - accountNumber: string; - accountType: 'BDT_ACCOUNT'; + beneficiary: BdtBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + /** - * The name of the bank + * The account number of the bank */ - bankName: string; - - beneficiary: BdtBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + accountNumber?: string; /** * The branch code */ - branchCode: string; + branchCode?: string; /** * The phone number in international format */ - phoneNumber: string; + phoneNumber?: string; /** * The SWIFT/BIC code of the bank @@ -537,24 +557,19 @@ export interface GhsBeneficiary { } export interface GhsExternalAccountCreateInfo { - /** - * The account number of the bank - */ - accountNumber: string; - accountType: 'GHS_ACCOUNT'; + beneficiary: GhsBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + /** - * The name of the bank + * The account number of the bank */ - bankName: string; - - beneficiary: GhsBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + accountNumber?: string; /** * The phone number in international format */ - phoneNumber: string; + phoneNumber?: string; } export interface GtqBeneficiary { @@ -606,11 +621,6 @@ export interface GtqExternalAccountCreateInfo { */ bankAccountType: 'CHECKING' | 'SAVINGS'; - /** - * The name of the bank - */ - bankName: string; - beneficiary: GtqBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; } @@ -768,11 +778,6 @@ export interface JmdExternalAccountCreateInfo { */ bankAccountType: 'CHECKING' | 'SAVINGS'; - /** - * The name of the bank - */ - bankName: string; - beneficiary: JmdBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; /** @@ -1022,29 +1027,29 @@ export interface PkrBeneficiary { } export interface PkrExternalAccountCreateInfo { + accountType: 'PKR_ACCOUNT'; + + beneficiary: PkrBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + /** * The account number of the bank */ - accountNumber: string; - - accountType: 'PKR_ACCOUNT'; + accountNumber?: string; /** * The name of the bank */ - bankName: string; - - beneficiary: PkrBeneficiary | ExternalAccountsAPI.BusinessBeneficiary; + bankName?: string; /** - * The phone number in international format + * Pakistani IBAN (24 characters, starting with PK) */ - phoneNumber: string; + iban?: string; /** - * Pakistani IBAN (24 characters, starting with PK) + * The phone number in international format */ - iban?: string; + phoneNumber?: string; } export interface RwfBeneficiary { @@ -1283,7 +1288,6 @@ export interface VerificationError { | 'MISSING_FIELD' | 'INVALID_FIELD' | 'MISSING_LEGAL_PRESENCE_DOCUMENT' - | 'MISSING_COMPANY_DETAILS_DOCUMENT' | 'MISSING_CONTROL_STRUCTURE_DOCUMENT' | 'MISSING_OWNERSHIP_STRUCTURE_DOCUMENT' | 'MISSING_PROOF_OF_ADDRESS_DOCUMENT' @@ -1305,19 +1309,17 @@ export interface VerificationError { /** * Document types that would satisfy this requirement. The integrator can upload * any one of the listed types. Present when type is - * MISSING_LEGAL_PRESENCE_DOCUMENT, MISSING_COMPANY_DETAILS_DOCUMENT, - * MISSING_CONTROL_STRUCTURE_DOCUMENT, MISSING_OWNERSHIP_STRUCTURE_DOCUMENT, - * MISSING_PROOF_OF_ADDRESS_DOCUMENT, MISSING_IDENTITY_DOCUMENT, INVALID_DOCUMENT, - * or EXPIRED_DOCUMENT. + * MISSING_LEGAL_PRESENCE_DOCUMENT, MISSING_CONTROL_STRUCTURE_DOCUMENT, + * MISSING_OWNERSHIP_STRUCTURE_DOCUMENT, MISSING_PROOF_OF_ADDRESS_DOCUMENT, + * MISSING_IDENTITY_DOCUMENT, INVALID_DOCUMENT, or EXPIRED_DOCUMENT. * - * | Error Type | Accepted Document Types | - * | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - * | MISSING_LEGAL_PRESENCE_DOCUMENT | CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT | - * | MISSING_COMPANY_DETAILS_DOCUMENT | INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, CERTIFICATE_OF_INCORPORATION, INCUMBENCY_CERTIFICATE, GOOD_STANDING_CERTIFICATE | - * | MISSING_CONTROL_STRUCTURE_DOCUMENT | ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, INCUMBENCY_CERTIFICATE, INFORMATION_STATEMENT, STATE_REGISTRY_EXCERPT | - * | MISSING_OWNERSHIP_STRUCTURE_DOCUMENT | SHAREHOLDER_REGISTER, INFORMATION_STATEMENT, INCUMBENCY_CERTIFICATE, STATE_REGISTRY_EXCERPT, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION | - * | MISSING_PROOF_OF_ADDRESS_DOCUMENT | PROOF_OF_ADDRESS | - * | MISSING_IDENTITY_DOCUMENT | PASSPORT, DRIVERS_LICENSE, NATIONAL_ID | + * | Error Type | Accepted Document Types | + * | ------------------------------------ | -------------------------------------------------------------------------------------------------------- | + * | MISSING_LEGAL_PRESENCE_DOCUMENT | CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, ARTICLES_OF_ASSOCIATION, STATE_REGISTRY_EXCERPT | + * | MISSING_CONTROL_STRUCTURE_DOCUMENT | DIRECTOR_REGISTRY, TRUST_AGREEMENT, STATE_COMPANY_REGISTRY, PARTNERSHIP_CONTROL_AGREEMENT | + * | MISSING_OWNERSHIP_STRUCTURE_DOCUMENT | SHAREHOLDER_REGISTER, TRUST_AGREEMENT, PARTNERSHIP_AGREEMENT | + * | MISSING_PROOF_OF_ADDRESS_DOCUMENT | UTILITY_BILL, RENT_OR_LEASE_AGREEMENT, ELECTRICITY_BILL, BANK_STATEMENT, TAX_RETURN | + * | MISSING_IDENTITY_DOCUMENT | PASSPORT, DRIVERS_LICENSE, NATIONAL_ID | */ acceptedDocumentTypes?: Array< | 'PASSPORT' @@ -1337,6 +1339,13 @@ export interface VerificationError { | 'SHAREHOLDER_REGISTER' | 'POWER_OF_ATTORNEY' | 'UTILITY_BILL' + | 'ELECTRICITY_BILL' + | 'RENT_OR_LEASE_AGREEMENT' + | 'DIRECTOR_REGISTRY' + | 'TRUST_AGREEMENT' + | 'STATE_COMPANY_REGISTRY' + | 'PARTNERSHIP_CONTROL_AGREEMENT' + | 'PARTNERSHIP_AGREEMENT' | 'SELFIE' | 'OTHER' >; diff --git a/src/resources/transactions.ts b/src/resources/transactions.ts index 8e861244..f64ca0f3 100644 --- a/src/resources/transactions.ts +++ b/src/resources/transactions.ts @@ -174,6 +174,12 @@ export interface IncomingTransaction { type: 'INCOMING' | 'OUTGOING'; + /** + * If this transaction was initiated by an agent, the system-generated ID of that + * agent. Absent for platform-initiated transactions. + */ + agentId?: string; + /** * Additional information about the counterparty, if available and relevant to the * transaction and platform. @@ -304,6 +310,12 @@ export interface OutgoingTransaction { type: 'OUTGOING' | 'INCOMING'; + /** + * If this transaction was initiated by an agent, the system-generated ID of that + * agent. Absent for platform-initiated transactions. + */ + agentId?: string; + /** * Additional information about the counterparty, if available and relevant to the * transaction and platform. diff --git a/src/resources/webhooks.ts b/src/resources/webhooks.ts index 26a1a158..1fbe4367 100644 --- a/src/resources/webhooks.ts +++ b/src/resources/webhooks.ts @@ -5,6 +5,7 @@ import * as InvitationsAPI from './invitations'; import * as ReceiverAPI from './receiver'; import * as Shared from './shared'; import * as TransactionsAPI from './transactions'; +import * as AgentsAPI from './agents/agents'; import * as CustomersAPI from './customers/customers'; import * as InternalAccountsAPI from './sandbox/internal-accounts'; @@ -14,6 +15,57 @@ export class Webhooks extends APIResource { } } +export interface AgentActionWebhookEvent { + /** + * Unique identifier for this webhook delivery (can be used for idempotency) + */ + id: string; + + /** + * An action submitted by an agent that may require platform approval before + * execution. All agent-initiated operations (quote execution, transfers) are + * represented as AgentActions, giving the platform a consistent object to approve, + * reject, and audit regardless of the underlying operation type. + */ + data: AgentsAPI.AgentAction; + + /** + * ISO 8601 timestamp of when the webhook was sent + */ + timestamp: string; + + type: + | 'AGENT_ACTION.PENDING_APPROVAL' + | 'OUTGOING_PAYMENT.PENDING' + | 'OUTGOING_PAYMENT.PROCESSING' + | 'OUTGOING_PAYMENT.COMPLETED' + | 'OUTGOING_PAYMENT.FAILED' + | 'OUTGOING_PAYMENT.EXPIRED' + | 'OUTGOING_PAYMENT.REFUND_PENDING' + | 'OUTGOING_PAYMENT.REFUND_COMPLETED' + | 'OUTGOING_PAYMENT.REFUND_FAILED' + | 'INCOMING_PAYMENT.PENDING' + | 'INCOMING_PAYMENT.COMPLETED' + | 'INCOMING_PAYMENT.FAILED' + | 'CUSTOMER.KYC_APPROVED' + | 'CUSTOMER.KYC_REJECTED' + | 'CUSTOMER.KYC_PENDING' + | 'CUSTOMER.KYB_APPROVED' + | 'CUSTOMER.KYB_REJECTED' + | 'CUSTOMER.KYB_PENDING' + | 'VERIFICATION.APPROVED' + | 'VERIFICATION.REJECTED' + | 'VERIFICATION.RESOLVE_ERRORS' + | 'VERIFICATION.IN_PROGRESS' + | 'VERIFICATION.PENDING_MANUAL_REVIEW' + | 'VERIFICATION.READY_FOR_VERIFICATION' + | 'INTERNAL_ACCOUNT.BALANCE_UPDATED' + | 'INVITATION.CLAIMED' + | 'BULK_UPLOAD.COMPLETED' + | 'BULK_UPLOAD.FAILED' + | 'TEST'; +} + export interface IncomingPaymentWebhookEvent { /** * Unique identifier for this webhook delivery (can be used for idempotency) @@ -55,6 +107,7 @@ export interface IncomingPaymentWebhookEvent { | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -110,6 +163,7 @@ export interface OutgoingPaymentWebhookEvent { | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -152,7 +206,8 @@ export interface TestWebhookWebhookEvent { | 'INTERNAL_ACCOUNT.BALANCE_UPDATED' | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' - | 'BULK_UPLOAD.FAILED'; + | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL'; } export interface BulkUploadWebhookEvent { @@ -196,6 +251,7 @@ export interface BulkUploadWebhookEvent { | 'VERIFICATION.READY_FOR_VERIFICATION' | 'INTERNAL_ACCOUNT.BALANCE_UPDATED' | 'INVITATION.CLAIMED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -290,6 +346,7 @@ export interface InvitationClaimedWebhookEvent { | 'INTERNAL_ACCOUNT.BALANCE_UPDATED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -334,6 +391,7 @@ export interface CustomerUpdateWebhookEvent { | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -378,6 +436,7 @@ export interface InternalAccountStatusWebhookEvent { | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -422,6 +481,7 @@ export interface VerificationUpdateWebhookEvent { | 'INVITATION.CLAIMED' | 'BULK_UPLOAD.COMPLETED' | 'BULK_UPLOAD.FAILED' + | 'AGENT_ACTION.PENDING_APPROVAL' | 'TEST'; } @@ -467,6 +527,7 @@ export namespace VerificationUpdateWebhookEvent { } export type UnwrapWebhookEvent = + | AgentActionWebhookEvent | IncomingPaymentWebhookEvent | OutgoingPaymentWebhookEvent | TestWebhookWebhookEvent @@ -478,6 +539,7 @@ export type UnwrapWebhookEvent = export declare namespace Webhooks { export { + type AgentActionWebhookEvent as AgentActionWebhookEvent, type IncomingPaymentWebhookEvent as IncomingPaymentWebhookEvent, type OutgoingPaymentWebhookEvent as OutgoingPaymentWebhookEvent, type TestWebhookWebhookEvent as TestWebhookWebhookEvent, diff --git a/src/version.ts b/src/version.ts index 63fe8500..29d3ce71 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '1.7.1'; // x-release-please-version +export const VERSION = '1.8.0'; // x-release-please-version diff --git a/tests/api-resources/agents/actions.test.ts b/tests/api-resources/agents/actions.test.ts new file mode 100644 index 00000000..05b7a298 --- /dev/null +++ b/tests/api-resources/agents/actions.test.ts @@ -0,0 +1,48 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource actions', () => { + // Mock server tests are disabled + test.skip('approve: only required params', async () => { + const responsePromise = client.agents.actions.approve('actionId', { agentId: 'agentId' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('approve: required and optional params', async () => { + const response = await client.agents.actions.approve('actionId', { agentId: 'agentId' }); + }); + + // Mock server tests are disabled + test.skip('reject: only required params', async () => { + const responsePromise = client.agents.actions.reject('actionId', { agentId: 'agentId' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('reject: required and optional params', async () => { + const response = await client.agents.actions.reject('actionId', { + agentId: 'agentId', + reason: "Transaction amount exceeds customer's current risk limit.", + }); + }); +}); diff --git a/tests/api-resources/agents/agents.test.ts b/tests/api-resources/agents/agents.test.ts new file mode 100644 index 00000000..492778d0 --- /dev/null +++ b/tests/api-resources/agents/agents.test.ts @@ -0,0 +1,173 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource agents', () => { + // Mock server tests are disabled + test.skip('create: only required params', async () => { + const responsePromise = client.agents.create({ + customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001', + name: 'Payroll Automation Agent', + policy: { + defaultExecutionMode: 'AUTO', + permissions: ['VIEW_TRANSACTIONS'], + spendingLimits: { currency: 'USD', perTransactionLimit: 50000 }, + }, + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('create: required and optional params', async () => { + const response = await client.agents.create({ + customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001', + name: 'Payroll Automation Agent', + policy: { + defaultExecutionMode: 'AUTO', + permissions: ['VIEW_TRANSACTIONS'], + spendingLimits: { + currency: 'USD', + perTransactionLimit: 50000, + dailyLimit: 500000, + dailyTransactionLimit: 10, + monthlyLimit: 5000000, + }, + accountRestrictions: { + accountRules: [ + { + accountId: 'Account:019542f5-b3e7-1d02-0000-000000000001', + executionMode: 'AUTO', + perTransactionLimit: 10000, + }, + ], + allowedAccountIds: ['Account:019542f5-b3e7-1d02-0000-000000000001'], + }, + approvalThresholds: { amount: 100000, currency: 'USD' }, + }, + }); + }); + + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.retrieve('agentId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('update', async () => { + const responsePromise = client.agents.update('agentId', {}); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list', async () => { + const responsePromise = client.agents.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.list( + { + createdAfter: '2019-12-27T18:11:19.117Z', + createdBefore: '2019-12-27T18:11:19.117Z', + cursor: 'cursor', + customerId: 'customerId', + isConnected: true, + isPaused: true, + limit: 1, + updatedAfter: '2019-12-27T18:11:19.117Z', + updatedBefore: '2019-12-27T18:11:19.117Z', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); + + // Mock server tests are disabled + test.skip('delete', async () => { + const responsePromise = client.agents.delete('agentId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('listApprovals', async () => { + const responsePromise = client.agents.listApprovals(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('listApprovals: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.listApprovals( + { + agentId: 'agentId', + cursor: 'cursor', + customerId: 'customerId', + endDate: '2019-12-27T18:11:19.117Z', + limit: 1, + sortOrder: 'asc', + startDate: '2019-12-27T18:11:19.117Z', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); + + // Mock server tests are disabled + test.skip('updatePolicy', async () => { + const responsePromise = client.agents.updatePolicy('agentId', {}); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); +}); diff --git a/tests/api-resources/agents/device-codes.test.ts b/tests/api-resources/agents/device-codes.test.ts new file mode 100644 index 00000000..4edf0cc2 --- /dev/null +++ b/tests/api-resources/agents/device-codes.test.ts @@ -0,0 +1,47 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource deviceCodes', () => { + // Mock server tests are disabled + test.skip('getStatus', async () => { + const responsePromise = client.agents.deviceCodes.getStatus('code'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('redeem', async () => { + const responsePromise = client.agents.deviceCodes.redeem('code'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('regenerate', async () => { + const responsePromise = client.agents.deviceCodes.regenerate('agentId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); +}); diff --git a/tests/api-resources/agents/me/actions.test.ts b/tests/api-resources/agents/me/actions.test.ts new file mode 100644 index 00000000..92c98bf5 --- /dev/null +++ b/tests/api-resources/agents/me/actions.test.ts @@ -0,0 +1,50 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource actions', () => { + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.me.actions.retrieve('actionId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list', async () => { + const responsePromise = client.agents.me.actions.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.me.actions.list( + { + cursor: 'cursor', + limit: 1, + status: 'PENDING_APPROVAL', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); +}); diff --git a/tests/api-resources/agents/me/external-accounts.test.ts b/tests/api-resources/agents/me/external-accounts.test.ts new file mode 100644 index 00000000..3cde53b4 --- /dev/null +++ b/tests/api-resources/agents/me/external-accounts.test.ts @@ -0,0 +1,114 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource externalAccounts', () => { + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.me.externalAccounts.retrieve('externalAccountId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list', async () => { + const responsePromise = client.agents.me.externalAccounts.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.me.externalAccounts.list( + { + currency: 'currency', + cursor: 'cursor', + limit: 1, + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); + + // Mock server tests are disabled + test.skip('delete', async () => { + const responsePromise = client.agents.me.externalAccounts.delete('externalAccountId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('add: only required params', async () => { + const responsePromise = client.agents.me.externalAccounts.add({ + accountInfo: { + accountNumber: '12345678901', + accountType: 'USD_ACCOUNT', + beneficiary: { beneficiaryType: 'INDIVIDUAL', fullName: 'John Doe' }, + routingNumber: '123456789', + }, + currency: 'USD', + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('add: required and optional params', async () => { + const response = await client.agents.me.externalAccounts.add({ + accountInfo: { + accountNumber: '12345678901', + accountType: 'USD_ACCOUNT', + beneficiary: { + beneficiaryType: 'INDIVIDUAL', + fullName: 'John Doe', + address: { + country: 'US', + line1: '123 Main Street', + postalCode: '94105', + city: 'San Francisco', + line2: 'Apt 4B', + state: 'CA', + }, + birthDate: '1990-01-15', + countryOfResidence: 'countryOfResidence', + email: 'email', + nationality: 'US', + phoneNumber: 'phoneNumber', + }, + routingNumber: '123456789', + }, + currency: 'USD', + customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001', + defaultUmaDepositAccount: true, + platformAccountId: 'ext_acc_123456', + }); + }); +}); diff --git a/tests/api-resources/agents/me/me.test.ts b/tests/api-resources/agents/me/me.test.ts new file mode 100644 index 00000000..1db676d3 --- /dev/null +++ b/tests/api-resources/agents/me/me.test.ts @@ -0,0 +1,101 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource me', () => { + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.me.retrieve(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('createTransferIn: only required params', async () => { + const responsePromise = client.agents.me.createTransferIn({ + destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' }, + source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' }, + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('createTransferIn: required and optional params', async () => { + const response = await client.agents.me.createTransferIn({ + destination: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' }, + source: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' }, + amount: 12550, + 'Idempotency-Key': '550e8400-e29b-41d4-a716-446655440000', + }); + }); + + // Mock server tests are disabled + test.skip('createTransferOut: only required params', async () => { + const responsePromise = client.agents.me.createTransferOut({ + destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' }, + source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' }, + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('createTransferOut: required and optional params', async () => { + const response = await client.agents.me.createTransferOut({ + destination: { accountId: 'ExternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965' }, + source: { accountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123' }, + amount: 12550, + 'Idempotency-Key': '550e8400-e29b-41d4-a716-446655440000', + }); + }); + + // Mock server tests are disabled + test.skip('listInternalAccounts', async () => { + const responsePromise = client.agents.me.listInternalAccounts(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('listInternalAccounts: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.me.listInternalAccounts( + { + currency: 'currency', + cursor: 'cursor', + limit: 1, + type: 'INTERNAL_FIAT', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); +}); diff --git a/tests/api-resources/agents/me/quotes.test.ts b/tests/api-resources/agents/me/quotes.test.ts new file mode 100644 index 00000000..c8c31710 --- /dev/null +++ b/tests/api-resources/agents/me/quotes.test.ts @@ -0,0 +1,95 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource quotes', () => { + // Mock server tests are disabled + test.skip('create: only required params', async () => { + const responsePromise = client.agents.me.quotes.create({ + destination: { + accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', + destinationType: 'ACCOUNT', + }, + lockedCurrencyAmount: 1000, + lockedCurrencySide: 'SENDING', + source: { accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', sourceType: 'ACCOUNT' }, + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('create: required and optional params', async () => { + const response = await client.agents.me.quotes.create({ + destination: { + accountId: 'ExternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', + destinationType: 'ACCOUNT', + paymentRail: 'ACH', + }, + lockedCurrencyAmount: 1000, + lockedCurrencySide: 'SENDING', + source: { + accountId: 'InternalAccount:e85dcbd6-dced-4ec4-b756-3c3a9ea3d965', + sourceType: 'ACCOUNT', + customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001', + }, + description: 'Invoice #1234 payment', + immediatelyExecute: false, + lookupId: 'Lookup:019542f5-b3e7-1d02-0000-000000000009', + purposeOfPayment: 'GIFT', + senderCustomerInfo: { FULL_NAME: 'bar', NATIONALITY: 'bar' }, + 'Idempotency-Key': '', + }); + }); + + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.me.quotes.retrieve('quoteId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('execute', async () => { + const responsePromise = client.agents.me.quotes.execute('Quote:019542f5-b3e7-1d02-0000-000000000001'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('execute: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.me.quotes.execute( + 'Quote:019542f5-b3e7-1d02-0000-000000000001', + { + 'Grid-Wallet-Signature': + 'MEUCIQDx7k2N0aK4p8f3vR9J6yT5wL1mB0sXnG2hQ4vJ8zYkCgIgZ4rP9dT7eWfU3oM6KjR1qSpNvBwL0tXyA2iG8fH5dE=', + 'Idempotency-Key': '', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); +}); diff --git a/tests/api-resources/agents/me/transactions.test.ts b/tests/api-resources/agents/me/transactions.test.ts new file mode 100644 index 00000000..5c2c622f --- /dev/null +++ b/tests/api-resources/agents/me/transactions.test.ts @@ -0,0 +1,58 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource transactions', () => { + // Mock server tests are disabled + test.skip('retrieve', async () => { + const responsePromise = client.agents.me.transactions.retrieve('transactionId'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list', async () => { + const responsePromise = client.agents.me.transactions.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.agents.me.transactions.list( + { + accountIdentifier: 'accountIdentifier', + cursor: 'cursor', + endDate: '2019-12-27T18:11:19.117Z', + limit: 1, + receiverAccountIdentifier: 'receiverAccountIdentifier', + reference: 'reference', + senderAccountIdentifier: 'senderAccountIdentifier', + sortOrder: 'asc', + startDate: '2019-12-27T18:11:19.117Z', + status: 'CREATED', + type: 'INCOMING', + }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(LightsparkGrid.NotFoundError); + }); +}); diff --git a/tests/api-resources/agents/transactions.test.ts b/tests/api-resources/agents/transactions.test.ts new file mode 100644 index 00000000..b90dc95f --- /dev/null +++ b/tests/api-resources/agents/transactions.test.ts @@ -0,0 +1,48 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import LightsparkGrid from '@lightsparkdev/grid'; + +const client = new LightsparkGrid({ + username: 'My Username', + password: 'My Password', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource transactions', () => { + // Mock server tests are disabled + test.skip('approve: only required params', async () => { + const responsePromise = client.agents.transactions.approve('actionId', { agentId: 'agentId' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('approve: required and optional params', async () => { + const response = await client.agents.transactions.approve('actionId', { agentId: 'agentId' }); + }); + + // Mock server tests are disabled + test.skip('reject: only required params', async () => { + const responsePromise = client.agents.transactions.reject('actionId', { agentId: 'agentId' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('reject: required and optional params', async () => { + const response = await client.agents.transactions.reject('actionId', { + agentId: 'agentId', + reason: "Transaction amount exceeds customer's current risk limit.", + }); + }); +}); diff --git a/tests/api-resources/auth/credentials.test.ts b/tests/api-resources/auth/credentials.test.ts index 7d5e9f87..4819425a 100644 --- a/tests/api-resources/auth/credentials.test.ts +++ b/tests/api-resources/auth/credentials.test.ts @@ -57,8 +57,8 @@ describe('resource credentials', () => { }); // Mock server tests are disabled - test.skip('resendChallenge', async () => { - const responsePromise = client.auth.credentials.resendChallenge('id'); + test.skip('delete', async () => { + const responsePromise = client.auth.credentials.delete('id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -69,14 +69,15 @@ describe('resource credentials', () => { }); // Mock server tests are disabled - test.skip('resendChallenge: request options and params are passed correctly', async () => { + test.skip('delete: request options and params are passed correctly', async () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( - client.auth.credentials.resendChallenge( + client.auth.credentials.delete( 'id', { - clientPublicKey: - '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + 'Grid-Wallet-Signature': + 'eyJwdWJsaWNLZXkiOiIwMmExYjIuLi4iLCJzaWduYXR1cmUiOiIzMDQ1MDIyMTAwLi4uIiwic2NoZW1lIjoiUDI1Nl9FQ0RTQV9TSEEyNTYifQ', + 'Request-Id': '7c4a8d09-ca37-4e3e-9e0d-8c2b3e9a1f21', }, { path: '/_stainless_unknown_path' }, ), @@ -84,8 +85,8 @@ describe('resource credentials', () => { }); // Mock server tests are disabled - test.skip('revoke', async () => { - const responsePromise = client.auth.credentials.revoke('id'); + test.skip('challenge', async () => { + const responsePromise = client.auth.credentials.challenge('id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -96,15 +97,14 @@ describe('resource credentials', () => { }); // Mock server tests are disabled - test.skip('revoke: request options and params are passed correctly', async () => { + test.skip('challenge: request options and params are passed correctly', async () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( - client.auth.credentials.revoke( + client.auth.credentials.challenge( 'id', { - 'Grid-Wallet-Signature': - 'eyJwdWJsaWNLZXkiOiIwMmExYjIuLi4iLCJzaWduYXR1cmUiOiIzMDQ1MDIyMTAwLi4uIiwic2NoZW1lIjoiUDI1Nl9FQ0RTQV9TSEEyNTYifQ', - 'Request-Id': '7c4a8d09-ca37-4e3e-9e0d-8c2b3e9a1f21', + clientPublicKey: + '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', }, { path: '/_stainless_unknown_path' }, ), @@ -114,7 +114,12 @@ describe('resource credentials', () => { // Mock server tests are disabled test.skip('verify: only required params', async () => { const responsePromise = client.auth.credentials.verify('id', { - AuthCredentialVerifyRequest: { otp: '123456', type: 'EMAIL_OTP' }, + AuthCredentialVerifyRequest: { + clientPublicKey: + '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + otp: '123456', + type: 'EMAIL_OTP', + }, }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -129,10 +134,10 @@ describe('resource credentials', () => { test.skip('verify: required and optional params', async () => { const response = await client.auth.credentials.verify('id', { AuthCredentialVerifyRequest: { - otp: '123456', - type: 'EMAIL_OTP', clientPublicKey: '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + otp: '123456', + type: 'EMAIL_OTP', }, 'Request-Id': '7c4a8d09-ca37-4e3e-9e0d-8c2b3e9a1f21', }); diff --git a/tests/api-resources/auth/sessions.test.ts b/tests/api-resources/auth/sessions.test.ts index 8268156d..c1267050 100644 --- a/tests/api-resources/auth/sessions.test.ts +++ b/tests/api-resources/auth/sessions.test.ts @@ -27,8 +27,8 @@ describe('resource sessions', () => { }); // Mock server tests are disabled - test.skip('revoke', async () => { - const responsePromise = client.auth.sessions.revoke('id'); + test.skip('delete', async () => { + const responsePromise = client.auth.sessions.delete('id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; @@ -39,10 +39,10 @@ describe('resource sessions', () => { }); // Mock server tests are disabled - test.skip('revoke: request options and params are passed correctly', async () => { + test.skip('delete: request options and params are passed correctly', async () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( - client.auth.sessions.revoke( + client.auth.sessions.delete( 'id', { 'Grid-Wallet-Signature': diff --git a/tests/api-resources/crypto.test.ts b/tests/api-resources/crypto.test.ts index 9e3e5aed..6c32834e 100644 --- a/tests/api-resources/crypto.test.ts +++ b/tests/api-resources/crypto.test.ts @@ -13,7 +13,7 @@ describe('resource crypto', () => { test.skip('estimateWithdrawalFee: only required params', async () => { const responsePromise = client.crypto.estimateWithdrawalFee({ amount: 1000000, - cryptoNetwork: 'SOLANA_MAINNET', + cryptoNetwork: 'SOLANA', currency: 'USDC', destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', @@ -31,7 +31,7 @@ describe('resource crypto', () => { test.skip('estimateWithdrawalFee: required and optional params', async () => { const response = await client.crypto.estimateWithdrawalFee({ amount: 1000000, - cryptoNetwork: 'SOLANA_MAINNET', + cryptoNetwork: 'SOLANA', currency: 'USDC', destinationAddress: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', internalAccountId: 'InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123', diff --git a/tests/api-resources/customers/customers.test.ts b/tests/api-resources/customers/customers.test.ts index 07cc15d1..672c95b9 100644 --- a/tests/api-resources/customers/customers.test.ts +++ b/tests/api-resources/customers/customers.test.ts @@ -147,6 +147,32 @@ describe('resource customers', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // Mock server tests are disabled + test.skip('export: only required params', async () => { + const responsePromise = client.customers.export('id', { + clientPublicKey: + '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('export: required and optional params', async () => { + const response = await client.customers.export('id', { + clientPublicKey: + '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', + 'Grid-Wallet-Signature': + 'eyJwdWJsaWNLZXkiOiIwMmExYjIuLi4iLCJzaWduYXR1cmUiOiIzMDQ1MDIyMTAwLi4uIiwic2NoZW1lIjoiUDI1Nl9FQ0RTQV9TSEEyNTYifQ', + 'Request-Id': '7c4a8d09-ca37-4e3e-9e0d-8c2b3e9a1f21', + }); + }); + // Mock server tests are disabled test.skip('getKYCLink: only required params', async () => { const responsePromise = client.customers.getKYCLink({ platformCustomerId: 'platformCustomerId' }); diff --git a/tests/api-resources/customers/external-accounts.test.ts b/tests/api-resources/customers/external-accounts.test.ts index 4a841adb..92c7c3d5 100644 --- a/tests/api-resources/customers/external-accounts.test.ts +++ b/tests/api-resources/customers/external-accounts.test.ts @@ -55,7 +55,6 @@ describe('resource externalAccounts', () => { routingNumber: '123456789', }, currency: 'USD', - cryptoNetwork: 'SOLANA_MAINNET', customerId: 'Customer:019542f5-b3e7-1d02-0000-000000000001', defaultUmaDepositAccount: true, platformAccountId: 'ext_acc_123456', diff --git a/tests/api-resources/internal-accounts.test.ts b/tests/api-resources/internal-accounts.test.ts deleted file mode 100644 index 0e2d718b..00000000 --- a/tests/api-resources/internal-accounts.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -import LightsparkGrid from '@lightsparkdev/grid'; - -const client = new LightsparkGrid({ - username: 'My Username', - password: 'My Password', - baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', -}); - -describe('resource internalAccounts', () => { - // Mock server tests are disabled - test.skip('export: only required params', async () => { - const responsePromise = client.internalAccounts.export('id', { - clientPublicKey: - '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', - }); - const rawResponse = await responsePromise.asResponse(); - expect(rawResponse).toBeInstanceOf(Response); - const response = await responsePromise; - expect(response).not.toBeInstanceOf(Response); - const dataAndResponse = await responsePromise.withResponse(); - expect(dataAndResponse.data).toBe(response); - expect(dataAndResponse.response).toBe(rawResponse); - }); - - // Mock server tests are disabled - test.skip('export: required and optional params', async () => { - const response = await client.internalAccounts.export('id', { - clientPublicKey: - '04f45f2a22c908b9ce09a7150e514afd24627c401c38a4afc164e1ea783adaaa31d4245acfb88c2ebd42b47628d63ecabf345484f0a9f665b63c54c897d5578be2', - 'Grid-Wallet-Signature': - 'eyJwdWJsaWNLZXkiOiIwMmExYjIuLi4iLCJzaWduYXR1cmUiOiIzMDQ1MDIyMTAwLi4uIiwic2NoZW1lIjoiUDI1Nl9FQ0RTQV9TSEEyNTYifQ', - 'Request-Id': '7c4a8d09-ca37-4e3e-9e0d-8c2b3e9a1f21', - }); - }); -}); diff --git a/tests/api-resources/platform/external-accounts.test.ts b/tests/api-resources/platform/external-accounts.test.ts index 76ea2190..d579b8f9 100644 --- a/tests/api-resources/platform/external-accounts.test.ts +++ b/tests/api-resources/platform/external-accounts.test.ts @@ -87,7 +87,14 @@ describe('resource externalAccounts', () => { test.skip('list: request options and params are passed correctly', async () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( - client.platform.externalAccounts.list({ currency: 'currency' }, { path: '/_stainless_unknown_path' }), + client.platform.externalAccounts.list( + { + currency: 'currency', + cursor: 'cursor', + limit: 1, + }, + { path: '/_stainless_unknown_path' }, + ), ).rejects.toThrow(LightsparkGrid.NotFoundError); });