From 966f95a873ac99cc979f04843650ac87c2e79ee5 Mon Sep 17 00:00:00 2001 From: Francisca Otero Date: Thu, 5 Nov 2026 12:05:00 +0000 Subject: [PATCH] feat(organizations): add POST /v1/organizations Co-authored-by: fin-compose[bot] <255610621+fin-compose[bot]@users.noreply.github.com> --- README.md | 17 +++++++++++ src/lib/core.ts | 3 ++ src/lib/managers/index.ts | 1 + src/lib/managers/organizationsManager.ts | 7 +++++ src/lib/resources/organization.ts | 3 ++ src/spec/integration.spec.ts | 37 ++++++++++++++++++++++++ 6 files changed, 68 insertions(+) create mode 100644 src/lib/managers/organizationsManager.ts create mode 100644 src/lib/resources/organization.ts diff --git a/README.md b/README.md index b4a1805..dc3f89d 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ - [Disputes](#disputes) - [Links](#links) - [Refresh intents](#refresh-intents) + - [Organizations](#organizations) - [Webhook Signature Validation](#webhook-signature-validation) - [Idempotency Keys](#idempotency-keys) - [Serialization](#serialization) @@ -419,6 +420,22 @@ const refreshIntent = await fintocClient.refreshIntents.create({ }); ``` +### Organizations + +Creating an organization requires a JWS private key and a live API key. It returns the created organization, or the existing one if it was already created: + +```javascript +const fintocClient = new Fintoc('your_api_key', 'path/to/private_key.pem'); + +const organization = await fintocClient.organizations.create({ + name: 'Empresa SpA', + tax_id: '11.111.111-1', + founder_email: 'jared@piedpiper.com', + products: { business_accounts: {} }, + external_reference: 'SOL-123', +}); +``` + ### Webhook Signature Validation To ensure the authenticity of incoming webhooks from Fintoc, you should always validate the signature. The SDK provides a `WebhookSignature` class to verify the `Fintoc-Signature` header diff --git a/src/lib/core.ts b/src/lib/core.ts index 1b2c0e9..6bb92af 100644 --- a/src/lib/core.ts +++ b/src/lib/core.ts @@ -11,6 +11,7 @@ import { InvoicesManager, LinkIntentsManager, LinksManager, + OrganizationsManager, PaymentIntentsManager, PaymentLinksManager, PayoutsManager, @@ -96,6 +97,7 @@ export class Fintoc { invoices: InvoicesManager; linkIntents: LinkIntentsManager; links: LinksManager; + organizations: OrganizationsManager; paymentIntents: PaymentIntentsManager; paymentLinks: PaymentLinksManager; payouts: PayoutsManager; @@ -126,6 +128,7 @@ export class Fintoc { this.invoices = new InvoicesManager('/v1/invoices', this.#client); this.linkIntents = new LinkIntentsManager('/v1/link_intents', this.#client); this.links = new LinksManager('/v1/links', this.#client); + this.organizations = new OrganizationsManager('/v1/organizations', this.#client); this.paymentIntents = new PaymentIntentsManager('/v1/payment_intents', this.#client); this.paymentLinks = new PaymentLinksManager('/v1/payment_links', this.#client); this.payouts = new PayoutsManager('/v1/payouts', this.#client); diff --git a/src/lib/managers/index.ts b/src/lib/managers/index.ts index 72567dc..5c3a599 100644 --- a/src/lib/managers/index.ts +++ b/src/lib/managers/index.ts @@ -5,6 +5,7 @@ export * from './disputesManager'; export * from './eventsManager'; export * from './invoicesManager'; export * from './linksManager'; +export * from './organizationsManager'; export * from './movementsManager'; export * from './paymentIntentsManager'; export * from './paymentLinksManager'; diff --git a/src/lib/managers/organizationsManager.ts b/src/lib/managers/organizationsManager.ts new file mode 100644 index 0000000..ea8a8a1 --- /dev/null +++ b/src/lib/managers/organizationsManager.ts @@ -0,0 +1,7 @@ +import { ManagerMixin } from '../mixins'; +import { Organization } from '../resources/organization'; + +export class OrganizationsManager extends ManagerMixin { + static resource = 'organization'; + static methods = ['create']; +} diff --git a/src/lib/resources/organization.ts b/src/lib/resources/organization.ts new file mode 100644 index 0000000..4e21fe0 --- /dev/null +++ b/src/lib/resources/organization.ts @@ -0,0 +1,3 @@ +import { ResourceMixin } from '../mixins/resourceMixin'; + +export class Organization extends ResourceMixin {} diff --git a/src/spec/integration.spec.ts b/src/spec/integration.spec.ts index 48965c2..43373fb 100644 --- a/src/spec/integration.spec.ts +++ b/src/spec/integration.spec.ts @@ -654,6 +654,43 @@ test('fintoc.refunds.cancel()', async (t) => { t.is(refund.headers['Idempotency-Key'], 'idem_123'); }); +test('fintoc.organizations.create()', async (t) => { + const ctx: any = t.context; + const organizationData = { + name: 'Empresa SpA', + tax_id: '11.111.111-1', + founder_email: 'founder@example.com', + products: { business_accounts: {} }, + external_reference: 'ref_123', + }; + const organization = await ctx.fintoc.organizations.create(organizationData); + + t.is(organization.method, 'post'); + t.is(organization.url, 'v1/organizations'); + t.is(organization.json.name, organizationData.name); + t.is(organization.json.tax_id, organizationData.tax_id); + t.is(organization.json.founder_email, organizationData.founder_email); + t.truthy(organization.json.products.business_accounts); + t.is(organization.json.external_reference, organizationData.external_reference); + t.true(organization.headers['Idempotency-Key'] && organization.headers['Idempotency-Key'].length > 0); +}); + +test('fintoc.organizations.create() with idempotency key', async (t) => { + const ctx: any = t.context; + const organization = await ctx.fintoc.organizations.create({ + name: 'Empresa SpA', + tax_id: '11.111.111-1', + founder_email: 'founder@example.com', + products: { business_accounts: {} }, + idempotency_key: 'idem_123', + }); + + t.is(organization.method, 'post'); + t.is(organization.url, 'v1/organizations'); + t.is(organization.headers['Idempotency-Key'], 'idem_123'); + t.is(organization.json.idempotency_key, undefined); +}); + test('fintoc.disputes.list()', async (t) => { const ctx: any = t.context; const disputes = await ctx.fintoc.disputes.list();