@delopay/sdk 0.18.1 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/error.ts","../src/resources/apiKeys.ts","../src/resources/authentication.ts","../src/resources/billing.ts","../src/resources/blocklist.ts","../src/resources/connectors.ts","../src/resources/customers.ts","../src/resources/disputes.ts","../src/resources/ephemeralKeys.ts","../src/resources/events.ts","../src/resources/fees.ts","../src/resources/mandates.ts","../src/resources/merchantAccounts.ts","../src/resources/paymentLinks.ts","../src/resources/paymentMethods.ts","../src/resources/payments.ts","../src/resources/payouts.ts","../src/resources/poll.ts","../src/resources/profileAcquirers.ts","../src/resources/profiles.ts","../src/resources/projects.ts","../src/resources/refunds.ts","../src/resources/relay.ts","../src/resources/routing.ts","../src/resources/shops.ts","../src/resources/stripeConnect.ts","../src/resources/threeDsRules.ts","../src/resources/users.ts","../src/resources/verification.ts","../src/resources/webhooks.ts","../src/resources/analytics.ts","../src/resources/analyticsDashboard.ts","../src/resources/cards.ts","../src/resources/export.ts","../src/resources/featureMatrix.ts","../src/resources/files.ts","../src/resources/forex.ts","../src/resources/regions.ts","../src/resources/subscriptions.ts","../src/client.ts"],"sourcesContent":["export { Delopay } from './client';\nexport type { DelopayOptions, RequestOptions, RequestFn, DelopayLogger } from './client';\nexport { DelopayError, DelopayAuthenticationError } from './error';\nexport type * from './types';\nexport { Webhooks } from './resources/webhooks';\nexport type { WebhookEvent } from './resources/webhooks';\n\n// New resources (Phases 3-4)\nexport { Analytics } from './resources/analytics';\nexport { AnalyticsDashboard } from './resources/analyticsDashboard';\nexport { Cards } from './resources/cards';\nexport { Export } from './resources/export';\nexport { FeatureMatrix } from './resources/featureMatrix';\nexport { Files } from './resources/files';\nexport { Forex } from './resources/forex';\nexport { Regions } from './resources/regions';\nexport { Subscriptions } from './resources/subscriptions';\n","/**\n * Error thrown when the Delopay API returns a non-2xx response, or when a\n * timeout or network error occurs.\n *\n * @example\n * ```typescript\n * try {\n * await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * } catch (e) {\n * if (e instanceof DelopayError) {\n * console.error(e.status, e.code, e.requestId, e.message);\n * }\n * }\n * ```\n */\nexport class DelopayError extends Error {\n /** HTTP status code returned by the API, or `0` for timeout/network errors. */\n readonly status: number;\n /** Machine-readable error code returned by the API (e.g. `'HE_00'`). */\n readonly code: string;\n /** Error category (e.g. `'invalid_request'`, `'timeout_error'`). */\n readonly type: string;\n /** Value of the `x-request-id` response header, when present. Include this when contacting support. */\n readonly requestId?: string;\n /**\n * Raw response body (truncated to ~2 KB). Populated when the server returns a\n * non-JSON error body (e.g. an HTML 502 from an upstream proxy) so debugging\n * still has something to go on.\n */\n readonly rawBody?: string;\n /**\n * Structured error context the API attaches under `error.data` for select\n * codes — e.g. `{ retry_after_secs: 248 }` on rate-limit / max-attempt\n * lockouts. Schema is per-code; consult the API reference for the shape.\n */\n readonly data?: Record<string, unknown>;\n\n constructor(\n message: string,\n options: {\n status: number;\n code: string;\n type: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.rawBody !== undefined) this.rawBody = options.rawBody;\n if (options.data !== undefined) this.data = options.data;\n }\n}\n\n/**\n * Thrown when the API key is missing, invalid, or revoked (HTTP 401).\n *\n * @example\n * ```typescript\n * if (e instanceof DelopayAuthenticationError) {\n * // Prompt user to re-enter their API key.\n * }\n * ```\n */\nexport class DelopayAuthenticationError extends DelopayError {\n constructor(\n message = 'Invalid API key',\n options?: {\n code?: string;\n type?: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message, {\n status: 401,\n // Default to the generic \"invalid API key\" code, but let callers pass\n // through the server-reported code (e.g. `UR_05` for unverified-email\n // 401s) so they can differentiate between auth failure reasons.\n code: options?.code || 'AUTH_01',\n type: options?.type || 'authentication_error',\n requestId: options?.requestId,\n rawBody: options?.rawBody,\n data: options?.data,\n });\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayAuthenticationError';\n }\n}\n","import type {\n ApiKeyCreateRequest,\n ApiKeyCreateResponse,\n ApiKeyResponse,\n ApiKeyUpdateRequest,\n ApiKeyRevokeResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage API keys for a merchant account. */\nexport class ApiKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new API key for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Key creation parameters (name, expiry, etc.).\n * @returns The newly created key including the plaintext secret (shown once only).\n *\n * @example\n * ```typescript\n * const { key_value } = await delopay.apiKeys.create('merch_123', { name: 'Production key' });\n * ```\n */\n async create(merchantId: string, params: ApiKeyCreateRequest): Promise<ApiKeyCreateResponse> {\n return this.request('POST', `/api_keys/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve metadata about an API key (does not return the plaintext secret).\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID.\n * @returns The API key metadata.\n */\n async retrieve(merchantId: string, keyId: string): Promise<ApiKeyResponse> {\n return this.request(\n 'GET',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * Update an API key's name or expiry.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to update.\n * @param params - Fields to update.\n * @returns The updated API key metadata.\n */\n async update(\n merchantId: string,\n keyId: string,\n params: ApiKeyUpdateRequest,\n ): Promise<ApiKeyResponse> {\n return this.request(\n 'POST',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n { body: params },\n );\n }\n\n /**\n * Revoke an API key, immediately invalidating it.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(merchantId: string, keyId: string): Promise<ApiKeyRevokeResponse> {\n return this.request(\n 'DELETE',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * List all API keys for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of API key metadata objects.\n */\n async list(merchantId: string): Promise<ApiKeyResponse[]> {\n return this.request('GET', `/api_keys/${encodeURIComponent(merchantId)}/list`);\n }\n}\n","import type { AuthenticationCreateRequest, AuthenticationResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Authentication {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: AuthenticationCreateRequest): Promise<AuthenticationResponse> {\n return this.request('POST', '/authentication', { body: params });\n }\n\n async checkEligibility(authId: string): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility`);\n }\n\n async authenticate(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/authenticate`, {\n body: params,\n });\n }\n\n async sync(authId: string, params?: Record<string, unknown>): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/sync`, {\n body: params,\n });\n }\n\n /** Redirect after authentication. `POST /authentication/{authId}/redirect` */\n async redirect(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/redirect`, {\n body: params,\n });\n }\n\n /** Enable authn methods token. `POST /authentication/{authId}/enabled_authn_methods_token` */\n async enabledAuthnMethodsToken(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request(\n 'POST',\n `/authentication/${encodeURIComponent(authId)}/enabled_authn_methods_token`,\n {\n body: params,\n },\n );\n }\n\n /** Submit eligibility check. `POST /authentication/{authId}/eligibility-check` */\n async eligibilityCheck(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility-check`, {\n body: params,\n });\n }\n}\n","import type {\n BillingProfileResponse,\n BillingSetupRequest,\n BillingSetupResponse,\n BillingCompleteSetupRequest,\n TopupRequest,\n TopupResponse,\n LedgerResponse,\n LedgerListParams,\n AutoRechargeUpdateRequest,\n AllocationTransferRequest,\n AllocationTransferResponse,\n AllocationListResponse,\n AllocationResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage per-shop prepaid balance allocations transferred from the host merchant treasury. */\nclass BillingAllocations {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Transfer funds from the host merchant treasury into a shop's allocation.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, target profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferIn(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-in`,\n { body: params },\n );\n }\n\n /**\n * Transfer funds from a shop's allocation back to the host merchant treasury.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, source profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferOut(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-out`,\n {\n body: params,\n },\n );\n }\n\n /**\n * List all shop balance allocations for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns List of shop allocations.\n */\n async list(merchantId: string): Promise<AllocationListResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/allocations`);\n }\n\n /**\n * Get the balance allocation for a specific shop.\n *\n * @param merchantId - The merchant account ID.\n * @param profileId - The shop (business profile) ID.\n * @returns The shop's balance allocation.\n */\n async get(merchantId: string, profileId: string): Promise<AllocationResponse> {\n return this.request(\n 'GET',\n `/billing/${encodeURIComponent(merchantId)}/allocations/${encodeURIComponent(profileId)}`,\n );\n }\n}\n\n/**\n * Manage prepaid billing balances — top-ups, card setup, auto-recharge, and the balance ledger.\n *\n * Delopay deducts a platform fee from the merchant's prepaid balance on every successful payment.\n * Use these endpoints to fund and monitor that balance.\n */\nexport class Billing {\n /** Per-shop balance allocation management for host merchants. */\n readonly allocations: BillingAllocations;\n\n constructor(private readonly request: RequestFn) {\n this.allocations = new BillingAllocations(request);\n }\n\n /**\n * Retrieve a merchant's billing profile (balance, status, auto-recharge config).\n *\n * @param merchantId - The merchant account ID.\n * @returns The billing profile.\n *\n * @example\n * ```typescript\n * const profile = await delopay.billing.getProfile('merch_123');\n * console.log(profile.balance, profile.status);\n * ```\n */\n async getProfile(merchantId: string): Promise<BillingProfileResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Start a Stripe SetupIntent flow to collect a payment card for auto-recharge.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional setup parameters.\n * @returns The Stripe client secret needed to render the card element.\n */\n async setup(merchantId: string, params?: BillingSetupRequest): Promise<BillingSetupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup`, {\n body: params,\n });\n }\n\n /**\n * Confirm card setup after the Stripe SetupIntent completes on the frontend.\n *\n * @param merchantId - The merchant account ID.\n * @param params - The Stripe SetupIntent ID to confirm.\n * @returns The updated billing profile.\n */\n async completeSetup(\n merchantId: string,\n params: BillingCompleteSetupRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup/complete`, {\n body: params,\n });\n }\n\n /**\n * Manually top up a merchant's prepaid balance by charging their saved card.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Top-up amount and currency.\n * @returns The top-up result.\n */\n async topup(merchantId: string, params: TopupRequest): Promise<TopupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/topup`, {\n body: params,\n });\n }\n\n /**\n * List the balance ledger (credits and debits) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional pagination parameters.\n * @returns The ledger entries.\n */\n async listLedger(merchantId: string, params?: LedgerListParams): Promise<LedgerResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/ledger`, {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Update auto-recharge configuration (threshold, top-up amount, enabled flag).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Auto-recharge settings to update.\n * @returns The updated billing profile.\n */\n async updateAutoRecharge(\n merchantId: string,\n params: AutoRechargeUpdateRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('PATCH', `/billing/${encodeURIComponent(merchantId)}/auto-recharge`, {\n body: params,\n });\n }\n}\n","import type { BlocklistAddRequest, BlocklistResponse, BlocklistDataKind } from '../types';\nimport type { RequestFn } from '../client';\n\nexport interface BlocklistListParams {\n data_kind?: BlocklistDataKind | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface BlocklistToggleParams {\n status: boolean;\n}\n\nexport class Blocklist {\n constructor(private readonly request: RequestFn) {}\n\n async add(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('POST', '/blocklist', { body: params });\n }\n\n async remove(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('DELETE', '/blocklist', { body: params });\n }\n\n async list(params?: BlocklistListParams): Promise<BlocklistResponse[]> {\n return this.request('GET', '/blocklist', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async toggle(params: BlocklistToggleParams): Promise<Record<string, unknown>> {\n return this.request('POST', '/blocklist/toggle', { body: params });\n }\n}\n","import type {\n ConnectorCreateRequest,\n ConnectorResponse,\n ConnectorUpdateRequest,\n ConnectorWebhookListResponse,\n ConnectorWebhookRegisterRequest,\n ConnectorWebhookRegisterResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Connectors {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ConnectorCreateRequest): Promise<ConnectorResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/connectors`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n async list(accountId: string): Promise<ConnectorResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/connectors`);\n }\n\n async update(\n accountId: string,\n connectorId: string,\n params: ConnectorUpdateRequest,\n ): Promise<ConnectorResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Verify connector credentials. `POST /account/connectors/verify` */\n async verify(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/account/connectors/verify', { body: params });\n }\n\n /**\n * Register a webhook for a connector.\n * `POST /account/{merchantId}/connectors/webhooks/{connectorId}`\n *\n * @param params - Optional event scope. Defaults to `{ event_type: 'all_events' }`\n * on the backend when omitted; pass `{ event_type: { specific_event: '…' } }`\n * to scope to a single event.\n */\n async registerWebhook(\n merchantId: string,\n connectorId: string,\n params?: ConnectorWebhookRegisterRequest,\n ): Promise<ConnectorWebhookRegisterResponse> {\n const path = `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`;\n if (params === undefined) return this.request('POST', path);\n return this.request('POST', path, { body: params });\n }\n\n /** Get registered webhooks for a connector. `GET /account/{merchantId}/connectors/webhooks/{connectorId}` */\n async getWebhook(merchantId: string, connectorId: string): Promise<ConnectorWebhookListResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`,\n );\n }\n\n /** List available payment methods. `GET /account/payment_methods` */\n async listPaymentMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/account/payment_methods');\n }\n}\n","import type {\n CustomerCreateRequest,\n CustomerResponse,\n CustomerUpdateRequest,\n CustomerListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage customer profiles. */\nexport class Customers {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new customer.\n *\n * @param params - Customer creation parameters (name, email, phone, address, etc.).\n * @returns The created customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.create({\n * email: 'alice@example.com',\n * name: 'Alice Smith',\n * });\n * ```\n */\n async create(params: CustomerCreateRequest): Promise<CustomerResponse> {\n return this.request('POST', '/customers', { body: params });\n }\n\n /**\n * Retrieve a customer by their ID.\n *\n * @param customerId - The unique customer ID.\n * @returns The customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.retrieve('cus_abc123');\n * ```\n */\n async retrieve(customerId: string): Promise<CustomerResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * Update an existing customer's details.\n *\n * @param customerId - The customer ID to update.\n * @param params - Fields to update (name, email, address, metadata, etc.).\n * @returns The updated customer.\n */\n async update(customerId: string, params: CustomerUpdateRequest): Promise<CustomerResponse> {\n return this.request('POST', `/customers/${encodeURIComponent(customerId)}`, { body: params });\n }\n\n /**\n * Delete a customer and all their saved payment methods.\n *\n * @param customerId - The customer ID to delete.\n * @returns The deleted customer object.\n */\n async delete(customerId: string): Promise<CustomerResponse> {\n return this.request('DELETE', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * List customers, optionally filtered by email.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of customer objects.\n */\n async list(params?: CustomerListParams): Promise<CustomerResponse[]> {\n return this.request('GET', '/customers/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.6) ---\n\n /** List customers with count. `GET /customers/list_with_count` */\n async listWithCount(\n params?: CustomerListParams,\n ): Promise<{ count: number; total_count: number; data: CustomerResponse[] }> {\n return this.request('GET', '/customers/list_with_count', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /** List mandates for a customer. `GET /customers/{customerId}/mandates` */\n async listMandates(customerId: string): Promise<Record<string, unknown>[]> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/mandates`);\n }\n}\n","import type { DisputeResponse, DisputeListParams, DisputeEvidenceRequest } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and respond to payment disputes and chargebacks. */\nexport class Disputes {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a dispute by its ID.\n *\n * @param disputeId - The unique dispute ID.\n * @returns The dispute.\n */\n async retrieve(disputeId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * List disputes, optionally filtered by status, stage, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of disputes.\n */\n async list(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Accept a dispute, conceding the chargeback to the customer.\n *\n * @param disputeId - The dispute ID to accept.\n * @returns The updated dispute.\n */\n async accept(disputeId: string): Promise<DisputeResponse> {\n return this.request('POST', `/disputes/accept/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Submit evidence to challenge a dispute.\n *\n * @param params - Evidence details and the dispute ID to contest.\n * @returns The updated dispute.\n */\n async submitEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('POST', '/disputes/evidence', { body: params });\n }\n\n /**\n * Attach evidence (e.g. file upload metadata) to a dispute.\n *\n * Uses `PUT /disputes/evidence`.\n */\n async attachEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('PUT', '/disputes/evidence', { body: params });\n }\n\n /**\n * Retrieve previously submitted evidence for a dispute.\n *\n * @param disputeId - The dispute ID.\n * @returns The submitted evidence.\n */\n async retrieveEvidence(disputeId: string): Promise<DisputeEvidenceRequest> {\n return this.request('GET', `/disputes/evidence/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Delete submitted evidence for a dispute.\n *\n * @param params - Evidence request body identifying what to delete.\n * @returns The updated dispute.\n */\n async deleteEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('DELETE', '/disputes/evidence', { body: params });\n }\n\n // --- OLAP extensions (Task 4.4) ---\n\n /** List disputes (profile-scoped). `GET /disputes/profile/list` */\n async listByProfile(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get dispute filter options. `GET /disputes/filter` */\n async getFilters(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/filter', { query: params });\n }\n\n /** Get dispute filters (profile-scoped). `GET /disputes/profile/filter` */\n async getFiltersByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/filter', { query: params });\n }\n\n /** Get dispute aggregates. `GET /disputes/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/aggregate', { query: params });\n }\n\n /** Get dispute aggregates (profile-scoped). `GET /disputes/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/aggregate', { query: params });\n }\n\n /**\n * Fetch the latest dispute state from the connector (gateway).\n * `GET /disputes/{connectorId}/fetch`\n *\n * Note: the path parameter is the **connector dispute id** on the gateway, not the\n * Delopay dispute id. Method is GET (not POST) and this method signature was\n * previously wrong — callers depending on the old `POST /disputes/{id}/fetch_from_connector`\n * path were silently hitting 404s.\n */\n async fetchFromConnector(connectorId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(connectorId)}/fetch`);\n }\n}\n","import type { EphemeralKeyCreateRequest, EphemeralKeyCreateResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create short-lived ephemeral keys for secure client-side operations.\n *\n * Ephemeral keys grant a mobile or browser client temporary access to a\n * specific customer's data (e.g. to display saved payment methods) without\n * exposing your secret API key.\n */\nexport class EphemeralKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create an ephemeral key scoped to a specific customer.\n *\n * @param params - Customer ID and optional expiry.\n * @returns The ephemeral key with its plaintext secret and expiry timestamp.\n *\n * @example\n * ```typescript\n * const ephKey = await delopay.ephemeralKeys.create({ customer_id: 'cus_123' });\n * // Pass ephKey.secret to your mobile app.\n * ```\n */\n async create(params: EphemeralKeyCreateRequest): Promise<EphemeralKeyCreateResponse> {\n return this.request('POST', '/ephemeral_keys', { body: params });\n }\n\n /**\n * Invalidate an ephemeral key before it expires.\n *\n * @param keyId - The ephemeral key ID to delete.\n * @returns The deleted key object.\n */\n async delete(keyId: string): Promise<EphemeralKeyCreateResponse> {\n return this.request('DELETE', `/ephemeral_keys/${encodeURIComponent(keyId)}`);\n }\n}\n","import type {\n EventListParams,\n EventListResponse,\n EventDeliveryAttemptResponse,\n EventDetailResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Events {\n constructor(private readonly request: RequestFn) {}\n\n async list(merchantId: string, params?: EventListParams): Promise<EventListResponse> {\n return this.request('POST', `/events/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n async listDeliveryAttempts(\n merchantId: string,\n eventId: string,\n ): Promise<EventDeliveryAttemptResponse[]> {\n return this.request(\n 'GET',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/attempts`,\n );\n }\n\n async retryDelivery(merchantId: string, eventId: string): Promise<EventDetailResponse> {\n return this.request(\n 'POST',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/retry`,\n );\n }\n\n // --- Profile-scoped listing (Task 4.12) ---\n\n /** List events (profile-scoped). `POST /events/profile/list` */\n async listByProfile(params?: Record<string, unknown>): Promise<EventListResponse> {\n return this.request('POST', '/events/profile/list', { body: params });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Merchant-scoped fee schedules. Each schedule optionally targets a\n * specific shop (via `shop_id`). Merchants can CRUD their own fee\n * overrides; platform-wide fee programs are administered by Delopay and\n * not exposed here.\n */\nexport class Fees {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a merchant-scoped fee schedule (optionally per-shop).\n *\n * @param params - Fee schedule parameters.\n * @param merchantId - The merchant account ID.\n */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/merchant_fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * List the merchant's own fee schedules.\n *\n * @param merchantId - The merchant account ID.\n */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/merchant_fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Update a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n * @param params - Fields to update.\n */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/merchant_fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /**\n * Delete a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/merchant_fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { MandateResponse, MandateRevokedResponse, MandateListParams } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and revoke recurring payment mandates. */\nexport class Mandates {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a mandate by its ID.\n *\n * @param mandateId - The unique mandate ID.\n * @returns The mandate.\n */\n async retrieve(mandateId: string): Promise<MandateResponse> {\n return this.request('GET', `/mandates/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * Revoke an active mandate, preventing future charges.\n *\n * @param mandateId - The mandate ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(mandateId: string): Promise<MandateRevokedResponse> {\n return this.request('POST', `/mandates/revoke/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * List mandates, optionally filtered by customer or status.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of mandates.\n */\n async list(params?: MandateListParams): Promise<MandateResponse[]> {\n return this.request('GET', '/mandates/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n}\n","import type {\n MerchantAccountCreateRequest,\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class MerchantAccounts {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: MerchantAccountCreateRequest): Promise<MerchantAccountResponse> {\n return this.request('POST', '/accounts', { body: params });\n }\n\n async retrieve(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n async update(\n accountId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}`, { body: params });\n }\n\n async delete(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n // --- Advanced operations (Task 4.9) ---\n\n /** List all merchant accounts. `GET /accounts/list` */\n async list(): Promise<MerchantAccountResponse[]> {\n return this.request('GET', '/accounts/list');\n }\n\n /** Toggle key-value store for a merchant. `POST /accounts/{accountId}/kv` */\n async toggleKv(accountId: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Get KV status for a merchant. `GET /accounts/{accountId}/kv` */\n async getKvStatus(accountId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Transfer keys between merchants. `POST /accounts/transfer` */\n async transferKeys(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/accounts/transfer', { body: params });\n }\n}\n","import type { PaymentLinkResponse, PaymentLinkListParams, PaymentLinkListResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/** Retrieve and list hosted payment links. */\nexport class PaymentLinks {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a payment link by its ID.\n *\n * @param linkId - The unique payment link ID.\n * @returns The payment link details.\n */\n async retrieve(linkId: string): Promise<PaymentLinkResponse> {\n return this.request('GET', `/payment_link/${encodeURIComponent(linkId)}`);\n }\n\n /**\n * List payment links, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment links.\n */\n async list(params?: PaymentLinkListParams): Promise<PaymentLinkListResponse> {\n return this.request('POST', '/payment_link/list', { body: params });\n }\n\n /** Initiate (render) a payment link page. `GET /payment_link/{merchantId}/{paymentId}` */\n async initiate(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_link/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n\n /** Get payment link status. `GET /payment_linkstatus/{merchantId}/{paymentId}` */\n async status(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_linkstatus/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n}\n","import type {\n PaymentMethodCreateRequest,\n PaymentMethodResponse,\n PaymentMethodUpdateRequest,\n PaymentMethodListParams,\n PaymentMethodDeleteResponse,\n CustomerPaymentMethodsListParams,\n CustomerPaymentMethodsListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage saved payment methods for customers. */\nexport class PaymentMethods {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Save a new payment method (card, bank account, wallet, etc.).\n *\n * @param params - Payment method data including type and card/bank details.\n * @returns The saved payment method.\n *\n * @example\n * ```typescript\n * const pm = await delopay.paymentMethods.create({\n * payment_method: 'card',\n * customer_id: 'cus_123',\n * client_secret: 'cs_...',\n * });\n * ```\n */\n async create(params: PaymentMethodCreateRequest): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods', { body: params });\n }\n\n /**\n * Retrieve a saved payment method by its ID.\n *\n * @param methodId - The payment method ID.\n * @returns The payment method.\n */\n async retrieve(methodId: string): Promise<PaymentMethodResponse> {\n return this.request('GET', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * Update an existing payment method (e.g. update card expiry).\n *\n * @param methodId - The payment method ID to update.\n * @param params - Fields to update (card expiry, holder name, etc.).\n * @returns The updated payment method.\n */\n async update(\n methodId: string,\n params: PaymentMethodUpdateRequest,\n ): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/update`, {\n body: params,\n });\n }\n\n /**\n * Delete a saved payment method.\n *\n * @param methodId - The payment method ID to delete.\n * @returns Deletion confirmation.\n */\n async delete(methodId: string): Promise<PaymentMethodDeleteResponse> {\n return this.request('DELETE', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * List payment methods using a client secret.\n *\n * @param params - Filter by `client_secret`.\n * @returns Array of payment methods.\n */\n async list(params?: PaymentMethodListParams): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * List all saved payment methods for a customer, optionally filtered.\n *\n * @param customerId - The customer ID.\n * @param params - Optional filters: `client_secret`, `accepted_countries`, `accepted_currencies`,\n * `amount`, `recurring_enabled`, `installment_payment_enabled`, `limit`, `card_networks`.\n * @returns Customer's saved payment methods.\n *\n * @example\n * ```typescript\n * const { customer_payment_methods } = await delopay.paymentMethods.listForCustomer(\n * 'cus_123',\n * { accepted_currencies: ['EUR'], amount: 5000 },\n * );\n * ```\n */\n async listForCustomer(\n customerId: string,\n params?: CustomerPaymentMethodsListParams,\n ): Promise<CustomerPaymentMethodsListResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/payment_methods`, {\n query: params as Record<\n string,\n string | number | boolean | (string | number | boolean)[] | null | undefined\n >,\n });\n }\n\n /**\n * Set a payment method as the default for a customer.\n *\n * @param customerId - The customer ID.\n * @param methodId - The payment method ID to set as default.\n * @returns The updated payment method.\n */\n async setDefault(customerId: string, methodId: string): Promise<PaymentMethodResponse> {\n return this.request(\n 'POST',\n `/customers/${encodeURIComponent(customerId)}/payment_methods/${encodeURIComponent(methodId)}/default`,\n );\n }\n\n // --- Advanced operations (Task 3.3) ---\n\n /** Migrate a payment method. `POST /payment_methods/migrate` */\n async migrate(params: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods/migrate', { body: params });\n }\n\n /** Batch migrate payment methods. `POST /payment_methods/migrate-batch` */\n async migrateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/migrate-batch', { body: params });\n }\n\n /** Batch update payment methods. `POST /payment_methods/update-batch` */\n async updateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/update-batch', { body: params });\n }\n\n /** Batch retrieve payment methods. `GET /payment_methods/batch` */\n async batchRetrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods/batch', { query: params });\n }\n\n /** Tokenize a card. `POST /payment_methods/tokenize-card` */\n async tokenizeCard(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card', { body: params });\n }\n\n /** Batch tokenize cards. `POST /payment_methods/tokenize-card-batch` */\n async tokenizeCardBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card-batch', { body: params });\n }\n\n /** Initiate payment method collect link flow. `POST /payment_methods/collect` */\n async collect(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/collect', { body: params });\n }\n\n /** Save a payment method. `POST /payment_methods/{methodId}/save` */\n async save(methodId: string, params?: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/save`, {\n body: params,\n });\n }\n\n /** Create payment method auth link token. `POST /payment_methods/auth/link` */\n async createAuthLink(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/link', { body: params });\n }\n\n /** Exchange payment method auth token. `POST /payment_methods/auth/exchange` */\n async exchangeAuthToken(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/exchange', { body: params });\n }\n\n /** Tokenize card using existing PM. `POST /payment_methods/{methodId}/tokenize-card` */\n async tokenizeCardForMethod(\n methodId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/tokenize-card`, {\n body: params,\n });\n }\n}\n","import type {\n PaymentCreateRequest,\n PaymentListResponse,\n PaymentResponse,\n PaymentRetrieveOptions,\n PaymentUpdateRequest,\n PaymentConfirmRequest,\n PaymentCaptureRequest,\n PaymentCancelRequest,\n PaymentListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage payment intents — create, confirm, capture, cancel, and list payments. */\nexport class Payments {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payment intent.\n *\n * @param params - Payment creation parameters including amount and currency.\n * @returns The created payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.create({\n * amount: 5000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PaymentCreateRequest): Promise<PaymentResponse> {\n return this.request('POST', '/payments', { body: params });\n }\n\n /**\n * Retrieve a payment by its ID.\n *\n * @param paymentId - The unique payment intent ID.\n * @param options - Optional query flags. `force_sync` asks the backend to\n * reconcile state with the connector before returning (used to recover a\n * stuck intent when a webhook was lost). `all_keys_required` lifts the\n * backend's `should_call_connector` gate so a `requires_payment_method`\n * intent can still trigger a sync — without it the backend short-circuits\n * and returns the local snapshot. Both flags are JWT-authenticated dashboard\n * helpers; API-key callers can use them too where the backend allows.\n * @returns The payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.retrieve('pay_abc123');\n * const synced = await delopay.payments.retrieve('pay_abc123', {\n * force_sync: true,\n * all_keys_required: true,\n * });\n * ```\n */\n async retrieve(paymentId: string, options?: PaymentRetrieveOptions): Promise<PaymentResponse> {\n const path = `/payments/${encodeURIComponent(paymentId)}`;\n if (options === undefined) return this.request('GET', path);\n const query: Record<string, boolean> = {};\n if (options.force_sync !== undefined) query['force_sync'] = options.force_sync;\n if (options.all_keys_required !== undefined) {\n query['all_keys_required'] = options.all_keys_required;\n }\n if (Object.keys(query).length === 0) return this.request('GET', path);\n return this.request('GET', path, { query });\n }\n\n /**\n * Update an existing payment intent before it is confirmed.\n *\n * @param paymentId - The payment intent ID to update.\n * @param params - Fields to update (amount, currency, metadata, etc.).\n * @returns The updated payment intent.\n */\n async update(paymentId: string, params: PaymentUpdateRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}`, { body: params });\n }\n\n /**\n * Confirm a payment intent, triggering authorisation with the selected gateway.\n *\n * @param paymentId - The payment intent ID to confirm.\n * @param params - Confirmation parameters (payment method data, return URL, etc.).\n * @returns The updated payment intent.\n */\n async confirm(paymentId: string, params: PaymentConfirmRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Capture a previously authorised payment.\n *\n * @param paymentId - The payment intent ID to capture.\n * @param params - Optional capture parameters (partial capture amount, etc.).\n * @returns The updated payment intent.\n */\n async capture(paymentId: string, params?: PaymentCaptureRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/capture`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payment intent that has not yet been captured.\n *\n * @param paymentId - The payment intent ID to cancel.\n * @param params - Optional cancellation reason.\n * @returns The updated payment intent.\n */\n async cancel(paymentId: string, params?: PaymentCancelRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel`, {\n body: params,\n });\n }\n\n /**\n * List payment intents, optionally filtered by customer or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment intents.\n *\n * @example\n * ```typescript\n * const { data } = await delopay.payments.list({ customer_id: 'cus_123', limit: 25 });\n * ```\n */\n async list(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- Advanced operations (Task 3.2) ---\n\n /** Generate session tokens. `POST /payments/session_tokens` */\n async sessionTokens(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/session_tokens', { body: params });\n }\n\n /** Retrieve payment with gateway credentials. `POST /payments/sync` */\n async sync(params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', '/payments/sync', { body: params });\n }\n\n /** Cancel after partial capture. `POST /payments/{paymentId}/cancel_post_capture` */\n async cancelPostCapture(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel_post_capture`, {\n body: params,\n });\n }\n\n /** Incrementally authorize more funds. `POST /payments/{paymentId}/incremental_authorization` */\n async incrementalAuthorization(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request(\n 'POST',\n `/payments/${encodeURIComponent(paymentId)}/incremental_authorization`,\n {\n body: params,\n },\n );\n }\n\n /** Extend authorization window. `POST /payments/{paymentId}/extend_authorization` */\n async extendAuthorization(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/extend_authorization`, {\n body: params,\n });\n }\n\n /** Complete authorization. `POST /payments/{paymentId}/complete_authorize` */\n async completeAuthorize(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/complete_authorize`, {\n body: params,\n });\n }\n\n /** Dynamic tax calculation. `POST /payments/{paymentId}/calculate_tax` */\n async calculateTax(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/calculate_tax`, {\n body: params,\n });\n }\n\n /** Update payment metadata. `POST /payments/{paymentId}/update_metadata` */\n async updateMetadata(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/update_metadata`, {\n body: params,\n });\n }\n\n /** Retrieve extended card info. `GET /payments/{paymentId}/extended_card_info` */\n async extendedCardInfo(paymentId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/payments/${encodeURIComponent(paymentId)}/extended_card_info`);\n }\n\n // --- OLAP extensions (Task 4.2) ---\n\n /** List payments (profile-scoped). `GET /payments/profile/list` */\n async listByProfile(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments across all shops. `GET /payments/list-all-shops` */\n async listAllShops(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list-all-shops', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments by filter (POST body). `POST /payments/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PaymentListResponse> {\n return this.request('POST', '/payments/list', { body: params });\n }\n\n /** Get payment filter options. `POST /payments/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/filter', { body: params });\n }\n\n /** Get payment filters (v2). `GET /payments/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/v2/filter', { query: params });\n }\n\n /** Get payment aggregates. `GET /payments/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/aggregate', { query: params });\n }\n\n /** Get payment aggregates (profile-scoped). `GET /payments/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/profile/aggregate', { query: params });\n }\n\n /** Manually update payment status. `PUT /payments/{paymentId}/manual-update` */\n async manualUpdate(paymentId: string, params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('PUT', `/payments/${encodeURIComponent(paymentId)}/manual-update`, {\n body: params,\n });\n }\n\n /** Approve a payment waiting for review. `POST /payments/{paymentId}/approve` */\n async approve(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/approve`, {\n body: params,\n });\n }\n\n /** Reject a payment waiting for review. `POST /payments/{paymentId}/reject` */\n async reject(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/reject`, {\n body: params,\n });\n }\n\n /** Initiate external 3DS authentication. `POST /payments/{paymentId}/3ds/authentication` */\n async threeDsAuthentication(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/3ds/authentication`, {\n body: params,\n });\n }\n}\n","import type {\n PayoutCreateRequest,\n PayoutResponse,\n PayoutUpdateRequest,\n PayoutListParams,\n PayoutListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage payouts — fund transfers from merchant to a recipient bank account. */\nexport class Payouts {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payout.\n *\n * @param params - Payout parameters including amount, currency, and destination.\n * @returns The created payout.\n *\n * @example\n * ```typescript\n * const payout = await delopay.payouts.create({\n * amount: 10000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PayoutCreateRequest): Promise<PayoutResponse> {\n return this.request('POST', '/payouts/create', { body: params });\n }\n\n /**\n * Retrieve a payout by its ID.\n *\n * @param payoutId - The unique payout ID.\n * @returns The payout.\n */\n async retrieve(payoutId: string): Promise<PayoutResponse> {\n return this.request('GET', `/payouts/${encodeURIComponent(payoutId)}`);\n }\n\n /**\n * Update a payout before it is confirmed.\n *\n * @param payoutId - The payout ID to update.\n * @param params - Fields to update.\n * @returns The updated payout.\n */\n async update(payoutId: string, params: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}`, { body: params });\n }\n\n /**\n * Confirm a payout, triggering the actual transfer.\n *\n * @param payoutId - The payout ID to confirm.\n * @param params - Optional confirmation parameters.\n * @returns The updated payout.\n */\n async confirm(payoutId: string, params?: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payout before it is fulfilled.\n *\n * @param payoutId - The payout ID to cancel.\n * @returns The cancelled payout.\n */\n async cancel(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/cancel`);\n }\n\n /**\n * Mark a payout as fulfilled (manual confirmation of successful transfer).\n *\n * @param payoutId - The payout ID to fulfil.\n * @returns The fulfilled payout.\n */\n async fulfill(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/fulfill`);\n }\n\n /**\n * List payouts, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payouts.\n */\n async list(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.5) ---\n\n /** List payouts (profile-scoped). `GET /payouts/profile/list` */\n async listByProfile(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payouts by filter (POST body). `POST /payouts/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PayoutListResponse> {\n return this.request('POST', '/payouts/list', { body: params });\n }\n\n /** Get payout filter options. `POST /payouts/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/filter', { body: params });\n }\n\n /** Get payout filters (profile-scoped). `POST /payouts/profile/filter` */\n async getFiltersByProfile(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/profile/filter', { body: params });\n }\n\n /** Get payout aggregates. `GET /payouts/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/aggregate', { query: params });\n }\n\n /** Get payout aggregates (profile-scoped). `GET /payouts/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/profile/aggregate', { query: params });\n }\n\n /** Manually update payout status. `PUT /payouts/{payoutId}/manual-update` */\n async manualUpdate(payoutId: string, params: Record<string, unknown>): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { PollStatusResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Poll {\n constructor(private readonly request: RequestFn) {}\n\n async getStatus(pollId: string): Promise<PollStatusResponse> {\n return this.request('GET', `/poll/status/${encodeURIComponent(pollId)}`);\n }\n}\n","import type {\n ProfileAcquirerCreateRequest,\n ProfileAcquirerResponse,\n ProfileAcquirerUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ProfileAcquirers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: ProfileAcquirerCreateRequest): Promise<ProfileAcquirerResponse> {\n return this.request('POST', '/profile_acquirer', { body: params });\n }\n\n async update(\n profileId: string,\n profileAcquirerId: string,\n params: ProfileAcquirerUpdateRequest,\n ): Promise<ProfileAcquirerResponse> {\n return this.request(\n 'POST',\n `/profile_acquirer/${encodeURIComponent(profileId)}/${encodeURIComponent(profileAcquirerId)}`,\n {\n body: params,\n },\n );\n }\n}\n","import type { ProfileCreateRequest, ProfileResponse, ProfileUpdateRequest } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Profiles {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ProfileCreateRequest): Promise<ProfileResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/business_profile`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n async list(accountId: string): Promise<ProfileResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/business_profile`);\n }\n\n async update(\n accountId: string,\n profileId: string,\n params: ProfileUpdateRequest,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Toggle extended card info for a profile. `POST /account/{accountId}/business_profile/{profileId}/toggle_extended_card_info` */\n async toggleExtendedCardInfo(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_extended_card_info`,\n );\n }\n\n /** Toggle connector agnostic MIT. `POST /account/{accountId}/business_profile/{profileId}/toggle_connector_agnostic_mit` */\n async toggleConnectorAgnosticMit(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_connector_agnostic_mit`,\n );\n }\n}\n","import type {\n ProjectCreateRequest,\n ProjectResponse,\n ProjectUpdateRequest,\n ProjectStatsResponse,\n MerchantOverviewResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage projects — optional grouping layers that contain one or more shops. */\nexport class Projects {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new project under a merchant account.\n *\n * @param params - Project creation parameters (name, description, etc.).\n * @param merchantId - The merchant account ID that owns this project.\n * @returns The created project.\n *\n * @example\n * ```typescript\n * const project = await delopay.projects.create({ name: 'EU Stores' }, 'merch_123');\n * ```\n */\n async create(params: ProjectCreateRequest, merchantId: string): Promise<ProjectResponse> {\n return this.request('POST', '/projects', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Retrieve a project by its ID.\n *\n * @param projectId - The unique project ID.\n * @param merchantId - Optional merchant scope. When provided, sent as\n * `?merchant_id=…` — required by dashboards that authenticate with a JWT\n * spanning multiple merchants and need to disambiguate which one this\n * call applies to. API-key callers can omit it.\n * @returns The project.\n */\n async retrieve(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('GET', path);\n return this.request('GET', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * Update a project's details.\n *\n * @param projectId - The project ID to update.\n * @param params - Fields to update.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The updated project.\n */\n async update(\n projectId: string,\n params: ProjectUpdateRequest,\n merchantId?: string,\n ): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('PUT', path, { body: params });\n return this.request('PUT', path, { body: params, query: { merchant_id: merchantId } });\n }\n\n /**\n * Delete a project.\n *\n * @param projectId - The project ID to delete.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The deleted project object.\n */\n async delete(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('DELETE', path);\n return this.request('DELETE', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * List all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of projects.\n */\n async list(merchantId: string): Promise<ProjectResponse[]> {\n return this.request('GET', '/projects/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get aggregate payment statistics across all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Project statistics.\n */\n async stats(merchantId: string): Promise<ProjectStatsResponse> {\n return this.request('GET', '/projects/stats', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get a high-level overview (volume, counts, top connectors) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Merchant overview data.\n */\n async overview(merchantId: string): Promise<MerchantOverviewResponse> {\n return this.request('GET', '/projects/overview', {\n query: { merchant_id: merchantId },\n });\n }\n}\n","import type {\n RefundCreateRequest,\n RefundResponse,\n RefundUpdateRequest,\n RefundListParams,\n RefundListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage refunds for completed payments. */\nexport class Refunds {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a refund for a payment.\n *\n * @param params - Refund parameters, including the required `payment_id` and optional amount.\n * @returns The created refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.create({\n * payment_id: 'pay_abc123',\n * amount: 2500, // partial refund of 25.00 EUR\n * });\n * ```\n */\n async create(params: RefundCreateRequest): Promise<RefundResponse> {\n return this.request('POST', '/refunds', { body: params });\n }\n\n /**\n * Retrieve a refund by its ID.\n *\n * @param refundId - The unique refund ID.\n * @returns The refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.retrieve('ref_abc123');\n * ```\n */\n async retrieve(refundId: string): Promise<RefundResponse> {\n return this.request('GET', `/refunds/${encodeURIComponent(refundId)}`);\n }\n\n /**\n * Update the reason or metadata on an existing refund.\n *\n * @param refundId - The refund ID to update.\n * @param params - Fields to update (reason, metadata).\n * @returns The updated refund.\n */\n async update(refundId: string, params: RefundUpdateRequest): Promise<RefundResponse> {\n return this.request('POST', `/refunds/${encodeURIComponent(refundId)}`, { body: params });\n }\n\n /**\n * List refunds, optionally filtered by payment, status, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of refunds.\n */\n async list(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/list', { body: params });\n }\n\n // --- OLAP extensions (Task 4.3) ---\n\n /** List refunds (profile-scoped). `POST /refunds/profile/list` */\n async listByProfile(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/profile/list', { body: params });\n }\n\n /** Get refund filter options. `POST /refunds/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/refunds/filter', { body: params });\n }\n\n /** Get refund filters (v2). `GET /refunds/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/v2/filter', { query: params });\n }\n\n /** Get refund aggregates. `GET /refunds/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/aggregate', { query: params });\n }\n\n /** Get refund aggregates (profile-scoped). `GET /refunds/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/profile/aggregate', { query: params });\n }\n\n /** Manually update refund status. `PUT /refunds/{refundId}/manual-update` */\n async manualUpdate(refundId: string, params: Record<string, unknown>): Promise<RefundResponse> {\n return this.request('PUT', `/refunds/${encodeURIComponent(refundId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { RelayRequest, RelayResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Relay {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: RelayRequest): Promise<RelayResponse> {\n return this.request('POST', '/relay', { body: params });\n }\n\n async retrieve(relayId: string): Promise<RelayResponse> {\n return this.request('GET', `/relay/${encodeURIComponent(relayId)}`);\n }\n}\n","import type { RoutingConfigCreateRequest, RoutingConfigResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create and manage payment routing algorithms.\n *\n * Routing rules determine which gateway connector handles each payment based on\n * card type, currency, amount, or custom conditions.\n */\nexport class Routing {\n readonly decision: RoutingDecisionManager;\n\n constructor(private readonly request: RequestFn) {\n this.decision = new RoutingDecisionManager(request);\n }\n\n /**\n * Create a new routing algorithm.\n *\n * @param params - Routing algorithm definition (rule-based, priority, or volume-based).\n * @returns The created routing configuration.\n *\n * @example\n * ```typescript\n * const config = await delopay.routing.create({\n * name: 'EU Priority',\n * algorithm: { type: 'priority', data: [{ connector: 'stripe' }] },\n * });\n * ```\n */\n async create(params: RoutingConfigCreateRequest): Promise<RoutingConfigResponse> {\n return this.request('POST', '/routing', { body: params });\n }\n\n /**\n * Retrieve a routing algorithm by its ID.\n *\n * @param algorithmId - The routing algorithm ID.\n * @returns The routing configuration.\n */\n async retrieve(algorithmId: string): Promise<RoutingConfigResponse> {\n return this.request('GET', `/routing/${encodeURIComponent(algorithmId)}`);\n }\n\n /**\n * Activate a routing algorithm, making it the active routing strategy for the shop.\n *\n * @param algorithmId - The routing algorithm ID to activate.\n * @returns The activated routing configuration.\n */\n async activate(algorithmId: string): Promise<RoutingConfigResponse> {\n return this.request('POST', `/routing/${encodeURIComponent(algorithmId)}/activate`);\n }\n\n /**\n * Deactivate the currently active routing algorithm (falls back to default routing).\n *\n * @returns The deactivated routing configuration.\n */\n async deactivate(): Promise<RoutingConfigResponse> {\n return this.request('POST', '/routing/deactivate');\n }\n\n /**\n * List all routing algorithms for the current shop.\n *\n * @returns Array of routing configurations.\n */\n async list(): Promise<RoutingConfigResponse[]> {\n return this.request('GET', '/routing');\n }\n\n // --- Advanced operations (Task 3.4) ---\n\n /** Get active routing config. `GET /routing/active` */\n async getActive(): Promise<RoutingConfigResponse> {\n return this.request('GET', '/routing/active');\n }\n\n /** Update default routing config. `POST /routing/default` */\n async updateDefault(params: Record<string, unknown>): Promise<RoutingConfigResponse> {\n return this.request('POST', '/routing/default', { body: params });\n }\n\n /** Retrieve default config for profiles. `GET /routing/default/profile` */\n async getDefaultProfile(): Promise<RoutingConfigResponse> {\n return this.request('GET', '/routing/default/profile');\n }\n\n /** Update default config for a profile. `POST /routing/default/profile/{profileId}` */\n async updateDefaultProfile(\n profileId: string,\n params: Record<string, unknown>,\n ): Promise<RoutingConfigResponse> {\n return this.request('POST', `/routing/default/profile/${encodeURIComponent(profileId)}`, {\n body: params,\n });\n }\n\n /** List routing configs for profile. `GET /routing/list/profile` */\n async listForProfile(): Promise<RoutingConfigResponse[]> {\n return this.request('GET', '/routing/list/profile');\n }\n\n /** Evaluate a routing rule. `POST /routing/rule/evaluate` */\n async evaluateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/evaluate', { body: params });\n }\n\n /** Migrate routing rules for profile. `POST /routing/rule/migrate` */\n async migrateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/migrate', { body: params });\n }\n\n /** Evaluate routing for a payment. `POST /routing/evaluate` */\n async evaluate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/evaluate', { body: params });\n }\n\n /** Update gateway scores for dynamic routing. `POST /routing/feedback` */\n async feedback(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/feedback', { body: params });\n }\n}\n\nclass RoutingDecisionManager {\n constructor(private readonly request: RequestFn) {}\n\n /** Upsert decision manager config. `PUT /routing/decision` */\n async upsert(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision', { body: params });\n }\n\n /** Retrieve decision manager config. `GET /routing/decision` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision');\n }\n\n /** Delete decision manager config. `DELETE /routing/decision` */\n async delete(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision');\n }\n\n /** Upsert surcharge decision config. `PUT /routing/decision/surcharge` */\n async upsertSurcharge(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision/surcharge', { body: params });\n }\n\n /** Retrieve surcharge decision config. `GET /routing/decision/surcharge` */\n async retrieveSurcharge(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision/surcharge');\n }\n\n /** Delete surcharge decision config. `DELETE /routing/decision/surcharge` */\n async deleteSurcharge(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision/surcharge');\n }\n}\n","import type {\n ShopCreateRequest,\n ShopResponse,\n ShopUpdateRequest,\n GatewayConnectRequest,\n GatewayResponse,\n ProfileLogoUploadResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage gateway connections for a specific shop. */\nclass ShopGateways {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Connect a payment gateway to a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param params - Gateway connector credentials and configuration.\n * @returns The created gateway connection.\n */\n async connect(\n merchantId: string,\n shopId: string,\n params: GatewayConnectRequest,\n ): Promise<GatewayResponse> {\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n { body: params },\n );\n }\n\n /**\n * List all gateway connections for a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns Array of gateway connections.\n */\n async list(merchantId: string, shopId: string): Promise<GatewayResponse[]> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n );\n }\n\n /**\n * Disconnect a gateway from a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @param gatewayId - The gateway connector ID to remove.\n * @returns The removed gateway connection.\n */\n async disconnect(\n merchantId: string,\n shopId: string,\n gatewayId: string,\n ): Promise<GatewayResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways/${encodeURIComponent(gatewayId)}`,\n );\n }\n}\n\n/**\n * Create and manage shops (business profiles) within a merchant account.\n *\n * Each shop can have its own gateway connections, routing rules, and fee schedules.\n */\nexport class Shops {\n /** Gateway connection management for shops. */\n readonly gateways: ShopGateways;\n\n constructor(private readonly request: RequestFn) {\n this.gateways = new ShopGateways(request);\n }\n\n /**\n * Create a new shop under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Shop creation parameters (name, etc.).\n * @returns The created shop.\n *\n * @example\n * ```typescript\n * const shop = await delopay.shops.create('merch_123', { profile_name: 'EU Store' });\n * ```\n */\n async create(merchantId: string, params: ShopCreateRequest): Promise<ShopResponse> {\n return this.request('POST', `/shops/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve a shop by its ID.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns The shop.\n */\n async retrieve(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * Update a shop's configuration.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to update.\n * @param params - Fields to update.\n * @returns The updated shop.\n */\n async update(\n merchantId: string,\n shopId: string,\n params: ShopUpdateRequest,\n ): Promise<ShopResponse> {\n return this.request(\n 'PUT',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n { body: params },\n );\n }\n\n /**\n * Delete a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to delete.\n * @returns The deleted shop object.\n */\n async delete(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * List all shops under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of shops.\n */\n async list(merchantId: string): Promise<ShopResponse[]> {\n return this.request('GET', `/shops/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Upload a logo file for a shop. The file is stored in Delopay's configured\n * object store and a public HTTPS URL is returned. This method does NOT write\n * the URL into the shop's `payment_link_config.default_config.logo` — call\n * `shops.update` afterwards with the returned `logo_url` to persist the change.\n *\n * Accepts PNG, JPEG, WebP or SVG. The file must be ≤ 1 MiB.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param file - The logo file (Blob / File in browsers).\n * @returns The publicly-reachable URL of the uploaded logo.\n *\n * @example\n * ```typescript\n * const { logo_url } = await delopay.shops.uploadLogo('merch_1', 'pro_1', file);\n * await delopay.shops.update('merch_1', 'pro_1', {\n * payment_link_config: { default_config: { logo: logo_url } },\n * });\n * ```\n */\n async uploadLogo(\n merchantId: string,\n shopId: string,\n file: Blob,\n ): Promise<ProfileLogoUploadResponse> {\n const form = new FormData();\n form.append('file', file);\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/logo`,\n { body: form },\n );\n }\n}\n","import type {\n StripeConnectAccountRequest,\n StripeConnectAccountResponse,\n StripeConnectLinkRequest,\n StripeConnectLinkResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class StripeConnect {\n constructor(private readonly request: RequestFn) {}\n\n async createAccount(params: StripeConnectAccountRequest): Promise<StripeConnectAccountResponse> {\n return this.request('POST', '/connector_onboarding/stripe/accounts', { body: params });\n }\n\n async createAccountLink(params: StripeConnectLinkRequest): Promise<StripeConnectLinkResponse> {\n return this.request('POST', '/connector_onboarding/stripe/account_links', { body: params });\n }\n\n // --- Generic connector onboarding (Task 4.11) ---\n\n /** Get onboarding action URL. `POST /connector_onboarding/action_url` */\n async getActionUrl(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/action_url', { body: params });\n }\n\n /** Sync onboarding status. `POST /connector_onboarding/sync` */\n async syncOnboarding(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/sync', { body: params });\n }\n\n /** Reset tracking ID. `POST /connector_onboarding/reset_tracking_id` */\n async resetTrackingId(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/reset_tracking_id', { body: params });\n }\n}\n","import type { ThreeDsRuleExecuteRequest, ThreeDsRuleResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ThreeDsRules {\n constructor(private readonly request: RequestFn) {}\n\n async execute(params: ThreeDsRuleExecuteRequest): Promise<ThreeDsRuleResponse> {\n return this.request('POST', '/three_ds_decision/execute', { body: params });\n }\n}\n","import type {\n SignUpRequest,\n SignUpWithMerchantRequest,\n SignInRequest,\n AuthResponse,\n UserResponse,\n ChangePasswordRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n SwitchMerchantRequest,\n SwitchProfileRequest,\n InviteUsersRequest,\n InviteUsersResponse,\n TotpResponse,\n RecoveryCodesResponse,\n PhoneOtpRequest,\n PhoneOtpResponse,\n PhoneOtpVerifyRequest,\n PhoneOtpVerifyResponse,\n UpdateUserDetailsRequest,\n FromEmailRequest,\n TokenResponse,\n VerifyTotpRequest,\n Terminate2faQueryParams,\n ListInvitableRolesParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Users {\n constructor(private readonly request: RequestFn) {}\n\n async signUp(params: SignUpRequest | SignUpWithMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signup', { body: params });\n }\n\n async signIn(params: SignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signin', { body: params });\n }\n\n async signOut(): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/signout');\n }\n\n async getDetails(): Promise<UserResponse> {\n return this.request('GET', '/user');\n }\n\n async update(params: UpdateUserDetailsRequest): Promise<UserResponse> {\n return this.request('POST', '/user/update', { body: params });\n }\n\n async changePassword(params: ChangePasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/change_password', { body: params });\n }\n\n async rotatePassword(params: ResetPasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/rotate_password', { body: params });\n }\n\n async forgotPassword(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/forgot_password', { body: params });\n }\n\n /**\n * Commit a password reset.\n *\n * The caller is responsible for obtaining a `SinglePurposeToken` with\n * `purpose: reset_password` via the email-token exchange + TOTP flow\n * (see `fromEmail`, `beginTotp`, `updateTotp`/`verifyTotp`,\n * `generateRecoveryCodes`, `terminate2fa`) and setting it on the client\n * via `setJwtToken` before calling this method. `body.token` must still\n * be the original `EmailToken` from the reset-link URL — the handler\n * decodes it a second time to find the user.\n */\n async resetPassword(params: ResetPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/reset_password', { body: params });\n }\n\n /**\n * Exchange an email-link token (`EmailToken`) for a single-purpose JWT\n * that drives the next step of the flow (TOTP, verify email, accept\n * invitation, etc.). No authentication required.\n *\n * The `token_type` in the response tells you which step to run next.\n */\n async fromEmail(params: FromEmailRequest): Promise<TokenResponse> {\n return this.request('POST', '/user/from_email', { body: params });\n }\n\n async verifyEmail(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/verify_email', { body: params });\n }\n\n async sendVerificationEmail(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/verify_email_request', { body: params });\n }\n\n async createMerchant(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/create_merchant', { body: params });\n }\n\n async switchMerchant(params: SwitchMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/merchant', { body: params });\n }\n\n async switchProfile(params: SwitchProfileRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/profile', { body: params });\n }\n\n async listMerchants(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/merchant');\n }\n\n async listProfiles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/profile');\n }\n\n async inviteUsers(params: InviteUsersRequest[]): Promise<InviteUsersResponse[]> {\n return this.request('POST', '/user/user/invite_multiple', { body: params });\n }\n\n async acceptInvitation(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept', { body: params });\n }\n\n /**\n * Start TOTP setup (or no-op if already set).\n *\n * Returns the QR-code payload when the user has no TOTP configured yet;\n * returns `{ secret: null }` when the user is already set up (caller\n * should then prompt for a 6-digit code and call `verifyTotp`).\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async beginTotp(): Promise<TotpResponse> {\n return this.request('GET', '/user/2fa/totp/begin');\n }\n\n /**\n * Verify a 6-digit TOTP code for a user whose TOTP is already set up.\n * Marks the code as used in Redis so subsequent flow steps can advance.\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async verifyTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/2fa/totp/verify', { body: params });\n }\n\n async resetTotp(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/totp/reset');\n }\n\n async generateRecoveryCodes(): Promise<RecoveryCodesResponse> {\n return this.request('GET', '/user/2fa/recovery_code/generate');\n }\n\n async verifyRecoveryCode(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/2fa/recovery_code/verify', { body: params });\n }\n\n async sendPhoneOtp(params: PhoneOtpRequest): Promise<PhoneOtpResponse> {\n return this.request('POST', '/user/phone/send-otp', { body: params });\n }\n\n async verifyPhoneOtp(params: PhoneOtpVerifyRequest): Promise<PhoneOtpVerifyResponse> {\n return this.request('POST', '/user/phone/verify-otp', { body: params });\n }\n\n async getRoleFromToken(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role');\n }\n\n async listRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list');\n }\n\n async listUserRoles(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user', { body: params });\n }\n\n async updateUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/update_role', { body: params });\n }\n\n async deleteUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/user/user/delete', { body: params });\n }\n\n // --- Advanced methods (Task 4.7) ---\n\n /** Sign in (v2). `POST /user/v2/signin` */\n async signInV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/v2/signin', { body: params });\n }\n\n /** Sign in via OIDC. `POST /user/oidc` */\n async signInOidc(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/oidc', { body: params });\n }\n\n /** Transfer key. `POST /user/key/transfer` */\n async transferKey(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/key/transfer', { body: params });\n }\n\n /** List invitations. `GET /user/list/invitation` */\n async listInvitations(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/invitation');\n }\n\n /** Check 2FA status. `GET /user/2fa` */\n async check2faStatus(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa');\n }\n\n /** Check 2FA status (v2). `GET /user/2fa/v2` */\n async check2faStatusV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/v2');\n }\n\n /**\n * Finish first-time TOTP setup: commit the secret generated by `beginTotp`\n * against a 6-digit code from the user's authenticator app.\n *\n * `PUT /user/2fa/totp/verify`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async updateTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/2fa/totp/verify', { body: params });\n }\n\n /**\n * Complete the TOTP step and advance to the next flow stage (e.g.\n * `reset_password`). Returns a fresh single-purpose token with the\n * next `token_type`.\n *\n * `GET /user/2fa/terminate`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async terminate2fa(query?: Terminate2faQueryParams): Promise<TokenResponse> {\n if (query === undefined) {\n return this.request('GET', '/user/2fa/terminate');\n }\n return this.request('GET', '/user/2fa/terminate', {\n query: query as Record<string, boolean | undefined>,\n });\n }\n\n /** Create auth method. `POST /user/auth` */\n async createAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth', { body: params });\n }\n\n /** Update auth method. `PUT /user/auth` */\n async updateAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/auth', { body: params });\n }\n\n /** List auth methods. `GET /user/auth/list` */\n async listAuthMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/auth/list');\n }\n\n /** Get auth URL. `GET /user/auth/url` */\n async getAuthUrl(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/auth/url');\n }\n\n /** Select auth method. `POST /user/auth/select` */\n async selectAuth(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth/select', { body: params });\n }\n\n /** List user roles (v2). `POST /user/user/v2` */\n async listUserRolesV2(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user/v2', { body: params });\n }\n\n /** List users in lineage. `GET /user/user/list` */\n async listUsersInLineage(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/list');\n }\n\n /** List users in lineage (v2). `GET /user/user/v2/list` */\n async listUsersInLineageV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/v2/list');\n }\n\n /** Accept invitation (v2). `POST /user/user/invite/accept/v2` */\n async acceptInvitationV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept/v2', { body: params });\n }\n\n /** Resend invite. `POST /user/user/resend_invite` */\n async resendInvite(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/resend_invite', { body: params });\n }\n\n /** Get role (v2). `GET /user/role/v2` */\n async getRoleV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v2');\n }\n\n /** Get role (v3). `GET /user/role/v3` */\n async getRoleV3(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v3');\n }\n\n /** List roles (v2). `GET /user/role/v2/list` */\n async listRolesV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/v2/list');\n }\n\n /**\n * List invitable roles. `GET /user/role/list/invite`\n *\n * @param params - Optional query. `entity_type` scopes the role list to a\n * particular entity (e.g. `'merchant'` to list only merchant-scoped roles\n * when inviting employees from the merchant dashboard).\n */\n async listInvitableRoles(params?: ListInvitableRolesParams): Promise<Record<string, unknown>[]> {\n if (params === undefined || params.entity_type === undefined) {\n return this.request('GET', '/user/role/list/invite');\n }\n return this.request('GET', '/user/role/list/invite', {\n query: { entity_type: params.entity_type },\n });\n }\n\n /** List updatable roles. `GET /user/role/list/update` */\n async listUpdatableRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list/update');\n }\n\n /** Get permission info. `GET /user/permission_info` */\n async getPermissionInfo(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/permission_info');\n }\n\n /** Get module list. `GET /user/module/list` */\n async getModuleList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/module/list');\n }\n\n /** Get parent list. `GET /user/parent/list` */\n async getParentList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/parent/list');\n }\n\n /** Create a role. `POST /user/role` */\n async createRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/role', { body: params });\n }\n\n /** Get role by ID. `GET /user/role/{roleId}` */\n async getRoleById(roleId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/user/role/${encodeURIComponent(roleId)}`);\n }\n\n /** Update role by ID. `PUT /user/role/{roleId}` */\n async updateRole(\n roleId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('PUT', `/user/role/${encodeURIComponent(roleId)}`, { body: params });\n }\n}\n","import type {\n ApplePayVerificationRequest,\n ApplePayVerificationResponse,\n ApplePayVerifiedDomainsResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Verification {\n constructor(private readonly request: RequestFn) {}\n\n async registerApplePayDomains(\n merchantId: string,\n params: ApplePayVerificationRequest,\n ): Promise<ApplePayVerificationResponse> {\n return this.request('POST', `/verify/apple_pay/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n async getApplePayVerifiedDomains(\n params: Record<string, string>,\n ): Promise<ApplePayVerifiedDomainsResponse> {\n return this.request('GET', '/verify/applepay_verified_domains', {\n query: params,\n });\n }\n}\n","/**\n * A parsed and verified Delopay webhook event.\n *\n * The `type` field identifies the event (e.g. `'payment_succeeded'`).\n * Specific event payload shapes are nested under `data`.\n */\nexport interface WebhookEvent {\n /** Event type identifier, e.g. `'payment_succeeded'` or `'refund_succeeded'`. */\n type: string;\n /** Event payload. Shape depends on `type`. */\n data: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction hexToBytes(hex: string): Uint8Array | null {\n if (hex.length === 0 || hex.length % 2 !== 0) return null;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n const byte = Number.parseInt(hex.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) return null;\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport const Webhooks = {\n /**\n * Verify the signature of an incoming Delopay webhook and return the parsed event.\n *\n * Delopay signs each outgoing webhook with HMAC-SHA512 over the raw request body,\n * using your shop's webhook secret (the *payment response hash key* configured on\n * the shop). The hex-encoded digest is delivered in the `X-Webhook-Signature-512`\n * HTTP header.\n *\n * Uses the Web Crypto API (`globalThis.crypto.subtle`), so it runs unchanged in\n * Node 18+, modern browsers, Deno, Bun, and edge runtimes (Cloudflare Workers, Vercel Edge).\n *\n * Available as a static property on the `Delopay` class\n * (`Delopay.webhooks.verify`) and does not require a client instance.\n *\n * @param rawBody - The raw request body. Pass the original bytes (`Uint8Array` /\n * `Buffer`) when possible; if you pass a string, it must be the unmodified UTF-8\n * text of the request body. Do **not** parse it before passing.\n * @param signatureHeader - The value of the `X-Webhook-Signature-512` HTTP header.\n * @param secret - Your shop's webhook signing secret.\n * @returns Promise that resolves to the parsed webhook event.\n * @throws {Error} When the signature header is malformed or does not match the body.\n *\n * @example\n * ```typescript\n * // Express example\n * app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {\n * try {\n * const event = await Delopay.webhooks.verify(\n * req.body, // Buffer from express.raw()\n * req.header('x-webhook-signature-512') ?? '',\n * process.env.DELOPAY_WEBHOOK_SECRET!,\n * );\n * console.log(event.type, event.data);\n * res.sendStatus(200);\n * } catch {\n * res.status(400).send('Invalid signature');\n * }\n * });\n * ```\n */\n async verify(\n rawBody: string | Uint8Array,\n signatureHeader: string,\n secret: string,\n ): Promise<WebhookEvent> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new Error(\n 'Web Crypto unavailable: Delopay.webhooks.verify requires globalThis.crypto.subtle (Node 18+, modern browsers, Workers, Deno)',\n );\n }\n\n const signatureBytes = hexToBytes(signatureHeader.trim());\n if (!signatureBytes) {\n throw new Error('Invalid webhook signature format');\n }\n\n const encoder = new TextEncoder();\n const bodyBytes = typeof rawBody === 'string' ? encoder.encode(rawBody) : rawBody;\n\n // `TextEncoder.encode` returns `Uint8Array<ArrayBufferLike>` in current lib.dom.d.ts,\n // but `crypto.subtle.*` wants `BufferSource` (backed by `ArrayBuffer`). At runtime the\n // underlying buffer is always an `ArrayBuffer` — cast to quiet the type checker.\n const asBufferSource = (bytes: Uint8Array): BufferSource => bytes as unknown as BufferSource;\n const key = await subtle.importKey(\n 'raw',\n asBufferSource(encoder.encode(secret)),\n { name: 'HMAC', hash: 'SHA-512' },\n false,\n ['verify'],\n );\n\n const valid = await subtle.verify(\n 'HMAC',\n key,\n asBufferSource(signatureBytes),\n asBufferSource(bodyBytes),\n );\n\n if (!valid) {\n throw new Error('Invalid webhook signature');\n }\n\n const bodyText =\n typeof rawBody === 'string' ? rawBody : new TextDecoder('utf-8').decode(rawBody);\n return JSON.parse(bodyText) as WebhookEvent;\n },\n};\n","import type { RequestFn } from '../client';\n\ntype AnalyticsScope = 'merchant' | 'org' | 'profile';\n\nclass AnalyticsDomain {\n constructor(\n private readonly request: RequestFn,\n private readonly domain: string,\n ) {}\n\n /** Get metrics. `POST /analytics/v1/metrics/{domain}` */\n async metrics(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n // Metrics handlers on the backend take `web::Json<[T; 1]>` — i.e. a one-element array.\n // filters/report/sankey/search take `web::Json<T>`. Don't unify without re-checking the Rust side.\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}`, {\n body: [params],\n });\n }\n\n /** Get filters. `POST /analytics/v1/filters/{domain}` */\n async filters(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/filters/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Generate report. `POST /analytics/v1/report/{domain}` */\n async report(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/report/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Sankey chart data. `POST /analytics/v1/metrics/{domain}/sankey` */\n async sankey(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}/sankey`, {\n body: params,\n });\n }\n}\n\nexport class Analytics {\n readonly payments: AnalyticsDomain;\n readonly refunds: AnalyticsDomain;\n readonly disputes: AnalyticsDomain;\n readonly authEvents: AnalyticsDomain;\n readonly sdkEvents: AnalyticsDomain;\n readonly frm: AnalyticsDomain;\n readonly apiEvents: AnalyticsDomain;\n readonly routing: AnalyticsDomain;\n\n constructor(private readonly request: RequestFn) {\n this.payments = new AnalyticsDomain(request, 'payments');\n this.refunds = new AnalyticsDomain(request, 'refunds');\n this.disputes = new AnalyticsDomain(request, 'disputes');\n this.authEvents = new AnalyticsDomain(request, 'auth_events');\n this.sdkEvents = new AnalyticsDomain(request, 'sdk_events');\n this.frm = new AnalyticsDomain(request, 'frm');\n this.apiEvents = new AnalyticsDomain(request, 'api_events');\n this.routing = new AnalyticsDomain(request, 'routing');\n }\n\n /** Global search. `POST /analytics/v1/search` */\n async search(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/search', { body: params });\n }\n\n /** Domain-specific search. `POST /analytics/v1/search/{domain}` */\n async searchDomain(\n domain: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/analytics/v1/search/${encodeURIComponent(domain)}`, {\n body: params,\n });\n }\n\n /** Get analytics info. `GET /analytics/v1/{domain}/info` */\n async getInfo(domain: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/analytics/v1/${encodeURIComponent(domain)}/info`);\n }\n\n /** Get API event logs. `GET /analytics/v1/api_event_logs` */\n async apiEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/api_event_logs', { query: params });\n }\n\n /** Get SDK event logs. `POST /analytics/v1/sdk_event_logs` */\n async sdkEventLogs(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/sdk_event_logs', { body: params });\n }\n\n /** Get connector event logs. `GET /analytics/v1/connector_event_logs` */\n async connectorEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/connector_event_logs', { query: params });\n }\n\n /** Get routing event logs. `GET /analytics/v1/routing_event_logs` */\n async routingEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/routing_event_logs', { query: params });\n }\n\n /** Get outgoing webhook event logs. `GET /analytics/v1/outgoing_webhook_event_logs` */\n async outgoingWebhookEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/outgoing_webhook_event_logs', { query: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class AnalyticsDashboard {\n constructor(private readonly request: RequestFn) {}\n\n /** Get analytics dashboard data. `GET /analytics-dashboard` */\n async retrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics-dashboard', { query: params });\n }\n\n /** Generate analytics dashboard report. `POST /analytics-dashboard` */\n async generate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics-dashboard', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Cards {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a card. `POST /cards/create` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/create', { body: params });\n }\n\n /** Update a card. `POST /cards/update` */\n async update(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/update', { body: params });\n }\n\n /** Retrieve card info by BIN. `GET /cards/{bin}` */\n async retrieve(bin: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/cards/${encodeURIComponent(bin)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Export {\n constructor(private readonly request: RequestFn) {}\n\n /** Export transactions. `POST /export/transactions` */\n async transactions(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/export/transactions', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class FeatureMatrix {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve the feature matrix. `GET /feature_matrix` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/feature_matrix');\n }\n\n /**\n * Retrieve the feature matrix scoped to a merchant. Beta connectors\n * are filtered against the merchant's allowlist so the dashboard only\n * surfaces connectors the merchant can actually attach.\n * `GET /feature_matrix/{merchantId}`\n */\n async retrieveForMerchant(merchantId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/feature_matrix/${encodeURIComponent(merchantId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Files {\n constructor(private readonly request: RequestFn) {}\n\n /** Upload a file. `POST /files` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/files', { body: params });\n }\n\n /** Retrieve/download a file. `GET /files/{fileId}` */\n async retrieve(fileId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/files/${encodeURIComponent(fileId)}`);\n }\n\n /** Delete a file. `DELETE /files/{fileId}` */\n async delete(fileId: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Forex {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve forex rates. `GET /forex/rates` */\n async getRates(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/rates', { query: params });\n }\n\n /** Convert from minor currency. `GET /forex/convert_from_minor` */\n async convertFromMinor(\n params: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/convert_from_minor', { query: params });\n }\n}\n","import type { RegionCreateRequest, RegionUpdateRequest, RegionResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Regions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a region. `POST /regions` */\n async create(params: RegionCreateRequest): Promise<RegionResponse> {\n return this.request('POST', '/regions', { body: params });\n }\n\n /** Retrieve a region by ID. `GET /regions/{regionId}` */\n async retrieve(regionId: string): Promise<RegionResponse> {\n return this.request('GET', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** Update a region. `PUT /regions/{regionId}` */\n async update(regionId: string, params: RegionUpdateRequest): Promise<RegionResponse> {\n return this.request('PUT', `/regions/${encodeURIComponent(regionId)}`, { body: params });\n }\n\n /** Delete a region. `DELETE /regions/{regionId}` */\n async delete(regionId: string): Promise<RegionResponse> {\n return this.request('DELETE', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** List all regions. `GET /regions/list` */\n async list(): Promise<RegionResponse[]> {\n return this.request('GET', '/regions/list');\n }\n}\n","import type {\n SubscriptionCreateRequest,\n SubscriptionUpdateRequest,\n SubscriptionResponse,\n SubscriptionListParams,\n SubscriptionListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Subscriptions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create and immediately confirm a subscription. `POST /subscriptions` */\n async createAndConfirm(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions', { body: params });\n }\n\n /** Create a subscription (without confirming). `POST /subscriptions/create` */\n async create(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions/create', { body: params });\n }\n\n /** Retrieve a subscription by ID. `GET /subscriptions/{subscriptionId}` */\n async retrieve(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('GET', `/subscriptions/${encodeURIComponent(subscriptionId)}`);\n }\n\n /** Confirm a subscription. `POST /subscriptions/{subscriptionId}/confirm` */\n async confirm(\n subscriptionId: string,\n params?: Record<string, unknown>,\n ): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/confirm`, {\n body: params,\n });\n }\n\n /** Update a subscription. `PUT /subscriptions/{subscriptionId}/update` */\n async update(\n subscriptionId: string,\n params: SubscriptionUpdateRequest,\n ): Promise<SubscriptionResponse> {\n return this.request('PUT', `/subscriptions/${encodeURIComponent(subscriptionId)}/update`, {\n body: params,\n });\n }\n\n /** List subscriptions. `GET /subscriptions/list` */\n async list(params?: SubscriptionListParams): Promise<SubscriptionListResponse> {\n return this.request('GET', '/subscriptions/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get subscription estimate. `GET /subscriptions/estimate` */\n async getEstimate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/estimate', { query: params });\n }\n\n /** Get subscription items. `GET /subscriptions/items` */\n async getItems(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/items', { query: params });\n }\n\n /** Pause a subscription. `POST /subscriptions/{subscriptionId}/pause` */\n async pause(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/pause`);\n }\n\n /** Resume a subscription. `POST /subscriptions/{subscriptionId}/resume` */\n async resume(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/resume`);\n }\n\n /** Cancel a subscription. `POST /subscriptions/{subscriptionId}/cancel` */\n async cancel(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`);\n }\n}\n","import { DelopayError, DelopayAuthenticationError } from './error';\nimport { ApiKeys } from './resources/apiKeys';\nimport { Authentication } from './resources/authentication';\nimport { Billing } from './resources/billing';\nimport { Blocklist } from './resources/blocklist';\nimport { Connectors } from './resources/connectors';\nimport { Customers } from './resources/customers';\nimport { Disputes } from './resources/disputes';\nimport { EphemeralKeys } from './resources/ephemeralKeys';\nimport { Events } from './resources/events';\nimport { Fees } from './resources/fees';\nimport { Mandates } from './resources/mandates';\nimport { MerchantAccounts } from './resources/merchantAccounts';\nimport { PaymentLinks } from './resources/paymentLinks';\nimport { PaymentMethods } from './resources/paymentMethods';\nimport { Payments } from './resources/payments';\nimport { Payouts } from './resources/payouts';\nimport { Poll } from './resources/poll';\nimport { ProfileAcquirers } from './resources/profileAcquirers';\nimport { Profiles } from './resources/profiles';\nimport { Projects } from './resources/projects';\nimport { Refunds } from './resources/refunds';\nimport { Relay } from './resources/relay';\nimport { Routing } from './resources/routing';\nimport { Shops } from './resources/shops';\nimport { StripeConnect } from './resources/stripeConnect';\nimport { ThreeDsRules } from './resources/threeDsRules';\nimport { Users } from './resources/users';\nimport { Verification } from './resources/verification';\nimport { Webhooks } from './resources/webhooks';\nimport { Analytics } from './resources/analytics';\nimport { AnalyticsDashboard } from './resources/analyticsDashboard';\nimport { Cards } from './resources/cards';\nimport { Export } from './resources/export';\nimport { FeatureMatrix } from './resources/featureMatrix';\nimport { Files } from './resources/files';\nimport { Forex } from './resources/forex';\nimport { Regions } from './resources/regions';\nimport { Subscriptions } from './resources/subscriptions';\n\nconst PRODUCTION_URL = 'https://api.delopay.net';\nconst SANDBOX_URL = 'https://sandbox.delopay.net';\n\nconst MAX_RAW_BODY_BYTES = 2048;\nconst MAX_RETRY_AFTER_MS = 30_000;\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const trimmed = header.trim();\n const seconds = Number(trimmed);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n }\n const date = Date.parse(trimmed);\n if (Number.isFinite(date)) {\n const delta = date - Date.now();\n return delta > 0 ? Math.min(delta, MAX_RETRY_AFTER_MS) : 0;\n }\n return null;\n}\n\nfunction truncateRawBody(raw: string): string | undefined {\n if (!raw) return undefined;\n return raw.length > MAX_RAW_BODY_BYTES ? raw.slice(0, MAX_RAW_BODY_BYTES) + '…' : raw;\n}\n\nfunction findIdempotencyKey(headers: Record<string, string>): string | undefined {\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'idempotency-key') return v;\n }\n return undefined;\n}\n\ninterface CombinedSignal {\n signal: AbortSignal;\n dispose: () => void;\n}\n\nfunction noop(): void {\n // Intentionally empty: no listeners registered, nothing to clean up.\n}\n\nfunction combineSignals(signals: AbortSignal[]): CombinedSignal {\n const controller = new AbortController();\n const listeners: { signal: AbortSignal; handler: () => void }[] = [];\n const dispose = () => {\n for (const { signal, handler } of listeners) {\n signal.removeEventListener('abort', handler);\n }\n listeners.length = 0;\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n dispose();\n return { signal: controller.signal, dispose: noop };\n }\n const handler = () => {\n controller.abort(signal.reason);\n dispose();\n };\n signal.addEventListener('abort', handler, { once: true });\n listeners.push({ signal, handler });\n }\n return { signal: controller.signal, dispose };\n}\n\n/**\n * Events emitted by the debug logger.\n * - `request` — about to send a request (`method`, `url`, `path`)\n * - `response` — response received (`status`, `method`, `path`, `requestId?`)\n * - `retry` — about to retry after a transient failure (`attempt`, `maxRetries`, `method`, `path`)\n */\nexport type DelopayLogger = (\n event: 'request' | 'response' | 'retry',\n data: Record<string, unknown>,\n) => void;\n\n/**\n * Configuration options for the Delopay client.\n */\nexport interface DelopayOptions {\n /** Use the sandbox environment (`https://sandbox.delopay.net`). Defaults to `false` (production). */\n sandbox?: boolean;\n /** Override the base URL entirely. Takes precedence over `sandbox`. */\n baseUrl?: string;\n /** Request timeout in milliseconds. Defaults to `30000` (30 seconds). */\n timeout?: number;\n /**\n * Maximum number of automatic retries for transient failures (5xx, timeout, network errors).\n * Retries use exponential backoff. Set to `0` to disable. Defaults to `2`.\n * Only idempotent-safe requests (GET, DELETE, and requests with an `Idempotency-Key` header) are retried.\n */\n maxRetries?: number;\n /** Enable debug logging of requests and responses. Defaults to `false`. */\n debug?: boolean;\n /**\n * Custom logger for debug events (`request`, `response`, `retry`). When omitted,\n * debug output is written to `console.log`. Has no effect unless `debug` is `true`.\n * Useful for routing SDK logs through pino, winston, or similar structured loggers.\n */\n logger?: DelopayLogger;\n}\n\nconst SENSITIVE_QUERY_KEYS = new Set([\n 'client_secret',\n 'ephemeral_key',\n 'api_key',\n 'publishable_key',\n]);\n\n/**\n * Return a copy of `url` with the values of known-sensitive query parameters\n * replaced by `REDACTED`, leaving the rest of the query string intact.\n * Used only to sanitize URLs before they hit debug logs.\n */\nfunction redactUrlForLogging(url: string): string {\n const qIdx = url.indexOf('?');\n if (qIdx === -1) return url;\n const base = url.slice(0, qIdx);\n const query = url.slice(qIdx + 1);\n const parts = query.split('&').map((pair) => {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) return pair;\n const key = pair.slice(0, eqIdx);\n if (SENSITIVE_QUERY_KEYS.has(decodeURIComponent(key).toLowerCase())) {\n return `${key}=REDACTED`;\n }\n return pair;\n });\n return `${base}?${parts.join('&')}`;\n}\n\n/**\n * Low-level options forwarded to a single HTTP request.\n */\nexport interface RequestOptions {\n /** Request body, serialised as JSON. */\n body?: unknown;\n /**\n * Query-string parameters. `undefined` and `null` values are omitted.\n * Array values are emitted as repeated keys (`?tag=a&tag=b`) — not comma-joined.\n */\n query?: Record<\n string,\n string | number | boolean | null | undefined | (string | number | boolean)[]\n >;\n /** Additional HTTP headers merged with the default `api-key` header. */\n headers?: Record<string, string>;\n /** Override the client-level timeout for this request, in milliseconds. */\n timeout?: number;\n /**\n * Caller-provided `AbortSignal`. Aborting it cancels the in-flight request and rejects\n * with a `DelopayError` carrying code `'ABORTED'`. Combined with the per-request timeout.\n */\n signal?: AbortSignal;\n}\n\nexport type RequestFn = <T>(method: string, path: string, options?: RequestOptions) => Promise<T>;\n\n/**\n * Delopay API client.\n *\n * Instantiate once with your API key and reuse across your application.\n * All resource sub-clients (payments, refunds, customers, …) are exposed\n * as properties on the instance.\n *\n * @example\n * ```typescript\n * const delopay = new Delopay('sk_live_...', { sandbox: false });\n * const payment = await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * ```\n */\nexport class Delopay {\n /** Utility for verifying incoming webhook signatures (static, no instance needed). */\n static webhooks = Webhooks;\n\n /** The resolved base URL used for all API requests. */\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly debug: boolean;\n private readonly logger?: DelopayLogger;\n private jwtToken?: string;\n\n // Merchant-facing\n readonly payments: Payments;\n readonly refunds: Refunds;\n readonly customers: Customers;\n readonly paymentMethods: PaymentMethods;\n readonly paymentLinks: PaymentLinks;\n readonly mandates: Mandates;\n readonly disputes: Disputes;\n readonly payouts: Payouts;\n readonly ephemeralKeys: EphemeralKeys;\n readonly events: Events;\n readonly poll: Poll;\n\n // Connector / routing\n readonly connectors: Connectors;\n readonly routing: Routing;\n readonly profiles: Profiles;\n readonly shops: Shops;\n readonly profileAcquirers: ProfileAcquirers;\n\n // Authentication & verification\n readonly authentication: Authentication;\n readonly verification: Verification;\n\n // Dashboard / internal\n readonly users: Users;\n readonly apiKeys: ApiKeys;\n readonly billing: Billing;\n readonly blocklist: Blocklist;\n readonly fees: Fees;\n readonly merchantAccounts: MerchantAccounts;\n readonly projects: Projects;\n readonly relay: Relay;\n readonly stripeConnect: StripeConnect;\n readonly threeDsRules: ThreeDsRules;\n\n // New resources (Phases 3-4)\n readonly subscriptions: Subscriptions;\n readonly files: Files;\n readonly export: Export;\n readonly forex: Forex;\n readonly regions: Regions;\n readonly analytics: Analytics;\n readonly analyticsDashboard: AnalyticsDashboard;\n readonly featureMatrix: FeatureMatrix;\n readonly cards: Cards;\n\n /**\n * Create a new Delopay client.\n *\n * @param apiKey - Your Delopay API key (e.g. `sk_live_...` or `sk_test_...`).\n * Pass an empty string or omit for JWT-only usage (e.g. dashboard apps).\n * @param options - Optional configuration (sandbox mode, base URL override, timeout).\n */\n constructor(apiKey?: string, options?: DelopayOptions) {\n this.apiKey = apiKey ?? '';\n this.timeout = options?.timeout ?? 30_000;\n this.maxRetries = options?.maxRetries ?? 2;\n this.debug = options?.debug ?? false;\n if (options?.logger !== undefined) this.logger = options.logger;\n\n if (options?.baseUrl !== undefined) {\n this.baseUrl = options.baseUrl;\n } else if (options?.sandbox) {\n this.baseUrl = SANDBOX_URL;\n } else {\n this.baseUrl = PRODUCTION_URL;\n }\n\n const request = this.request.bind(this) as RequestFn;\n\n // JWT auth methods are defined below (setJwtToken / clearJwtToken)\n\n // Merchant-facing\n this.payments = new Payments(request);\n this.refunds = new Refunds(request);\n this.customers = new Customers(request);\n this.paymentMethods = new PaymentMethods(request);\n this.paymentLinks = new PaymentLinks(request);\n this.mandates = new Mandates(request);\n this.disputes = new Disputes(request);\n this.payouts = new Payouts(request);\n this.ephemeralKeys = new EphemeralKeys(request);\n this.events = new Events(request);\n this.poll = new Poll(request);\n\n // Connector / routing\n this.connectors = new Connectors(request);\n this.routing = new Routing(request);\n this.profiles = new Profiles(request);\n this.shops = new Shops(request);\n this.profileAcquirers = new ProfileAcquirers(request);\n\n // Authentication & verification\n this.authentication = new Authentication(request);\n this.verification = new Verification(request);\n\n // Dashboard / internal\n this.users = new Users(request);\n this.apiKeys = new ApiKeys(request);\n this.billing = new Billing(request);\n this.blocklist = new Blocklist(request);\n this.fees = new Fees(request);\n this.merchantAccounts = new MerchantAccounts(request);\n this.projects = new Projects(request);\n this.relay = new Relay(request);\n this.stripeConnect = new StripeConnect(request);\n this.threeDsRules = new ThreeDsRules(request);\n\n // New resources (Phases 3-4)\n this.subscriptions = new Subscriptions(request);\n this.files = new Files(request);\n this.export = new Export(request);\n this.forex = new Forex(request);\n this.regions = new Regions(request);\n this.analytics = new Analytics(request);\n this.analyticsDashboard = new AnalyticsDashboard(request);\n this.featureMatrix = new FeatureMatrix(request);\n this.cards = new Cards(request);\n }\n\n /**\n * Set a JWT token for subsequent requests.\n * When set, requests use `Authorization: Bearer <token>` instead of `api-key`.\n * Useful after `users.signIn()` returns a JWT for dashboard operations.\n */\n setJwtToken(token: string): void {\n this.jwtToken = token;\n }\n\n /**\n * Clear the JWT token, reverting to API key authentication.\n */\n clearJwtToken(): void {\n this.jwtToken = undefined;\n }\n\n /**\n * Make a raw HTTP request to the Delopay API.\n *\n * You rarely need to call this directly — prefer the typed resource methods.\n * Use it only for endpoints not yet covered by a resource class.\n *\n * @param method - HTTP method (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`).\n * @param path - API path starting with `/` (e.g. `/payments`).\n * @param options - Optional body, query parameters, and headers.\n * @returns Parsed JSON response body typed as `T`.\n * @throws {DelopayAuthenticationError} On 401 responses.\n * @throws {DelopayError} On all other non-2xx responses, timeouts, and network errors.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v !== undefined && v !== null) params.append(key, String(v));\n }\n } else {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n ...(this.jwtToken\n ? { Authorization: `Bearer ${this.jwtToken}` }\n : this.apiKey\n ? { 'api-key': this.apiKey }\n : {}),\n ...options?.headers,\n };\n\n // FormData / Blob / ArrayBuffer / URLSearchParams pass through unchanged so callers\n // can send multipart uploads. The runtime (browser or Node 18+ fetch) sets the\n // appropriate Content-Type including the multipart boundary, so we don't touch it.\n const isRawBody =\n options?.body !== undefined &&\n options?.body !== null &&\n (options.body instanceof FormData ||\n options.body instanceof Blob ||\n options.body instanceof ArrayBuffer ||\n options.body instanceof URLSearchParams);\n\n if (options?.body && !isRawBody) {\n headers['Content-Type'] = 'application/json';\n }\n\n const idempotencyKey = findIdempotencyKey(headers)?.trim();\n const isRetryable =\n method === 'GET' ||\n method === 'DELETE' ||\n (idempotencyKey !== undefined && idempotencyKey !== '');\n\n // Serialize body once so circular-reference errors surface immediately and big payloads\n // aren't re-stringified on every retry attempt. Raw bodies pass through untouched.\n let serializedBody: BodyInit | undefined;\n if (isRawBody) {\n serializedBody = options?.body as BodyInit;\n } else if (options?.body) {\n serializedBody = JSON.stringify(options.body);\n }\n\n const callerSignal = options?.signal;\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n\n const timeoutMs = options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n let retryAfterOverrideMs: number | null = null;\n\n const safeUrl = () => redactUrlForLogging(url);\n const emit = (event: 'request' | 'response' | 'retry', data: Record<string, unknown>) => {\n if (!this.debug) return;\n if (this.logger) {\n this.logger(event, data);\n return;\n }\n if (event === 'request')\n console.log(`[delopay] ${data.method as string} ${data.url as string}`);\n else if (event === 'response')\n console.log(\n `[delopay] ${data.status as number} ${data.method as string} ${data.path as string}`,\n );\n else\n console.log(\n `[delopay] retry ${data.attempt as number}/${data.maxRetries as number} ${data.method as string} ${data.path as string}`,\n );\n };\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const base = Math.min(500 * 2 ** (attempt - 1), 5000);\n // Full jitter: pick uniformly in [0, base) to avoid synchronized retry storms.\n const jittered = Math.random() * base;\n const delay = Math.max(retryAfterOverrideMs ?? 0, jittered);\n retryAfterOverrideMs = null;\n await new Promise((resolve) => setTimeout(resolve, delay));\n emit('retry', { attempt, maxRetries: this.maxRetries, method, path });\n }\n\n const timeoutCtrl = new AbortController();\n const timeoutId = setTimeout(() => timeoutCtrl.abort(), timeoutMs);\n const combined = combineSignals(\n callerSignal ? [timeoutCtrl.signal, callerSignal] : [timeoutCtrl.signal],\n );\n\n try {\n emit('request', { method, url: safeUrl(), path });\n\n const response = await fetch(url, {\n method,\n headers,\n body: serializedBody,\n signal: combined.signal,\n });\n\n const requestId =\n response.headers?.get('x-request-id') ?? response.headers?.get('x-trace-id') ?? undefined;\n\n emit('response', { status: response.status, method, path, requestId });\n\n if (!response.ok) {\n const rawBody = await response.text().catch(() => '');\n let parsed: Record<string, unknown> = {};\n if (rawBody) {\n try {\n parsed = JSON.parse(rawBody) as Record<string, unknown>;\n } catch {\n // non-JSON error body (HTML from a proxy, truncated stream, etc.) — keep raw\n }\n }\n // API wraps errors as { error: { message, code, type, data? } } — unwrap if present\n const err = (parsed.error as Record<string, unknown>) ?? parsed;\n const message =\n (err.message as string) ?? `Request failed with status ${response.status}`;\n const code = (err.code as string) ?? '';\n const type = (err.error_type as string) ?? (err.type as string) ?? '';\n const data =\n err.data && typeof err.data === 'object' && !Array.isArray(err.data)\n ? (err.data as Record<string, unknown>)\n : undefined;\n const truncatedRaw = truncateRawBody(rawBody);\n\n if (response.status === 401) {\n throw new DelopayAuthenticationError(message, {\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n }\n\n const error = new DelopayError(message, {\n status: response.status,\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n\n // Retry on 5xx and 429 (rate limit). 4xx other than 429 are not transient.\n const isTransientStatus = response.status >= 500 || response.status === 429;\n if (isTransientStatus && isRetryable && attempt < this.maxRetries) {\n if (response.status === 429) {\n retryAfterOverrideMs = parseRetryAfter(response.headers?.get('retry-after') ?? null);\n }\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n } catch (err) {\n if (err instanceof DelopayError || err instanceof DelopayAuthenticationError) {\n throw err;\n }\n if (err instanceof Error && err.name === 'AbortError') {\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n lastError = new DelopayError('Request timed out', {\n status: 0,\n code: 'TIMEOUT',\n type: 'timeout_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n if (err instanceof TypeError) {\n lastError = new DelopayError(`Network error: ${err.message}`, {\n status: 0,\n code: 'NETWORK',\n type: 'network_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n combined.dispose();\n }\n }\n\n throw lastError;\n }\n\n /**\n * Auto-paginate a list endpoint. Yields items one by one, fetching\n * the next page automatically when the current one is exhausted.\n *\n * @param listFn - A function that takes `{ limit, offset }` and returns `{ data: T[] }` or `T[]`.\n * @param params - Additional parameters to pass to every page request.\n * @param pageSize - Number of items per page. Defaults to `50`.\n *\n * @example\n * ```typescript\n * for await (const payment of delopay.paginate(\n * (p) => delopay.payments.list(p),\n * )) {\n * console.log(payment.payment_id);\n * }\n * ```\n */\n async *paginate<T, P extends Record<string, unknown>>(\n listFn: (params: P & { limit: number; offset: number }) => Promise<{ data: T[] } | T[]>,\n params?: P,\n pageSize = 50,\n ): AsyncGenerator<T> {\n let offset = 0;\n while (true) {\n const result = await listFn({\n ...((params ?? {}) as P),\n limit: pageSize,\n offset,\n });\n const items = Array.isArray(result) ? result : result.data;\n if (items.length === 0) break;\n for (const item of items) {\n yield item;\n }\n if (items.length < pageSize) break;\n offset += items.length;\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/error.ts","../src/resources/apiKeys.ts","../src/resources/authentication.ts","../src/resources/billing.ts","../src/resources/blocklist.ts","../src/resources/connectors.ts","../src/resources/customers.ts","../src/resources/disputes.ts","../src/resources/ephemeralKeys.ts","../src/resources/events.ts","../src/resources/fees.ts","../src/resources/mandates.ts","../src/resources/merchantAccounts.ts","../src/resources/paymentLinks.ts","../src/resources/paymentMethods.ts","../src/resources/payments.ts","../src/resources/payouts.ts","../src/resources/poll.ts","../src/resources/profileAcquirers.ts","../src/resources/profiles.ts","../src/resources/projects.ts","../src/resources/refunds.ts","../src/resources/relay.ts","../src/resources/routing.ts","../src/resources/shops.ts","../src/resources/stripeConnect.ts","../src/resources/threeDsRules.ts","../src/resources/users.ts","../src/resources/verification.ts","../src/resources/webhooks.ts","../src/resources/analytics.ts","../src/resources/analyticsDashboard.ts","../src/resources/cards.ts","../src/resources/export.ts","../src/resources/featureMatrix.ts","../src/resources/files.ts","../src/resources/forex.ts","../src/resources/regions.ts","../src/resources/subscriptions.ts","../src/client.ts"],"sourcesContent":["export { Delopay } from './client';\nexport type { DelopayOptions, RequestOptions, RequestFn, DelopayLogger } from './client';\nexport { DelopayError, DelopayAuthenticationError } from './error';\nexport type * from './types';\nexport { Webhooks } from './resources/webhooks';\nexport type { WebhookEvent } from './resources/webhooks';\n\n// New resources (Phases 3-4)\nexport { Analytics } from './resources/analytics';\nexport { AnalyticsDashboard } from './resources/analyticsDashboard';\nexport { Cards } from './resources/cards';\nexport { Export } from './resources/export';\nexport { FeatureMatrix } from './resources/featureMatrix';\nexport { Files } from './resources/files';\nexport { Forex } from './resources/forex';\nexport { Regions } from './resources/regions';\nexport { Subscriptions } from './resources/subscriptions';\n","/**\n * Error thrown when the Delopay API returns a non-2xx response, or when a\n * timeout or network error occurs.\n *\n * @example\n * ```typescript\n * try {\n * await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * } catch (e) {\n * if (e instanceof DelopayError) {\n * console.error(e.status, e.code, e.requestId, e.message);\n * }\n * }\n * ```\n */\nexport class DelopayError extends Error {\n /** HTTP status code returned by the API, or `0` for timeout/network errors. */\n readonly status: number;\n /** Machine-readable error code returned by the API (e.g. `'HE_00'`). */\n readonly code: string;\n /** Error category (e.g. `'invalid_request'`, `'timeout_error'`). */\n readonly type: string;\n /** Value of the `x-request-id` response header, when present. Include this when contacting support. */\n readonly requestId?: string;\n /**\n * Raw response body (truncated to ~2 KB). Populated when the server returns a\n * non-JSON error body (e.g. an HTML 502 from an upstream proxy) so debugging\n * still has something to go on.\n */\n readonly rawBody?: string;\n /**\n * Structured error context the API attaches under `error.data` for select\n * codes — e.g. `{ retry_after_secs: 248 }` on rate-limit / max-attempt\n * lockouts. Schema is per-code; consult the API reference for the shape.\n */\n readonly data?: Record<string, unknown>;\n\n constructor(\n message: string,\n options: {\n status: number;\n code: string;\n type: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.rawBody !== undefined) this.rawBody = options.rawBody;\n if (options.data !== undefined) this.data = options.data;\n }\n}\n\n/**\n * Thrown when the API key is missing, invalid, or revoked (HTTP 401).\n *\n * @example\n * ```typescript\n * if (e instanceof DelopayAuthenticationError) {\n * // Prompt user to re-enter their API key.\n * }\n * ```\n */\nexport class DelopayAuthenticationError extends DelopayError {\n constructor(\n message = 'Invalid API key',\n options?: {\n code?: string;\n type?: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message, {\n status: 401,\n // Default to the generic \"invalid API key\" code, but let callers pass\n // through the server-reported code (e.g. `UR_05` for unverified-email\n // 401s) so they can differentiate between auth failure reasons.\n code: options?.code || 'AUTH_01',\n type: options?.type || 'authentication_error',\n requestId: options?.requestId,\n rawBody: options?.rawBody,\n data: options?.data,\n });\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayAuthenticationError';\n }\n}\n","import type {\n ApiKeyCreateRequest,\n ApiKeyCreateResponse,\n ApiKeyResponse,\n ApiKeyUpdateRequest,\n ApiKeyRevokeResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage API keys for a merchant account. */\nexport class ApiKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new API key for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Key creation parameters (name, expiry, etc.).\n * @returns The newly created key including the plaintext secret (shown once only).\n *\n * @example\n * ```typescript\n * const { key_value } = await delopay.apiKeys.create('merch_123', { name: 'Production key' });\n * ```\n */\n async create(merchantId: string, params: ApiKeyCreateRequest): Promise<ApiKeyCreateResponse> {\n return this.request('POST', `/api_keys/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve metadata about an API key (does not return the plaintext secret).\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID.\n * @returns The API key metadata.\n */\n async retrieve(merchantId: string, keyId: string): Promise<ApiKeyResponse> {\n return this.request(\n 'GET',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * Update an API key's name or expiry.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to update.\n * @param params - Fields to update.\n * @returns The updated API key metadata.\n */\n async update(\n merchantId: string,\n keyId: string,\n params: ApiKeyUpdateRequest,\n ): Promise<ApiKeyResponse> {\n return this.request(\n 'POST',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n { body: params },\n );\n }\n\n /**\n * Revoke an API key, immediately invalidating it.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(merchantId: string, keyId: string): Promise<ApiKeyRevokeResponse> {\n return this.request(\n 'DELETE',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * List all API keys for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of API key metadata objects.\n */\n async list(merchantId: string): Promise<ApiKeyResponse[]> {\n return this.request('GET', `/api_keys/${encodeURIComponent(merchantId)}/list`);\n }\n}\n","import type { AuthenticationCreateRequest, AuthenticationResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Authentication {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: AuthenticationCreateRequest): Promise<AuthenticationResponse> {\n return this.request('POST', '/authentication', { body: params });\n }\n\n async checkEligibility(authId: string): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility`);\n }\n\n async authenticate(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/authenticate`, {\n body: params,\n });\n }\n\n async sync(authId: string, params?: Record<string, unknown>): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/sync`, {\n body: params,\n });\n }\n\n /** Redirect after authentication. `POST /authentication/{authId}/redirect` */\n async redirect(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/redirect`, {\n body: params,\n });\n }\n\n /** Enable authn methods token. `POST /authentication/{authId}/enabled_authn_methods_token` */\n async enabledAuthnMethodsToken(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request(\n 'POST',\n `/authentication/${encodeURIComponent(authId)}/enabled_authn_methods_token`,\n {\n body: params,\n },\n );\n }\n\n /** Submit eligibility check. `POST /authentication/{authId}/eligibility-check` */\n async eligibilityCheck(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility-check`, {\n body: params,\n });\n }\n}\n","import type {\n BillingProfileResponse,\n BillingSetupRequest,\n BillingSetupResponse,\n BillingCompleteSetupRequest,\n TopupRequest,\n TopupResponse,\n LedgerResponse,\n LedgerListParams,\n AutoRechargeUpdateRequest,\n AllocationTransferRequest,\n AllocationTransferResponse,\n AllocationListResponse,\n AllocationResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage per-shop prepaid balance allocations transferred from the host merchant treasury. */\nclass BillingAllocations {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Transfer funds from the host merchant treasury into a shop's allocation.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, target profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferIn(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-in`,\n { body: params },\n );\n }\n\n /**\n * Transfer funds from a shop's allocation back to the host merchant treasury.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, source profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferOut(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-out`,\n {\n body: params,\n },\n );\n }\n\n /**\n * List all shop balance allocations for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns List of shop allocations.\n */\n async list(merchantId: string): Promise<AllocationListResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/allocations`);\n }\n\n /**\n * Get the balance allocation for a specific shop.\n *\n * @param merchantId - The merchant account ID.\n * @param profileId - The shop (business profile) ID.\n * @returns The shop's balance allocation.\n */\n async get(merchantId: string, profileId: string): Promise<AllocationResponse> {\n return this.request(\n 'GET',\n `/billing/${encodeURIComponent(merchantId)}/allocations/${encodeURIComponent(profileId)}`,\n );\n }\n}\n\n/**\n * Manage prepaid billing balances — top-ups, card setup, auto-recharge, and the balance ledger.\n *\n * Delopay deducts a platform fee from the merchant's prepaid balance on every successful payment.\n * Use these endpoints to fund and monitor that balance.\n */\nexport class Billing {\n /** Per-shop balance allocation management for host merchants. */\n readonly allocations: BillingAllocations;\n\n constructor(private readonly request: RequestFn) {\n this.allocations = new BillingAllocations(request);\n }\n\n /**\n * Retrieve a merchant's billing profile (balance, status, auto-recharge config).\n *\n * @param merchantId - The merchant account ID.\n * @returns The billing profile.\n *\n * @example\n * ```typescript\n * const profile = await delopay.billing.getProfile('merch_123');\n * console.log(profile.balance, profile.status);\n * ```\n */\n async getProfile(merchantId: string): Promise<BillingProfileResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Start a Stripe SetupIntent flow to collect a payment card for auto-recharge.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional setup parameters.\n * @returns The Stripe client secret needed to render the card element.\n */\n async setup(merchantId: string, params?: BillingSetupRequest): Promise<BillingSetupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup`, {\n body: params,\n });\n }\n\n /**\n * Confirm card setup after the Stripe SetupIntent completes on the frontend.\n *\n * @param merchantId - The merchant account ID.\n * @param params - The Stripe SetupIntent ID to confirm.\n * @returns The updated billing profile.\n */\n async completeSetup(\n merchantId: string,\n params: BillingCompleteSetupRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup/complete`, {\n body: params,\n });\n }\n\n /**\n * Manually top up a merchant's prepaid balance by charging their saved card.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Top-up amount and currency.\n * @returns The top-up result.\n */\n async topup(merchantId: string, params: TopupRequest): Promise<TopupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/topup`, {\n body: params,\n });\n }\n\n /**\n * List the balance ledger (credits and debits) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional pagination parameters.\n * @returns The ledger entries.\n */\n async listLedger(merchantId: string, params?: LedgerListParams): Promise<LedgerResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/ledger`, {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Update auto-recharge configuration (threshold, top-up amount, enabled flag).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Auto-recharge settings to update.\n * @returns The updated billing profile.\n */\n async updateAutoRecharge(\n merchantId: string,\n params: AutoRechargeUpdateRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('PATCH', `/billing/${encodeURIComponent(merchantId)}/auto-recharge`, {\n body: params,\n });\n }\n}\n","import type { BlocklistAddRequest, BlocklistResponse, BlocklistDataKind } from '../types';\nimport type { RequestFn } from '../client';\n\nexport interface BlocklistListParams {\n data_kind?: BlocklistDataKind | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface BlocklistToggleParams {\n status: boolean;\n}\n\nexport class Blocklist {\n constructor(private readonly request: RequestFn) {}\n\n async add(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('POST', '/blocklist', { body: params });\n }\n\n async remove(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('DELETE', '/blocklist', { body: params });\n }\n\n async list(params?: BlocklistListParams): Promise<BlocklistResponse[]> {\n return this.request('GET', '/blocklist', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async toggle(params: BlocklistToggleParams): Promise<Record<string, unknown>> {\n return this.request('POST', '/blocklist/toggle', { body: params });\n }\n}\n","import type {\n ConnectorCreateRequest,\n ConnectorResponse,\n ConnectorUpdateRequest,\n ConnectorWebhookListResponse,\n ConnectorWebhookRegisterRequest,\n ConnectorWebhookRegisterResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Connectors {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ConnectorCreateRequest): Promise<ConnectorResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/connectors`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n async list(accountId: string): Promise<ConnectorResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/connectors`);\n }\n\n async update(\n accountId: string,\n connectorId: string,\n params: ConnectorUpdateRequest,\n ): Promise<ConnectorResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Verify connector credentials. `POST /account/connectors/verify` */\n async verify(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/account/connectors/verify', { body: params });\n }\n\n /**\n * Register a webhook for a connector.\n * `POST /account/{merchantId}/connectors/webhooks/{connectorId}`\n *\n * @param params - Optional event scope. Defaults to `{ event_type: 'all_events' }`\n * on the backend when omitted; pass `{ event_type: { specific_event: '…' } }`\n * to scope to a single event.\n */\n async registerWebhook(\n merchantId: string,\n connectorId: string,\n params?: ConnectorWebhookRegisterRequest,\n ): Promise<ConnectorWebhookRegisterResponse> {\n const path = `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`;\n if (params === undefined) return this.request('POST', path);\n return this.request('POST', path, { body: params });\n }\n\n /** Get registered webhooks for a connector. `GET /account/{merchantId}/connectors/webhooks/{connectorId}` */\n async getWebhook(merchantId: string, connectorId: string): Promise<ConnectorWebhookListResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`,\n );\n }\n\n /** List available payment methods. `GET /account/payment_methods` */\n async listPaymentMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/account/payment_methods');\n }\n}\n","import type {\n CustomerCreateRequest,\n CustomerResponse,\n CustomerUpdateRequest,\n CustomerListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage customer profiles. */\nexport class Customers {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new customer.\n *\n * @param params - Customer creation parameters (name, email, phone, address, etc.).\n * @returns The created customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.create({\n * email: 'alice@example.com',\n * name: 'Alice Smith',\n * });\n * ```\n */\n async create(params: CustomerCreateRequest): Promise<CustomerResponse> {\n return this.request('POST', '/customers', { body: params });\n }\n\n /**\n * Retrieve a customer by their ID.\n *\n * @param customerId - The unique customer ID.\n * @returns The customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.retrieve('cus_abc123');\n * ```\n */\n async retrieve(customerId: string): Promise<CustomerResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * Update an existing customer's details.\n *\n * @param customerId - The customer ID to update.\n * @param params - Fields to update (name, email, address, metadata, etc.).\n * @returns The updated customer.\n */\n async update(customerId: string, params: CustomerUpdateRequest): Promise<CustomerResponse> {\n return this.request('POST', `/customers/${encodeURIComponent(customerId)}`, { body: params });\n }\n\n /**\n * Delete a customer and all their saved payment methods.\n *\n * @param customerId - The customer ID to delete.\n * @returns The deleted customer object.\n */\n async delete(customerId: string): Promise<CustomerResponse> {\n return this.request('DELETE', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * List customers, optionally filtered by email.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of customer objects.\n */\n async list(params?: CustomerListParams): Promise<CustomerResponse[]> {\n return this.request('GET', '/customers/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.6) ---\n\n /** List customers with count. `GET /customers/list_with_count` */\n async listWithCount(\n params?: CustomerListParams,\n ): Promise<{ count: number; total_count: number; data: CustomerResponse[] }> {\n return this.request('GET', '/customers/list_with_count', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /** List mandates for a customer. `GET /customers/{customerId}/mandates` */\n async listMandates(customerId: string): Promise<Record<string, unknown>[]> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/mandates`);\n }\n}\n","import type { DisputeResponse, DisputeListParams, DisputeEvidenceRequest } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and respond to payment disputes and chargebacks. */\nexport class Disputes {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a dispute by its ID.\n *\n * @param disputeId - The unique dispute ID.\n * @returns The dispute.\n */\n async retrieve(disputeId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * List disputes, optionally filtered by status, stage, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of disputes.\n */\n async list(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Accept a dispute, conceding the chargeback to the customer.\n *\n * @param disputeId - The dispute ID to accept.\n * @returns The updated dispute.\n */\n async accept(disputeId: string): Promise<DisputeResponse> {\n return this.request('POST', `/disputes/accept/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Submit evidence to challenge a dispute.\n *\n * @param params - Evidence details and the dispute ID to contest.\n * @returns The updated dispute.\n */\n async submitEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('POST', '/disputes/evidence', { body: params });\n }\n\n /**\n * Attach evidence (e.g. file upload metadata) to a dispute.\n *\n * Uses `PUT /disputes/evidence`.\n */\n async attachEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('PUT', '/disputes/evidence', { body: params });\n }\n\n /**\n * Retrieve previously submitted evidence for a dispute.\n *\n * @param disputeId - The dispute ID.\n * @returns The submitted evidence.\n */\n async retrieveEvidence(disputeId: string): Promise<DisputeEvidenceRequest> {\n return this.request('GET', `/disputes/evidence/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Delete submitted evidence for a dispute.\n *\n * @param params - Evidence request body identifying what to delete.\n * @returns The updated dispute.\n */\n async deleteEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('DELETE', '/disputes/evidence', { body: params });\n }\n\n // --- OLAP extensions (Task 4.4) ---\n\n /** List disputes (profile-scoped). `GET /disputes/profile/list` */\n async listByProfile(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get dispute filter options. `GET /disputes/filter` */\n async getFilters(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/filter', { query: params });\n }\n\n /** Get dispute filters (profile-scoped). `GET /disputes/profile/filter` */\n async getFiltersByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/filter', { query: params });\n }\n\n /** Get dispute aggregates. `GET /disputes/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/aggregate', { query: params });\n }\n\n /** Get dispute aggregates (profile-scoped). `GET /disputes/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/aggregate', { query: params });\n }\n\n /**\n * Fetch the latest dispute state from the connector (gateway).\n * `GET /disputes/{connectorId}/fetch`\n *\n * Note: the path parameter is the **connector dispute id** on the gateway, not the\n * Delopay dispute id. Method is GET (not POST) and this method signature was\n * previously wrong — callers depending on the old `POST /disputes/{id}/fetch_from_connector`\n * path were silently hitting 404s.\n */\n async fetchFromConnector(connectorId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(connectorId)}/fetch`);\n }\n}\n","import type { EphemeralKeyCreateRequest, EphemeralKeyCreateResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create short-lived ephemeral keys for secure client-side operations.\n *\n * Ephemeral keys grant a mobile or browser client temporary access to a\n * specific customer's data (e.g. to display saved payment methods) without\n * exposing your secret API key.\n */\nexport class EphemeralKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create an ephemeral key scoped to a specific customer.\n *\n * @param params - Customer ID and optional expiry.\n * @returns The ephemeral key with its plaintext secret and expiry timestamp.\n *\n * @example\n * ```typescript\n * const ephKey = await delopay.ephemeralKeys.create({ customer_id: 'cus_123' });\n * // Pass ephKey.secret to your mobile app.\n * ```\n */\n async create(params: EphemeralKeyCreateRequest): Promise<EphemeralKeyCreateResponse> {\n return this.request('POST', '/ephemeral_keys', { body: params });\n }\n\n /**\n * Invalidate an ephemeral key before it expires.\n *\n * @param keyId - The ephemeral key ID to delete.\n * @returns The deleted key object.\n */\n async delete(keyId: string): Promise<EphemeralKeyCreateResponse> {\n return this.request('DELETE', `/ephemeral_keys/${encodeURIComponent(keyId)}`);\n }\n}\n","import type {\n EventListParams,\n EventListResponse,\n EventDeliveryAttemptResponse,\n EventDetailResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Events {\n constructor(private readonly request: RequestFn) {}\n\n async list(merchantId: string, params?: EventListParams): Promise<EventListResponse> {\n return this.request('POST', `/events/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n async listDeliveryAttempts(\n merchantId: string,\n eventId: string,\n ): Promise<EventDeliveryAttemptResponse[]> {\n return this.request(\n 'GET',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/attempts`,\n );\n }\n\n async retryDelivery(merchantId: string, eventId: string): Promise<EventDetailResponse> {\n return this.request(\n 'POST',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/retry`,\n );\n }\n\n // --- Profile-scoped listing (Task 4.12) ---\n\n /** List events (profile-scoped). `POST /events/profile/list` */\n async listByProfile(params?: Record<string, unknown>): Promise<EventListResponse> {\n return this.request('POST', '/events/profile/list', { body: params });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Merchant-scoped fee schedules. Each schedule optionally targets a\n * specific shop (via `shop_id`). Merchants can CRUD their own fee\n * overrides; platform-wide fee programs are administered by Delopay and\n * not exposed here.\n */\nexport class Fees {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a merchant-scoped fee schedule (optionally per-shop).\n *\n * @param params - Fee schedule parameters.\n * @param merchantId - The merchant account ID.\n */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/merchant_fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * List the merchant's own fee schedules.\n *\n * @param merchantId - The merchant account ID.\n */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/merchant_fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Update a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n * @param params - Fields to update.\n */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/merchant_fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /**\n * Delete a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/merchant_fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { MandateResponse, MandateRevokedResponse, MandateListParams } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and revoke recurring payment mandates. */\nexport class Mandates {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a mandate by its ID.\n *\n * @param mandateId - The unique mandate ID.\n * @returns The mandate.\n */\n async retrieve(mandateId: string): Promise<MandateResponse> {\n return this.request('GET', `/mandates/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * Revoke an active mandate, preventing future charges.\n *\n * @param mandateId - The mandate ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(mandateId: string): Promise<MandateRevokedResponse> {\n return this.request('POST', `/mandates/revoke/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * List mandates, optionally filtered by customer or status.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of mandates.\n */\n async list(params?: MandateListParams): Promise<MandateResponse[]> {\n return this.request('GET', '/mandates/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n}\n","import type {\n MerchantAccountCreateRequest,\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class MerchantAccounts {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: MerchantAccountCreateRequest): Promise<MerchantAccountResponse> {\n return this.request('POST', '/accounts', { body: params });\n }\n\n async retrieve(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n async update(\n accountId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}`, { body: params });\n }\n\n async delete(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n // --- Advanced operations (Task 4.9) ---\n\n /** List all merchant accounts. `GET /accounts/list` */\n async list(): Promise<MerchantAccountResponse[]> {\n return this.request('GET', '/accounts/list');\n }\n\n /** Toggle key-value store for a merchant. `POST /accounts/{accountId}/kv` */\n async toggleKv(accountId: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Get KV status for a merchant. `GET /accounts/{accountId}/kv` */\n async getKvStatus(accountId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Transfer keys between merchants. `POST /accounts/transfer` */\n async transferKeys(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/accounts/transfer', { body: params });\n }\n}\n","import type { PaymentLinkResponse, PaymentLinkListParams, PaymentLinkListResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/** Retrieve and list hosted payment links. */\nexport class PaymentLinks {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a payment link by its ID.\n *\n * @param linkId - The unique payment link ID.\n * @returns The payment link details.\n */\n async retrieve(linkId: string): Promise<PaymentLinkResponse> {\n return this.request('GET', `/payment_link/${encodeURIComponent(linkId)}`);\n }\n\n /**\n * List payment links, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment links.\n */\n async list(params?: PaymentLinkListParams): Promise<PaymentLinkListResponse> {\n return this.request('POST', '/payment_link/list', { body: params });\n }\n\n /** Initiate (render) a payment link page. `GET /payment_link/{merchantId}/{paymentId}` */\n async initiate(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_link/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n\n /** Get payment link status. `GET /payment_linkstatus/{merchantId}/{paymentId}` */\n async status(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_linkstatus/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n}\n","import type {\n PaymentMethodCreateRequest,\n PaymentMethodResponse,\n PaymentMethodUpdateRequest,\n PaymentMethodListParams,\n PaymentMethodDeleteResponse,\n CustomerPaymentMethodsListParams,\n CustomerPaymentMethodsListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage saved payment methods for customers. */\nexport class PaymentMethods {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Save a new payment method (card, bank account, wallet, etc.).\n *\n * @param params - Payment method data including type and card/bank details.\n * @returns The saved payment method.\n *\n * @example\n * ```typescript\n * const pm = await delopay.paymentMethods.create({\n * payment_method: 'card',\n * customer_id: 'cus_123',\n * client_secret: 'cs_...',\n * });\n * ```\n */\n async create(params: PaymentMethodCreateRequest): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods', { body: params });\n }\n\n /**\n * Retrieve a saved payment method by its ID.\n *\n * @param methodId - The payment method ID.\n * @returns The payment method.\n */\n async retrieve(methodId: string): Promise<PaymentMethodResponse> {\n return this.request('GET', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * Update an existing payment method (e.g. update card expiry).\n *\n * @param methodId - The payment method ID to update.\n * @param params - Fields to update (card expiry, holder name, etc.).\n * @returns The updated payment method.\n */\n async update(\n methodId: string,\n params: PaymentMethodUpdateRequest,\n ): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/update`, {\n body: params,\n });\n }\n\n /**\n * Delete a saved payment method.\n *\n * @param methodId - The payment method ID to delete.\n * @returns Deletion confirmation.\n */\n async delete(methodId: string): Promise<PaymentMethodDeleteResponse> {\n return this.request('DELETE', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * List payment methods using a client secret.\n *\n * @param params - Filter by `client_secret`.\n * @returns Array of payment methods.\n */\n async list(params?: PaymentMethodListParams): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * List all saved payment methods for a customer, optionally filtered.\n *\n * @param customerId - The customer ID.\n * @param params - Optional filters: `client_secret`, `accepted_countries`, `accepted_currencies`,\n * `amount`, `recurring_enabled`, `installment_payment_enabled`, `limit`, `card_networks`.\n * @returns Customer's saved payment methods.\n *\n * @example\n * ```typescript\n * const { customer_payment_methods } = await delopay.paymentMethods.listForCustomer(\n * 'cus_123',\n * { accepted_currencies: ['EUR'], amount: 5000 },\n * );\n * ```\n */\n async listForCustomer(\n customerId: string,\n params?: CustomerPaymentMethodsListParams,\n ): Promise<CustomerPaymentMethodsListResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/payment_methods`, {\n query: params as Record<\n string,\n string | number | boolean | (string | number | boolean)[] | null | undefined\n >,\n });\n }\n\n /**\n * Set a payment method as the default for a customer.\n *\n * @param customerId - The customer ID.\n * @param methodId - The payment method ID to set as default.\n * @returns The updated payment method.\n */\n async setDefault(customerId: string, methodId: string): Promise<PaymentMethodResponse> {\n return this.request(\n 'POST',\n `/customers/${encodeURIComponent(customerId)}/payment_methods/${encodeURIComponent(methodId)}/default`,\n );\n }\n\n // --- Advanced operations (Task 3.3) ---\n\n /** Migrate a payment method. `POST /payment_methods/migrate` */\n async migrate(params: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods/migrate', { body: params });\n }\n\n /** Batch migrate payment methods. `POST /payment_methods/migrate-batch` */\n async migrateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/migrate-batch', { body: params });\n }\n\n /** Batch update payment methods. `POST /payment_methods/update-batch` */\n async updateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/update-batch', { body: params });\n }\n\n /** Batch retrieve payment methods. `GET /payment_methods/batch` */\n async batchRetrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods/batch', { query: params });\n }\n\n /** Tokenize a card. `POST /payment_methods/tokenize-card` */\n async tokenizeCard(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card', { body: params });\n }\n\n /** Batch tokenize cards. `POST /payment_methods/tokenize-card-batch` */\n async tokenizeCardBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card-batch', { body: params });\n }\n\n /** Initiate payment method collect link flow. `POST /payment_methods/collect` */\n async collect(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/collect', { body: params });\n }\n\n /** Save a payment method. `POST /payment_methods/{methodId}/save` */\n async save(methodId: string, params?: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/save`, {\n body: params,\n });\n }\n\n /** Create payment method auth link token. `POST /payment_methods/auth/link` */\n async createAuthLink(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/link', { body: params });\n }\n\n /** Exchange payment method auth token. `POST /payment_methods/auth/exchange` */\n async exchangeAuthToken(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/exchange', { body: params });\n }\n\n /** Tokenize card using existing PM. `POST /payment_methods/{methodId}/tokenize-card` */\n async tokenizeCardForMethod(\n methodId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/tokenize-card`, {\n body: params,\n });\n }\n}\n","import type {\n PaymentCreateRequest,\n PaymentListResponse,\n PaymentResponse,\n PaymentRetrieveOptions,\n PaymentUpdateRequest,\n PaymentConfirmRequest,\n PaymentCaptureRequest,\n PaymentCancelRequest,\n PaymentListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage payment intents — create, confirm, capture, cancel, and list payments. */\nexport class Payments {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payment intent.\n *\n * @param params - Payment creation parameters including amount and currency.\n * @returns The created payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.create({\n * amount: 5000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PaymentCreateRequest): Promise<PaymentResponse> {\n return this.request('POST', '/payments', { body: params });\n }\n\n /**\n * Retrieve a payment by its ID.\n *\n * @param paymentId - The unique payment intent ID.\n * @param options - Optional query flags. `force_sync` asks the backend to\n * reconcile state with the connector before returning (used to recover a\n * stuck intent when a webhook was lost). `all_keys_required` lifts the\n * backend's `should_call_connector` gate so a `requires_payment_method`\n * intent can still trigger a sync — without it the backend short-circuits\n * and returns the local snapshot. Both flags are JWT-authenticated dashboard\n * helpers; API-key callers can use them too where the backend allows.\n * @returns The payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.retrieve('pay_abc123');\n * const synced = await delopay.payments.retrieve('pay_abc123', {\n * force_sync: true,\n * all_keys_required: true,\n * });\n * ```\n */\n async retrieve(paymentId: string, options?: PaymentRetrieveOptions): Promise<PaymentResponse> {\n const path = `/payments/${encodeURIComponent(paymentId)}`;\n if (options === undefined) return this.request('GET', path);\n const query: Record<string, boolean> = {};\n if (options.force_sync !== undefined) query['force_sync'] = options.force_sync;\n if (options.all_keys_required !== undefined) {\n query['all_keys_required'] = options.all_keys_required;\n }\n if (Object.keys(query).length === 0) return this.request('GET', path);\n return this.request('GET', path, { query });\n }\n\n /**\n * Update an existing payment intent before it is confirmed.\n *\n * @param paymentId - The payment intent ID to update.\n * @param params - Fields to update (amount, currency, metadata, etc.).\n * @returns The updated payment intent.\n */\n async update(paymentId: string, params: PaymentUpdateRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}`, { body: params });\n }\n\n /**\n * Confirm a payment intent, triggering authorisation with the selected gateway.\n *\n * @param paymentId - The payment intent ID to confirm.\n * @param params - Confirmation parameters (payment method data, return URL, etc.).\n * @returns The updated payment intent.\n */\n async confirm(paymentId: string, params: PaymentConfirmRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Capture a previously authorised payment.\n *\n * @param paymentId - The payment intent ID to capture.\n * @param params - Optional capture parameters (partial capture amount, etc.).\n * @returns The updated payment intent.\n */\n async capture(paymentId: string, params?: PaymentCaptureRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/capture`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payment intent that has not yet been captured.\n *\n * @param paymentId - The payment intent ID to cancel.\n * @param params - Optional cancellation reason.\n * @returns The updated payment intent.\n */\n async cancel(paymentId: string, params?: PaymentCancelRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel`, {\n body: params,\n });\n }\n\n /**\n * List payment intents, optionally filtered by customer or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment intents.\n *\n * @example\n * ```typescript\n * const { data } = await delopay.payments.list({ customer_id: 'cus_123', limit: 25 });\n * ```\n */\n async list(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- Advanced operations (Task 3.2) ---\n\n /** Generate session tokens. `POST /payments/session_tokens` */\n async sessionTokens(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/session_tokens', { body: params });\n }\n\n /** Retrieve payment with gateway credentials. `POST /payments/sync` */\n async sync(params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', '/payments/sync', { body: params });\n }\n\n /** Cancel after partial capture. `POST /payments/{paymentId}/cancel_post_capture` */\n async cancelPostCapture(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel_post_capture`, {\n body: params,\n });\n }\n\n /** Incrementally authorize more funds. `POST /payments/{paymentId}/incremental_authorization` */\n async incrementalAuthorization(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request(\n 'POST',\n `/payments/${encodeURIComponent(paymentId)}/incremental_authorization`,\n {\n body: params,\n },\n );\n }\n\n /** Extend authorization window. `POST /payments/{paymentId}/extend_authorization` */\n async extendAuthorization(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/extend_authorization`, {\n body: params,\n });\n }\n\n /** Complete authorization. `POST /payments/{paymentId}/complete_authorize` */\n async completeAuthorize(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/complete_authorize`, {\n body: params,\n });\n }\n\n /** Dynamic tax calculation. `POST /payments/{paymentId}/calculate_tax` */\n async calculateTax(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/calculate_tax`, {\n body: params,\n });\n }\n\n /** Update payment metadata. `POST /payments/{paymentId}/update_metadata` */\n async updateMetadata(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/update_metadata`, {\n body: params,\n });\n }\n\n /** Retrieve extended card info. `GET /payments/{paymentId}/extended_card_info` */\n async extendedCardInfo(paymentId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/payments/${encodeURIComponent(paymentId)}/extended_card_info`);\n }\n\n // --- OLAP extensions (Task 4.2) ---\n\n /** List payments (profile-scoped). `GET /payments/profile/list` */\n async listByProfile(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments across all shops. `GET /payments/list-all-shops` */\n async listAllShops(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list-all-shops', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments by filter (POST body). `POST /payments/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PaymentListResponse> {\n return this.request('POST', '/payments/list', { body: params });\n }\n\n /** Get payment filter options. `POST /payments/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/filter', { body: params });\n }\n\n /** Get payment filters (v2). `GET /payments/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/v2/filter', { query: params });\n }\n\n /** Get payment aggregates. `GET /payments/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/aggregate', { query: params });\n }\n\n /** Get payment aggregates (profile-scoped). `GET /payments/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/profile/aggregate', { query: params });\n }\n\n /** Manually update payment status. `PUT /payments/{paymentId}/manual-update` */\n async manualUpdate(paymentId: string, params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('PUT', `/payments/${encodeURIComponent(paymentId)}/manual-update`, {\n body: params,\n });\n }\n\n /** Approve a payment waiting for review. `POST /payments/{paymentId}/approve` */\n async approve(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/approve`, {\n body: params,\n });\n }\n\n /** Reject a payment waiting for review. `POST /payments/{paymentId}/reject` */\n async reject(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/reject`, {\n body: params,\n });\n }\n\n /** Initiate external 3DS authentication. `POST /payments/{paymentId}/3ds/authentication` */\n async threeDsAuthentication(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/3ds/authentication`, {\n body: params,\n });\n }\n}\n","import type {\n PayoutCreateRequest,\n PayoutResponse,\n PayoutUpdateRequest,\n PayoutListParams,\n PayoutListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage payouts — fund transfers from merchant to a recipient bank account. */\nexport class Payouts {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payout.\n *\n * @param params - Payout parameters including amount, currency, and destination.\n * @returns The created payout.\n *\n * @example\n * ```typescript\n * const payout = await delopay.payouts.create({\n * amount: 10000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PayoutCreateRequest): Promise<PayoutResponse> {\n return this.request('POST', '/payouts/create', { body: params });\n }\n\n /**\n * Retrieve a payout by its ID.\n *\n * @param payoutId - The unique payout ID.\n * @returns The payout.\n */\n async retrieve(payoutId: string): Promise<PayoutResponse> {\n return this.request('GET', `/payouts/${encodeURIComponent(payoutId)}`);\n }\n\n /**\n * Update a payout before it is confirmed.\n *\n * @param payoutId - The payout ID to update.\n * @param params - Fields to update.\n * @returns The updated payout.\n */\n async update(payoutId: string, params: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}`, { body: params });\n }\n\n /**\n * Confirm a payout, triggering the actual transfer.\n *\n * @param payoutId - The payout ID to confirm.\n * @param params - Optional confirmation parameters.\n * @returns The updated payout.\n */\n async confirm(payoutId: string, params?: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payout before it is fulfilled.\n *\n * @param payoutId - The payout ID to cancel.\n * @returns The cancelled payout.\n */\n async cancel(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/cancel`);\n }\n\n /**\n * Mark a payout as fulfilled (manual confirmation of successful transfer).\n *\n * @param payoutId - The payout ID to fulfil.\n * @returns The fulfilled payout.\n */\n async fulfill(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/fulfill`);\n }\n\n /**\n * List payouts, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payouts.\n */\n async list(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.5) ---\n\n /** List payouts (profile-scoped). `GET /payouts/profile/list` */\n async listByProfile(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payouts by filter (POST body). `POST /payouts/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PayoutListResponse> {\n return this.request('POST', '/payouts/list', { body: params });\n }\n\n /** Get payout filter options. `POST /payouts/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/filter', { body: params });\n }\n\n /** Get payout filters (profile-scoped). `POST /payouts/profile/filter` */\n async getFiltersByProfile(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/profile/filter', { body: params });\n }\n\n /** Get payout aggregates. `GET /payouts/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/aggregate', { query: params });\n }\n\n /** Get payout aggregates (profile-scoped). `GET /payouts/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/profile/aggregate', { query: params });\n }\n\n /** Manually update payout status. `PUT /payouts/{payoutId}/manual-update` */\n async manualUpdate(payoutId: string, params: Record<string, unknown>): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { PollStatusResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Poll {\n constructor(private readonly request: RequestFn) {}\n\n async getStatus(pollId: string): Promise<PollStatusResponse> {\n return this.request('GET', `/poll/status/${encodeURIComponent(pollId)}`);\n }\n}\n","import type {\n ProfileAcquirerCreateRequest,\n ProfileAcquirerResponse,\n ProfileAcquirerUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ProfileAcquirers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: ProfileAcquirerCreateRequest): Promise<ProfileAcquirerResponse> {\n return this.request('POST', '/profile_acquirer', { body: params });\n }\n\n async update(\n profileId: string,\n profileAcquirerId: string,\n params: ProfileAcquirerUpdateRequest,\n ): Promise<ProfileAcquirerResponse> {\n return this.request(\n 'POST',\n `/profile_acquirer/${encodeURIComponent(profileId)}/${encodeURIComponent(profileAcquirerId)}`,\n {\n body: params,\n },\n );\n }\n}\n","import type { ProfileCreateRequest, ProfileResponse, ProfileUpdateRequest } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Profiles {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ProfileCreateRequest): Promise<ProfileResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/business_profile`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n async list(accountId: string): Promise<ProfileResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/business_profile`);\n }\n\n async update(\n accountId: string,\n profileId: string,\n params: ProfileUpdateRequest,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Toggle extended card info for a profile. `POST /account/{accountId}/business_profile/{profileId}/toggle_extended_card_info` */\n async toggleExtendedCardInfo(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_extended_card_info`,\n );\n }\n\n /** Toggle connector agnostic MIT. `POST /account/{accountId}/business_profile/{profileId}/toggle_connector_agnostic_mit` */\n async toggleConnectorAgnosticMit(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_connector_agnostic_mit`,\n );\n }\n}\n","import type {\n ProjectCreateRequest,\n ProjectResponse,\n ProjectUpdateRequest,\n ProjectStatsResponse,\n MerchantOverviewResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage projects — optional grouping layers that contain one or more shops. */\nexport class Projects {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new project under a merchant account.\n *\n * @param params - Project creation parameters (name, description, etc.).\n * @param merchantId - The merchant account ID that owns this project.\n * @returns The created project.\n *\n * @example\n * ```typescript\n * const project = await delopay.projects.create({ name: 'EU Stores' }, 'merch_123');\n * ```\n */\n async create(params: ProjectCreateRequest, merchantId: string): Promise<ProjectResponse> {\n return this.request('POST', '/projects', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Retrieve a project by its ID.\n *\n * @param projectId - The unique project ID.\n * @param merchantId - Optional merchant scope. When provided, sent as\n * `?merchant_id=…` — required by dashboards that authenticate with a JWT\n * spanning multiple merchants and need to disambiguate which one this\n * call applies to. API-key callers can omit it.\n * @returns The project.\n */\n async retrieve(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('GET', path);\n return this.request('GET', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * Update a project's details.\n *\n * @param projectId - The project ID to update.\n * @param params - Fields to update.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The updated project.\n */\n async update(\n projectId: string,\n params: ProjectUpdateRequest,\n merchantId?: string,\n ): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('PUT', path, { body: params });\n return this.request('PUT', path, { body: params, query: { merchant_id: merchantId } });\n }\n\n /**\n * Delete a project.\n *\n * @param projectId - The project ID to delete.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The deleted project object.\n */\n async delete(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('DELETE', path);\n return this.request('DELETE', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * List all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of projects.\n */\n async list(merchantId: string): Promise<ProjectResponse[]> {\n return this.request('GET', '/projects/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get aggregate payment statistics across all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Project statistics.\n */\n async stats(merchantId: string): Promise<ProjectStatsResponse> {\n return this.request('GET', '/projects/stats', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get a high-level overview (volume, counts, top connectors) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Merchant overview data.\n */\n async overview(merchantId: string): Promise<MerchantOverviewResponse> {\n return this.request('GET', '/projects/overview', {\n query: { merchant_id: merchantId },\n });\n }\n}\n","import type {\n RefundCreateRequest,\n RefundResponse,\n RefundUpdateRequest,\n RefundListParams,\n RefundListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage refunds for completed payments. */\nexport class Refunds {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a refund for a payment.\n *\n * @param params - Refund parameters, including the required `payment_id` and optional amount.\n * @returns The created refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.create({\n * payment_id: 'pay_abc123',\n * amount: 2500, // partial refund of 25.00 EUR\n * });\n * ```\n */\n async create(params: RefundCreateRequest): Promise<RefundResponse> {\n return this.request('POST', '/refunds', { body: params });\n }\n\n /**\n * Retrieve a refund by its ID.\n *\n * @param refundId - The unique refund ID.\n * @returns The refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.retrieve('ref_abc123');\n * ```\n */\n async retrieve(refundId: string): Promise<RefundResponse> {\n return this.request('GET', `/refunds/${encodeURIComponent(refundId)}`);\n }\n\n /**\n * Update the reason or metadata on an existing refund.\n *\n * @param refundId - The refund ID to update.\n * @param params - Fields to update (reason, metadata).\n * @returns The updated refund.\n */\n async update(refundId: string, params: RefundUpdateRequest): Promise<RefundResponse> {\n return this.request('POST', `/refunds/${encodeURIComponent(refundId)}`, { body: params });\n }\n\n /**\n * List refunds, optionally filtered by payment, status, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of refunds.\n */\n async list(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/list', { body: params });\n }\n\n // --- OLAP extensions (Task 4.3) ---\n\n /** List refunds (profile-scoped). `POST /refunds/profile/list` */\n async listByProfile(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/profile/list', { body: params });\n }\n\n /** Get refund filter options. `POST /refunds/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/refunds/filter', { body: params });\n }\n\n /** Get refund filters (v2). `GET /refunds/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/v2/filter', { query: params });\n }\n\n /** Get refund aggregates. `GET /refunds/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/aggregate', { query: params });\n }\n\n /** Get refund aggregates (profile-scoped). `GET /refunds/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/profile/aggregate', { query: params });\n }\n\n /** Manually update refund status. `PUT /refunds/{refundId}/manual-update` */\n async manualUpdate(refundId: string, params: Record<string, unknown>): Promise<RefundResponse> {\n return this.request('PUT', `/refunds/${encodeURIComponent(refundId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { RelayRequest, RelayResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Relay {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: RelayRequest): Promise<RelayResponse> {\n return this.request('POST', '/relay', { body: params });\n }\n\n async retrieve(relayId: string): Promise<RelayResponse> {\n return this.request('GET', `/relay/${encodeURIComponent(relayId)}`);\n }\n}\n","import type {\n LinkedRoutingConfigRetrieveResponse,\n MerchantRoutingAlgorithm,\n ProfileDefaultRoutingConfig,\n RoutableConnectorChoice,\n RoutingActivatePayload,\n RoutingConfigCreateRequest,\n RoutingDeactivateRequest,\n RoutingDictionary,\n RoutingDictionaryRecord,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create and manage payment routing algorithms.\n *\n * Routing rules determine which gateway connector handles each payment based on\n * card type, currency, amount, or custom conditions.\n */\nexport class Routing {\n readonly decision: RoutingDecisionManager;\n\n constructor(private readonly request: RequestFn) {\n this.decision = new RoutingDecisionManager(request);\n }\n\n /**\n * Create a new routing algorithm.\n *\n * @param params - Routing algorithm definition (rule-based, priority, or volume-based).\n * @returns Metadata record for the created routing configuration. The full\n * algorithm body is not echoed back — use `retrieve(id)` if you need it.\n *\n * @example\n * ```typescript\n * const config = await delopay.routing.create({\n * name: 'EU Priority',\n * algorithm: { type: 'priority', data: [{ connector: 'stripe' }] },\n * });\n * ```\n */\n async create(params: RoutingConfigCreateRequest): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing', { body: params });\n }\n\n /**\n * Retrieve a routing algorithm by its ID.\n *\n * @param algorithmId - The routing algorithm ID.\n * @returns The full routing configuration including the algorithm body.\n */\n async retrieve(algorithmId: string): Promise<MerchantRoutingAlgorithm> {\n return this.request('GET', `/routing/${encodeURIComponent(algorithmId)}`);\n }\n\n /**\n * Activate a routing algorithm, making it the active routing strategy.\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param algorithmId - The routing algorithm ID to activate.\n * @param params - Optional activation payload (e.g. `transaction_type`).\n */\n async activate(\n algorithmId: string,\n params: RoutingActivatePayload = {},\n ): Promise<RoutingDictionaryRecord> {\n return this.request('POST', `/routing/${encodeURIComponent(algorithmId)}/activate`, {\n body: params,\n });\n }\n\n /**\n * Deactivate the currently active routing algorithm (falls back to default routing).\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param params - Optional deactivation payload.\n */\n async deactivate(params: RoutingDeactivateRequest = {}): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing/deactivate', { body: params });\n }\n\n /**\n * List all routing algorithms for the current merchant.\n *\n * @returns The routing dictionary (records + currently active id).\n */\n async list(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing');\n }\n\n // --- Advanced operations (Task 3.4) ---\n\n /** Get active routing config. `GET /routing/active` */\n async getActive(): Promise<LinkedRoutingConfigRetrieveResponse> {\n return this.request('GET', '/routing/active');\n }\n\n /** Update default routing config. `POST /routing/default` */\n async updateDefault(params: Record<string, unknown>): Promise<RoutableConnectorChoice[]> {\n return this.request('POST', '/routing/default', { body: params });\n }\n\n /** Retrieve default config for profiles. `GET /routing/default/profile` */\n async getDefaultProfile(): Promise<RoutableConnectorChoice[] | ProfileDefaultRoutingConfig[]> {\n return this.request('GET', '/routing/default/profile');\n }\n\n /** Update default config for a profile. `POST /routing/default/profile/{profileId}` */\n async updateDefaultProfile(\n profileId: string,\n params: Record<string, unknown>,\n ): Promise<ProfileDefaultRoutingConfig> {\n return this.request('POST', `/routing/default/profile/${encodeURIComponent(profileId)}`, {\n body: params,\n });\n }\n\n /** List routing configs for profile. `GET /routing/list/profile` */\n async listForProfile(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing/list/profile');\n }\n\n /** Evaluate a routing rule. `POST /routing/rule/evaluate` */\n async evaluateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/evaluate', { body: params });\n }\n\n /** Migrate routing rules for profile. `POST /routing/rule/migrate` */\n async migrateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/migrate', { body: params });\n }\n\n /** Evaluate routing for a payment. `POST /routing/evaluate` */\n async evaluate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/evaluate', { body: params });\n }\n\n /** Update gateway scores for dynamic routing. `POST /routing/feedback` */\n async feedback(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/feedback', { body: params });\n }\n}\n\nclass RoutingDecisionManager {\n constructor(private readonly request: RequestFn) {}\n\n /** Upsert decision manager config. `PUT /routing/decision` */\n async upsert(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision', { body: params });\n }\n\n /** Retrieve decision manager config. `GET /routing/decision` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision');\n }\n\n /** Delete decision manager config. `DELETE /routing/decision` */\n async delete(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision');\n }\n\n /** Upsert surcharge decision config. `PUT /routing/decision/surcharge` */\n async upsertSurcharge(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision/surcharge', { body: params });\n }\n\n /** Retrieve surcharge decision config. `GET /routing/decision/surcharge` */\n async retrieveSurcharge(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision/surcharge');\n }\n\n /** Delete surcharge decision config. `DELETE /routing/decision/surcharge` */\n async deleteSurcharge(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision/surcharge');\n }\n}\n","import type {\n ShopCreateRequest,\n ShopResponse,\n ShopUpdateRequest,\n GatewayConnectRequest,\n GatewayResponse,\n ProfileLogoUploadResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage gateway connections for a specific shop. */\nclass ShopGateways {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Connect a payment gateway to a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param params - Gateway connector credentials and configuration.\n * @returns The created gateway connection.\n */\n async connect(\n merchantId: string,\n shopId: string,\n params: GatewayConnectRequest,\n ): Promise<GatewayResponse> {\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n { body: params },\n );\n }\n\n /**\n * List all gateway connections for a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns Array of gateway connections.\n */\n async list(merchantId: string, shopId: string): Promise<GatewayResponse[]> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n );\n }\n\n /**\n * Disconnect a gateway from a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @param gatewayId - The gateway connector ID to remove.\n * @returns The removed gateway connection.\n */\n async disconnect(\n merchantId: string,\n shopId: string,\n gatewayId: string,\n ): Promise<GatewayResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways/${encodeURIComponent(gatewayId)}`,\n );\n }\n}\n\n/**\n * Create and manage shops (business profiles) within a merchant account.\n *\n * Each shop can have its own gateway connections, routing rules, and fee schedules.\n */\nexport class Shops {\n /** Gateway connection management for shops. */\n readonly gateways: ShopGateways;\n\n constructor(private readonly request: RequestFn) {\n this.gateways = new ShopGateways(request);\n }\n\n /**\n * Create a new shop under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Shop creation parameters (name, etc.).\n * @returns The created shop.\n *\n * @example\n * ```typescript\n * const shop = await delopay.shops.create('merch_123', { profile_name: 'EU Store' });\n * ```\n */\n async create(merchantId: string, params: ShopCreateRequest): Promise<ShopResponse> {\n return this.request('POST', `/shops/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve a shop by its ID.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns The shop.\n */\n async retrieve(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * Update a shop's configuration.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to update.\n * @param params - Fields to update.\n * @returns The updated shop.\n */\n async update(\n merchantId: string,\n shopId: string,\n params: ShopUpdateRequest,\n ): Promise<ShopResponse> {\n return this.request(\n 'PUT',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n { body: params },\n );\n }\n\n /**\n * Delete a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to delete.\n * @returns The deleted shop object.\n */\n async delete(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * List all shops under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of shops.\n */\n async list(merchantId: string): Promise<ShopResponse[]> {\n return this.request('GET', `/shops/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Upload a logo file for a shop. The file is stored in Delopay's configured\n * object store and a public HTTPS URL is returned. This method does NOT write\n * the URL into the shop's `payment_link_config.default_config.logo` — call\n * `shops.update` afterwards with the returned `logo_url` to persist the change.\n *\n * Accepts PNG, JPEG, WebP or SVG. The file must be ≤ 1 MiB.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param file - The logo file (Blob / File in browsers).\n * @returns The publicly-reachable URL of the uploaded logo.\n *\n * @example\n * ```typescript\n * const { logo_url } = await delopay.shops.uploadLogo('merch_1', 'pro_1', file);\n * await delopay.shops.update('merch_1', 'pro_1', {\n * payment_link_config: { default_config: { logo: logo_url } },\n * });\n * ```\n */\n async uploadLogo(\n merchantId: string,\n shopId: string,\n file: Blob,\n ): Promise<ProfileLogoUploadResponse> {\n const form = new FormData();\n form.append('file', file);\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/logo`,\n { body: form },\n );\n }\n}\n","import type {\n StripeConnectAccountRequest,\n StripeConnectAccountResponse,\n StripeConnectLinkRequest,\n StripeConnectLinkResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class StripeConnect {\n constructor(private readonly request: RequestFn) {}\n\n async createAccount(params: StripeConnectAccountRequest): Promise<StripeConnectAccountResponse> {\n return this.request('POST', '/connector_onboarding/stripe/accounts', { body: params });\n }\n\n async createAccountLink(params: StripeConnectLinkRequest): Promise<StripeConnectLinkResponse> {\n return this.request('POST', '/connector_onboarding/stripe/account_links', { body: params });\n }\n\n // --- Generic connector onboarding (Task 4.11) ---\n\n /** Get onboarding action URL. `POST /connector_onboarding/action_url` */\n async getActionUrl(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/action_url', { body: params });\n }\n\n /** Sync onboarding status. `POST /connector_onboarding/sync` */\n async syncOnboarding(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/sync', { body: params });\n }\n\n /** Reset tracking ID. `POST /connector_onboarding/reset_tracking_id` */\n async resetTrackingId(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/reset_tracking_id', { body: params });\n }\n}\n","import type { ThreeDsRuleExecuteRequest, ThreeDsRuleResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ThreeDsRules {\n constructor(private readonly request: RequestFn) {}\n\n async execute(params: ThreeDsRuleExecuteRequest): Promise<ThreeDsRuleResponse> {\n return this.request('POST', '/three_ds_decision/execute', { body: params });\n }\n}\n","import type {\n SignUpRequest,\n SignUpWithMerchantRequest,\n SignInRequest,\n AuthResponse,\n UserResponse,\n ChangePasswordRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n SwitchMerchantRequest,\n SwitchProfileRequest,\n InviteUsersRequest,\n InviteUsersResponse,\n TotpResponse,\n RecoveryCodesResponse,\n PhoneOtpRequest,\n PhoneOtpResponse,\n PhoneOtpVerifyRequest,\n PhoneOtpVerifyResponse,\n UpdateUserDetailsRequest,\n FromEmailRequest,\n TokenResponse,\n VerifyTotpRequest,\n Terminate2faQueryParams,\n ListInvitableRolesParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Users {\n constructor(private readonly request: RequestFn) {}\n\n async signUp(params: SignUpRequest | SignUpWithMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signup', { body: params });\n }\n\n async signIn(params: SignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signin', { body: params });\n }\n\n async signOut(): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/signout');\n }\n\n async getDetails(): Promise<UserResponse> {\n return this.request('GET', '/user');\n }\n\n async update(params: UpdateUserDetailsRequest): Promise<UserResponse> {\n return this.request('POST', '/user/update', { body: params });\n }\n\n async changePassword(params: ChangePasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/change_password', { body: params });\n }\n\n async rotatePassword(params: ResetPasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/rotate_password', { body: params });\n }\n\n async forgotPassword(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/forgot_password', { body: params });\n }\n\n /**\n * Commit a password reset.\n *\n * The caller is responsible for obtaining a `SinglePurposeToken` with\n * `purpose: reset_password` via the email-token exchange + TOTP flow\n * (see `fromEmail`, `beginTotp`, `updateTotp`/`verifyTotp`,\n * `generateRecoveryCodes`, `terminate2fa`) and setting it on the client\n * via `setJwtToken` before calling this method. `body.token` must still\n * be the original `EmailToken` from the reset-link URL — the handler\n * decodes it a second time to find the user.\n */\n async resetPassword(params: ResetPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/reset_password', { body: params });\n }\n\n /**\n * Exchange an email-link token (`EmailToken`) for a single-purpose JWT\n * that drives the next step of the flow (TOTP, verify email, accept\n * invitation, etc.). No authentication required.\n *\n * The `token_type` in the response tells you which step to run next.\n */\n async fromEmail(params: FromEmailRequest): Promise<TokenResponse> {\n return this.request('POST', '/user/from_email', { body: params });\n }\n\n async verifyEmail(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/verify_email', { body: params });\n }\n\n async sendVerificationEmail(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/verify_email_request', { body: params });\n }\n\n async createMerchant(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/create_merchant', { body: params });\n }\n\n async switchMerchant(params: SwitchMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/merchant', { body: params });\n }\n\n async switchProfile(params: SwitchProfileRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/profile', { body: params });\n }\n\n async listMerchants(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/merchant');\n }\n\n async listProfiles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/profile');\n }\n\n async inviteUsers(params: InviteUsersRequest[]): Promise<InviteUsersResponse[]> {\n return this.request('POST', '/user/user/invite_multiple', { body: params });\n }\n\n async acceptInvitation(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept', { body: params });\n }\n\n /**\n * Start TOTP setup (or no-op if already set).\n *\n * Returns the QR-code payload when the user has no TOTP configured yet;\n * returns `{ secret: null }` when the user is already set up (caller\n * should then prompt for a 6-digit code and call `verifyTotp`).\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async beginTotp(): Promise<TotpResponse> {\n return this.request('GET', '/user/2fa/totp/begin');\n }\n\n /**\n * Verify a 6-digit TOTP code for a user whose TOTP is already set up.\n * Marks the code as used in Redis so subsequent flow steps can advance.\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async verifyTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/2fa/totp/verify', { body: params });\n }\n\n async resetTotp(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/totp/reset');\n }\n\n async generateRecoveryCodes(): Promise<RecoveryCodesResponse> {\n return this.request('GET', '/user/2fa/recovery_code/generate');\n }\n\n async verifyRecoveryCode(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/2fa/recovery_code/verify', { body: params });\n }\n\n async sendPhoneOtp(params: PhoneOtpRequest): Promise<PhoneOtpResponse> {\n return this.request('POST', '/user/phone/send-otp', { body: params });\n }\n\n async verifyPhoneOtp(params: PhoneOtpVerifyRequest): Promise<PhoneOtpVerifyResponse> {\n return this.request('POST', '/user/phone/verify-otp', { body: params });\n }\n\n async getRoleFromToken(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role');\n }\n\n async listRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list');\n }\n\n async listUserRoles(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user', { body: params });\n }\n\n async updateUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/update_role', { body: params });\n }\n\n async deleteUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/user/user/delete', { body: params });\n }\n\n // --- Advanced methods (Task 4.7) ---\n\n /** Sign in (v2). `POST /user/v2/signin` */\n async signInV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/v2/signin', { body: params });\n }\n\n /** Sign in via OIDC. `POST /user/oidc` */\n async signInOidc(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/oidc', { body: params });\n }\n\n /** Transfer key. `POST /user/key/transfer` */\n async transferKey(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/key/transfer', { body: params });\n }\n\n /** List invitations. `GET /user/list/invitation` */\n async listInvitations(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/invitation');\n }\n\n /** Check 2FA status. `GET /user/2fa` */\n async check2faStatus(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa');\n }\n\n /** Check 2FA status (v2). `GET /user/2fa/v2` */\n async check2faStatusV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/v2');\n }\n\n /**\n * Finish first-time TOTP setup: commit the secret generated by `beginTotp`\n * against a 6-digit code from the user's authenticator app.\n *\n * `PUT /user/2fa/totp/verify`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async updateTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/2fa/totp/verify', { body: params });\n }\n\n /**\n * Complete the TOTP step and advance to the next flow stage (e.g.\n * `reset_password`). Returns a fresh single-purpose token with the\n * next `token_type`.\n *\n * `GET /user/2fa/terminate`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async terminate2fa(query?: Terminate2faQueryParams): Promise<TokenResponse> {\n if (query === undefined) {\n return this.request('GET', '/user/2fa/terminate');\n }\n return this.request('GET', '/user/2fa/terminate', {\n query: query as Record<string, boolean | undefined>,\n });\n }\n\n /** Create auth method. `POST /user/auth` */\n async createAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth', { body: params });\n }\n\n /** Update auth method. `PUT /user/auth` */\n async updateAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/auth', { body: params });\n }\n\n /** List auth methods. `GET /user/auth/list` */\n async listAuthMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/auth/list');\n }\n\n /** Get auth URL. `GET /user/auth/url` */\n async getAuthUrl(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/auth/url');\n }\n\n /** Select auth method. `POST /user/auth/select` */\n async selectAuth(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth/select', { body: params });\n }\n\n /** List user roles (v2). `POST /user/user/v2` */\n async listUserRolesV2(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user/v2', { body: params });\n }\n\n /** List users in lineage. `GET /user/user/list` */\n async listUsersInLineage(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/list');\n }\n\n /** List users in lineage (v2). `GET /user/user/v2/list` */\n async listUsersInLineageV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/v2/list');\n }\n\n /** Accept invitation (v2). `POST /user/user/invite/accept/v2` */\n async acceptInvitationV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept/v2', { body: params });\n }\n\n /** Resend invite. `POST /user/user/resend_invite` */\n async resendInvite(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/resend_invite', { body: params });\n }\n\n /** Get role (v2). `GET /user/role/v2` */\n async getRoleV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v2');\n }\n\n /** Get role (v3). `GET /user/role/v3` */\n async getRoleV3(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v3');\n }\n\n /** List roles (v2). `GET /user/role/v2/list` */\n async listRolesV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/v2/list');\n }\n\n /**\n * List invitable roles. `GET /user/role/list/invite`\n *\n * @param params - Optional query. `entity_type` scopes the role list to a\n * particular entity (e.g. `'merchant'` to list only merchant-scoped roles\n * when inviting employees from the merchant dashboard).\n */\n async listInvitableRoles(params?: ListInvitableRolesParams): Promise<Record<string, unknown>[]> {\n if (params === undefined || params.entity_type === undefined) {\n return this.request('GET', '/user/role/list/invite');\n }\n return this.request('GET', '/user/role/list/invite', {\n query: { entity_type: params.entity_type },\n });\n }\n\n /** List updatable roles. `GET /user/role/list/update` */\n async listUpdatableRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list/update');\n }\n\n /** Get permission info. `GET /user/permission_info` */\n async getPermissionInfo(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/permission_info');\n }\n\n /** Get module list. `GET /user/module/list` */\n async getModuleList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/module/list');\n }\n\n /** Get parent list. `GET /user/parent/list` */\n async getParentList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/parent/list');\n }\n\n /** Create a role. `POST /user/role` */\n async createRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/role', { body: params });\n }\n\n /** Get role by ID. `GET /user/role/{roleId}` */\n async getRoleById(roleId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/user/role/${encodeURIComponent(roleId)}`);\n }\n\n /** Update role by ID. `PUT /user/role/{roleId}` */\n async updateRole(\n roleId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('PUT', `/user/role/${encodeURIComponent(roleId)}`, { body: params });\n }\n}\n","import type {\n ApplePayVerificationRequest,\n ApplePayVerificationResponse,\n ApplePayVerifiedDomainsResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Verification {\n constructor(private readonly request: RequestFn) {}\n\n async registerApplePayDomains(\n merchantId: string,\n params: ApplePayVerificationRequest,\n ): Promise<ApplePayVerificationResponse> {\n return this.request('POST', `/verify/apple_pay/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n async getApplePayVerifiedDomains(\n params: Record<string, string>,\n ): Promise<ApplePayVerifiedDomainsResponse> {\n return this.request('GET', '/verify/applepay_verified_domains', {\n query: params,\n });\n }\n}\n","/**\n * A parsed and verified Delopay webhook event.\n *\n * The `type` field identifies the event (e.g. `'payment_succeeded'`).\n * Specific event payload shapes are nested under `data`.\n */\nexport interface WebhookEvent {\n /** Event type identifier, e.g. `'payment_succeeded'` or `'refund_succeeded'`. */\n type: string;\n /** Event payload. Shape depends on `type`. */\n data: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction hexToBytes(hex: string): Uint8Array | null {\n if (hex.length === 0 || hex.length % 2 !== 0) return null;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n const byte = Number.parseInt(hex.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) return null;\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport const Webhooks = {\n /**\n * Verify the signature of an incoming Delopay webhook and return the parsed event.\n *\n * Delopay signs each outgoing webhook with HMAC-SHA512 over the raw request body,\n * using your shop's webhook secret (the *payment response hash key* configured on\n * the shop). The hex-encoded digest is delivered in the `X-Webhook-Signature-512`\n * HTTP header.\n *\n * Uses the Web Crypto API (`globalThis.crypto.subtle`), so it runs unchanged in\n * Node 18+, modern browsers, Deno, Bun, and edge runtimes (Cloudflare Workers, Vercel Edge).\n *\n * Available as a static property on the `Delopay` class\n * (`Delopay.webhooks.verify`) and does not require a client instance.\n *\n * @param rawBody - The raw request body. Pass the original bytes (`Uint8Array` /\n * `Buffer`) when possible; if you pass a string, it must be the unmodified UTF-8\n * text of the request body. Do **not** parse it before passing.\n * @param signatureHeader - The value of the `X-Webhook-Signature-512` HTTP header.\n * @param secret - Your shop's webhook signing secret.\n * @returns Promise that resolves to the parsed webhook event.\n * @throws {Error} When the signature header is malformed or does not match the body.\n *\n * @example\n * ```typescript\n * // Express example\n * app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {\n * try {\n * const event = await Delopay.webhooks.verify(\n * req.body, // Buffer from express.raw()\n * req.header('x-webhook-signature-512') ?? '',\n * process.env.DELOPAY_WEBHOOK_SECRET!,\n * );\n * console.log(event.type, event.data);\n * res.sendStatus(200);\n * } catch {\n * res.status(400).send('Invalid signature');\n * }\n * });\n * ```\n */\n async verify(\n rawBody: string | Uint8Array,\n signatureHeader: string,\n secret: string,\n ): Promise<WebhookEvent> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new Error(\n 'Web Crypto unavailable: Delopay.webhooks.verify requires globalThis.crypto.subtle (Node 18+, modern browsers, Workers, Deno)',\n );\n }\n\n const signatureBytes = hexToBytes(signatureHeader.trim());\n if (!signatureBytes) {\n throw new Error('Invalid webhook signature format');\n }\n\n const encoder = new TextEncoder();\n const bodyBytes = typeof rawBody === 'string' ? encoder.encode(rawBody) : rawBody;\n\n // `TextEncoder.encode` returns `Uint8Array<ArrayBufferLike>` in current lib.dom.d.ts,\n // but `crypto.subtle.*` wants `BufferSource` (backed by `ArrayBuffer`). At runtime the\n // underlying buffer is always an `ArrayBuffer` — cast to quiet the type checker.\n const asBufferSource = (bytes: Uint8Array): BufferSource => bytes as unknown as BufferSource;\n const key = await subtle.importKey(\n 'raw',\n asBufferSource(encoder.encode(secret)),\n { name: 'HMAC', hash: 'SHA-512' },\n false,\n ['verify'],\n );\n\n const valid = await subtle.verify(\n 'HMAC',\n key,\n asBufferSource(signatureBytes),\n asBufferSource(bodyBytes),\n );\n\n if (!valid) {\n throw new Error('Invalid webhook signature');\n }\n\n const bodyText =\n typeof rawBody === 'string' ? rawBody : new TextDecoder('utf-8').decode(rawBody);\n return JSON.parse(bodyText) as WebhookEvent;\n },\n};\n","import type { RequestFn } from '../client';\n\ntype AnalyticsScope = 'merchant' | 'org' | 'profile';\n\nclass AnalyticsDomain {\n constructor(\n private readonly request: RequestFn,\n private readonly domain: string,\n ) {}\n\n /** Get metrics. `POST /analytics/v1/metrics/{domain}` */\n async metrics(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n // Metrics handlers on the backend take `web::Json<[T; 1]>` — i.e. a one-element array.\n // filters/report/sankey/search take `web::Json<T>`. Don't unify without re-checking the Rust side.\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}`, {\n body: [params],\n });\n }\n\n /** Get filters. `POST /analytics/v1/filters/{domain}` */\n async filters(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/filters/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Generate report. `POST /analytics/v1/report/{domain}` */\n async report(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/report/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Sankey chart data. `POST /analytics/v1/metrics/{domain}/sankey` */\n async sankey(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}/sankey`, {\n body: params,\n });\n }\n}\n\nexport class Analytics {\n readonly payments: AnalyticsDomain;\n readonly refunds: AnalyticsDomain;\n readonly disputes: AnalyticsDomain;\n readonly authEvents: AnalyticsDomain;\n readonly sdkEvents: AnalyticsDomain;\n readonly frm: AnalyticsDomain;\n readonly apiEvents: AnalyticsDomain;\n readonly routing: AnalyticsDomain;\n\n constructor(private readonly request: RequestFn) {\n this.payments = new AnalyticsDomain(request, 'payments');\n this.refunds = new AnalyticsDomain(request, 'refunds');\n this.disputes = new AnalyticsDomain(request, 'disputes');\n this.authEvents = new AnalyticsDomain(request, 'auth_events');\n this.sdkEvents = new AnalyticsDomain(request, 'sdk_events');\n this.frm = new AnalyticsDomain(request, 'frm');\n this.apiEvents = new AnalyticsDomain(request, 'api_events');\n this.routing = new AnalyticsDomain(request, 'routing');\n }\n\n /** Global search. `POST /analytics/v1/search` */\n async search(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/search', { body: params });\n }\n\n /** Domain-specific search. `POST /analytics/v1/search/{domain}` */\n async searchDomain(\n domain: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/analytics/v1/search/${encodeURIComponent(domain)}`, {\n body: params,\n });\n }\n\n /** Get analytics info. `GET /analytics/v1/{domain}/info` */\n async getInfo(domain: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/analytics/v1/${encodeURIComponent(domain)}/info`);\n }\n\n /** Get API event logs. `GET /analytics/v1/api_event_logs` */\n async apiEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/api_event_logs', { query: params });\n }\n\n /** Get SDK event logs. `POST /analytics/v1/sdk_event_logs` */\n async sdkEventLogs(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/sdk_event_logs', { body: params });\n }\n\n /** Get connector event logs. `GET /analytics/v1/connector_event_logs` */\n async connectorEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/connector_event_logs', { query: params });\n }\n\n /** Get routing event logs. `GET /analytics/v1/routing_event_logs` */\n async routingEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/routing_event_logs', { query: params });\n }\n\n /** Get outgoing webhook event logs. `GET /analytics/v1/outgoing_webhook_event_logs` */\n async outgoingWebhookEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/outgoing_webhook_event_logs', { query: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class AnalyticsDashboard {\n constructor(private readonly request: RequestFn) {}\n\n /** Get analytics dashboard data. `GET /analytics-dashboard` */\n async retrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics-dashboard', { query: params });\n }\n\n /** Generate analytics dashboard report. `POST /analytics-dashboard` */\n async generate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics-dashboard', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Cards {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a card. `POST /cards/create` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/create', { body: params });\n }\n\n /** Update a card. `POST /cards/update` */\n async update(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/update', { body: params });\n }\n\n /** Retrieve card info by BIN. `GET /cards/{bin}` */\n async retrieve(bin: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/cards/${encodeURIComponent(bin)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Export {\n constructor(private readonly request: RequestFn) {}\n\n /** Export transactions. `POST /export/transactions` */\n async transactions(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/export/transactions', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class FeatureMatrix {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve the feature matrix. `GET /feature_matrix` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/feature_matrix');\n }\n\n /**\n * Retrieve the feature matrix scoped to a merchant. Beta connectors\n * are filtered against the merchant's allowlist so the dashboard only\n * surfaces connectors the merchant can actually attach.\n * `GET /feature_matrix/{merchantId}`\n */\n async retrieveForMerchant(merchantId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/feature_matrix/${encodeURIComponent(merchantId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Files {\n constructor(private readonly request: RequestFn) {}\n\n /** Upload a file. `POST /files` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/files', { body: params });\n }\n\n /** Retrieve/download a file. `GET /files/{fileId}` */\n async retrieve(fileId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/files/${encodeURIComponent(fileId)}`);\n }\n\n /** Delete a file. `DELETE /files/{fileId}` */\n async delete(fileId: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Forex {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve forex rates. `GET /forex/rates` */\n async getRates(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/rates', { query: params });\n }\n\n /** Convert from minor currency. `GET /forex/convert_from_minor` */\n async convertFromMinor(\n params: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/convert_from_minor', { query: params });\n }\n}\n","import type { RegionCreateRequest, RegionUpdateRequest, RegionResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Regions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a region. `POST /regions` */\n async create(params: RegionCreateRequest): Promise<RegionResponse> {\n return this.request('POST', '/regions', { body: params });\n }\n\n /** Retrieve a region by ID. `GET /regions/{regionId}` */\n async retrieve(regionId: string): Promise<RegionResponse> {\n return this.request('GET', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** Update a region. `PUT /regions/{regionId}` */\n async update(regionId: string, params: RegionUpdateRequest): Promise<RegionResponse> {\n return this.request('PUT', `/regions/${encodeURIComponent(regionId)}`, { body: params });\n }\n\n /** Delete a region. `DELETE /regions/{regionId}` */\n async delete(regionId: string): Promise<RegionResponse> {\n return this.request('DELETE', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** List all regions. `GET /regions/list` */\n async list(): Promise<RegionResponse[]> {\n return this.request('GET', '/regions/list');\n }\n}\n","import type {\n SubscriptionCreateRequest,\n SubscriptionUpdateRequest,\n SubscriptionResponse,\n SubscriptionListParams,\n SubscriptionListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Subscriptions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create and immediately confirm a subscription. `POST /subscriptions` */\n async createAndConfirm(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions', { body: params });\n }\n\n /** Create a subscription (without confirming). `POST /subscriptions/create` */\n async create(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions/create', { body: params });\n }\n\n /** Retrieve a subscription by ID. `GET /subscriptions/{subscriptionId}` */\n async retrieve(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('GET', `/subscriptions/${encodeURIComponent(subscriptionId)}`);\n }\n\n /** Confirm a subscription. `POST /subscriptions/{subscriptionId}/confirm` */\n async confirm(\n subscriptionId: string,\n params?: Record<string, unknown>,\n ): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/confirm`, {\n body: params,\n });\n }\n\n /** Update a subscription. `PUT /subscriptions/{subscriptionId}/update` */\n async update(\n subscriptionId: string,\n params: SubscriptionUpdateRequest,\n ): Promise<SubscriptionResponse> {\n return this.request('PUT', `/subscriptions/${encodeURIComponent(subscriptionId)}/update`, {\n body: params,\n });\n }\n\n /** List subscriptions. `GET /subscriptions/list` */\n async list(params?: SubscriptionListParams): Promise<SubscriptionListResponse> {\n return this.request('GET', '/subscriptions/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get subscription estimate. `GET /subscriptions/estimate` */\n async getEstimate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/estimate', { query: params });\n }\n\n /** Get subscription items. `GET /subscriptions/items` */\n async getItems(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/items', { query: params });\n }\n\n /** Pause a subscription. `POST /subscriptions/{subscriptionId}/pause` */\n async pause(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/pause`);\n }\n\n /** Resume a subscription. `POST /subscriptions/{subscriptionId}/resume` */\n async resume(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/resume`);\n }\n\n /** Cancel a subscription. `POST /subscriptions/{subscriptionId}/cancel` */\n async cancel(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`);\n }\n}\n","import { DelopayError, DelopayAuthenticationError } from './error';\nimport { ApiKeys } from './resources/apiKeys';\nimport { Authentication } from './resources/authentication';\nimport { Billing } from './resources/billing';\nimport { Blocklist } from './resources/blocklist';\nimport { Connectors } from './resources/connectors';\nimport { Customers } from './resources/customers';\nimport { Disputes } from './resources/disputes';\nimport { EphemeralKeys } from './resources/ephemeralKeys';\nimport { Events } from './resources/events';\nimport { Fees } from './resources/fees';\nimport { Mandates } from './resources/mandates';\nimport { MerchantAccounts } from './resources/merchantAccounts';\nimport { PaymentLinks } from './resources/paymentLinks';\nimport { PaymentMethods } from './resources/paymentMethods';\nimport { Payments } from './resources/payments';\nimport { Payouts } from './resources/payouts';\nimport { Poll } from './resources/poll';\nimport { ProfileAcquirers } from './resources/profileAcquirers';\nimport { Profiles } from './resources/profiles';\nimport { Projects } from './resources/projects';\nimport { Refunds } from './resources/refunds';\nimport { Relay } from './resources/relay';\nimport { Routing } from './resources/routing';\nimport { Shops } from './resources/shops';\nimport { StripeConnect } from './resources/stripeConnect';\nimport { ThreeDsRules } from './resources/threeDsRules';\nimport { Users } from './resources/users';\nimport { Verification } from './resources/verification';\nimport { Webhooks } from './resources/webhooks';\nimport { Analytics } from './resources/analytics';\nimport { AnalyticsDashboard } from './resources/analyticsDashboard';\nimport { Cards } from './resources/cards';\nimport { Export } from './resources/export';\nimport { FeatureMatrix } from './resources/featureMatrix';\nimport { Files } from './resources/files';\nimport { Forex } from './resources/forex';\nimport { Regions } from './resources/regions';\nimport { Subscriptions } from './resources/subscriptions';\n\nconst PRODUCTION_URL = 'https://api.delopay.net';\nconst SANDBOX_URL = 'https://sandbox.delopay.net';\n\nconst MAX_RAW_BODY_BYTES = 2048;\nconst MAX_RETRY_AFTER_MS = 30_000;\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const trimmed = header.trim();\n const seconds = Number(trimmed);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n }\n const date = Date.parse(trimmed);\n if (Number.isFinite(date)) {\n const delta = date - Date.now();\n return delta > 0 ? Math.min(delta, MAX_RETRY_AFTER_MS) : 0;\n }\n return null;\n}\n\nfunction truncateRawBody(raw: string): string | undefined {\n if (!raw) return undefined;\n return raw.length > MAX_RAW_BODY_BYTES ? raw.slice(0, MAX_RAW_BODY_BYTES) + '…' : raw;\n}\n\nfunction findIdempotencyKey(headers: Record<string, string>): string | undefined {\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'idempotency-key') return v;\n }\n return undefined;\n}\n\ninterface CombinedSignal {\n signal: AbortSignal;\n dispose: () => void;\n}\n\nfunction noop(): void {\n // Intentionally empty: no listeners registered, nothing to clean up.\n}\n\nfunction combineSignals(signals: AbortSignal[]): CombinedSignal {\n const controller = new AbortController();\n const listeners: { signal: AbortSignal; handler: () => void }[] = [];\n const dispose = () => {\n for (const { signal, handler } of listeners) {\n signal.removeEventListener('abort', handler);\n }\n listeners.length = 0;\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n dispose();\n return { signal: controller.signal, dispose: noop };\n }\n const handler = () => {\n controller.abort(signal.reason);\n dispose();\n };\n signal.addEventListener('abort', handler, { once: true });\n listeners.push({ signal, handler });\n }\n return { signal: controller.signal, dispose };\n}\n\n/**\n * Events emitted by the debug logger.\n * - `request` — about to send a request (`method`, `url`, `path`)\n * - `response` — response received (`status`, `method`, `path`, `requestId?`)\n * - `retry` — about to retry after a transient failure (`attempt`, `maxRetries`, `method`, `path`)\n */\nexport type DelopayLogger = (\n event: 'request' | 'response' | 'retry',\n data: Record<string, unknown>,\n) => void;\n\n/**\n * Configuration options for the Delopay client.\n */\nexport interface DelopayOptions {\n /** Use the sandbox environment (`https://sandbox.delopay.net`). Defaults to `false` (production). */\n sandbox?: boolean;\n /** Override the base URL entirely. Takes precedence over `sandbox`. */\n baseUrl?: string;\n /** Request timeout in milliseconds. Defaults to `30000` (30 seconds). */\n timeout?: number;\n /**\n * Maximum number of automatic retries for transient failures (5xx, timeout, network errors).\n * Retries use exponential backoff. Set to `0` to disable. Defaults to `2`.\n * Only idempotent-safe requests (GET, DELETE, and requests with an `Idempotency-Key` header) are retried.\n */\n maxRetries?: number;\n /** Enable debug logging of requests and responses. Defaults to `false`. */\n debug?: boolean;\n /**\n * Custom logger for debug events (`request`, `response`, `retry`). When omitted,\n * debug output is written to `console.log`. Has no effect unless `debug` is `true`.\n * Useful for routing SDK logs through pino, winston, or similar structured loggers.\n */\n logger?: DelopayLogger;\n}\n\nconst SENSITIVE_QUERY_KEYS = new Set([\n 'client_secret',\n 'ephemeral_key',\n 'api_key',\n 'publishable_key',\n]);\n\n/**\n * Return a copy of `url` with the values of known-sensitive query parameters\n * replaced by `REDACTED`, leaving the rest of the query string intact.\n * Used only to sanitize URLs before they hit debug logs.\n */\nfunction redactUrlForLogging(url: string): string {\n const qIdx = url.indexOf('?');\n if (qIdx === -1) return url;\n const base = url.slice(0, qIdx);\n const query = url.slice(qIdx + 1);\n const parts = query.split('&').map((pair) => {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) return pair;\n const key = pair.slice(0, eqIdx);\n if (SENSITIVE_QUERY_KEYS.has(decodeURIComponent(key).toLowerCase())) {\n return `${key}=REDACTED`;\n }\n return pair;\n });\n return `${base}?${parts.join('&')}`;\n}\n\n/**\n * Low-level options forwarded to a single HTTP request.\n */\nexport interface RequestOptions {\n /** Request body, serialised as JSON. */\n body?: unknown;\n /**\n * Query-string parameters. `undefined` and `null` values are omitted.\n * Array values are emitted as repeated keys (`?tag=a&tag=b`) — not comma-joined.\n */\n query?: Record<\n string,\n string | number | boolean | null | undefined | (string | number | boolean)[]\n >;\n /** Additional HTTP headers merged with the default `api-key` header. */\n headers?: Record<string, string>;\n /** Override the client-level timeout for this request, in milliseconds. */\n timeout?: number;\n /**\n * Caller-provided `AbortSignal`. Aborting it cancels the in-flight request and rejects\n * with a `DelopayError` carrying code `'ABORTED'`. Combined with the per-request timeout.\n */\n signal?: AbortSignal;\n}\n\nexport type RequestFn = <T>(method: string, path: string, options?: RequestOptions) => Promise<T>;\n\n/**\n * Delopay API client.\n *\n * Instantiate once with your API key and reuse across your application.\n * All resource sub-clients (payments, refunds, customers, …) are exposed\n * as properties on the instance.\n *\n * @example\n * ```typescript\n * const delopay = new Delopay('sk_live_...', { sandbox: false });\n * const payment = await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * ```\n */\nexport class Delopay {\n /** Utility for verifying incoming webhook signatures (static, no instance needed). */\n static webhooks = Webhooks;\n\n /** The resolved base URL used for all API requests. */\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly debug: boolean;\n private readonly logger?: DelopayLogger;\n private jwtToken?: string;\n\n // Merchant-facing\n readonly payments: Payments;\n readonly refunds: Refunds;\n readonly customers: Customers;\n readonly paymentMethods: PaymentMethods;\n readonly paymentLinks: PaymentLinks;\n readonly mandates: Mandates;\n readonly disputes: Disputes;\n readonly payouts: Payouts;\n readonly ephemeralKeys: EphemeralKeys;\n readonly events: Events;\n readonly poll: Poll;\n\n // Connector / routing\n readonly connectors: Connectors;\n readonly routing: Routing;\n readonly profiles: Profiles;\n readonly shops: Shops;\n readonly profileAcquirers: ProfileAcquirers;\n\n // Authentication & verification\n readonly authentication: Authentication;\n readonly verification: Verification;\n\n // Dashboard / internal\n readonly users: Users;\n readonly apiKeys: ApiKeys;\n readonly billing: Billing;\n readonly blocklist: Blocklist;\n readonly fees: Fees;\n readonly merchantAccounts: MerchantAccounts;\n readonly projects: Projects;\n readonly relay: Relay;\n readonly stripeConnect: StripeConnect;\n readonly threeDsRules: ThreeDsRules;\n\n // New resources (Phases 3-4)\n readonly subscriptions: Subscriptions;\n readonly files: Files;\n readonly export: Export;\n readonly forex: Forex;\n readonly regions: Regions;\n readonly analytics: Analytics;\n readonly analyticsDashboard: AnalyticsDashboard;\n readonly featureMatrix: FeatureMatrix;\n readonly cards: Cards;\n\n /**\n * Create a new Delopay client.\n *\n * @param apiKey - Your Delopay API key (e.g. `sk_live_...` or `sk_test_...`).\n * Pass an empty string or omit for JWT-only usage (e.g. dashboard apps).\n * @param options - Optional configuration (sandbox mode, base URL override, timeout).\n */\n constructor(apiKey?: string, options?: DelopayOptions) {\n this.apiKey = apiKey ?? '';\n this.timeout = options?.timeout ?? 30_000;\n this.maxRetries = options?.maxRetries ?? 2;\n this.debug = options?.debug ?? false;\n if (options?.logger !== undefined) this.logger = options.logger;\n\n if (options?.baseUrl !== undefined) {\n this.baseUrl = options.baseUrl;\n } else if (options?.sandbox) {\n this.baseUrl = SANDBOX_URL;\n } else {\n this.baseUrl = PRODUCTION_URL;\n }\n\n const request = this.request.bind(this) as RequestFn;\n\n // JWT auth methods are defined below (setJwtToken / clearJwtToken)\n\n // Merchant-facing\n this.payments = new Payments(request);\n this.refunds = new Refunds(request);\n this.customers = new Customers(request);\n this.paymentMethods = new PaymentMethods(request);\n this.paymentLinks = new PaymentLinks(request);\n this.mandates = new Mandates(request);\n this.disputes = new Disputes(request);\n this.payouts = new Payouts(request);\n this.ephemeralKeys = new EphemeralKeys(request);\n this.events = new Events(request);\n this.poll = new Poll(request);\n\n // Connector / routing\n this.connectors = new Connectors(request);\n this.routing = new Routing(request);\n this.profiles = new Profiles(request);\n this.shops = new Shops(request);\n this.profileAcquirers = new ProfileAcquirers(request);\n\n // Authentication & verification\n this.authentication = new Authentication(request);\n this.verification = new Verification(request);\n\n // Dashboard / internal\n this.users = new Users(request);\n this.apiKeys = new ApiKeys(request);\n this.billing = new Billing(request);\n this.blocklist = new Blocklist(request);\n this.fees = new Fees(request);\n this.merchantAccounts = new MerchantAccounts(request);\n this.projects = new Projects(request);\n this.relay = new Relay(request);\n this.stripeConnect = new StripeConnect(request);\n this.threeDsRules = new ThreeDsRules(request);\n\n // New resources (Phases 3-4)\n this.subscriptions = new Subscriptions(request);\n this.files = new Files(request);\n this.export = new Export(request);\n this.forex = new Forex(request);\n this.regions = new Regions(request);\n this.analytics = new Analytics(request);\n this.analyticsDashboard = new AnalyticsDashboard(request);\n this.featureMatrix = new FeatureMatrix(request);\n this.cards = new Cards(request);\n }\n\n /**\n * Set a JWT token for subsequent requests.\n * When set, requests use `Authorization: Bearer <token>` instead of `api-key`.\n * Useful after `users.signIn()` returns a JWT for dashboard operations.\n */\n setJwtToken(token: string): void {\n this.jwtToken = token;\n }\n\n /**\n * Clear the JWT token, reverting to API key authentication.\n */\n clearJwtToken(): void {\n this.jwtToken = undefined;\n }\n\n /**\n * Make a raw HTTP request to the Delopay API.\n *\n * You rarely need to call this directly — prefer the typed resource methods.\n * Use it only for endpoints not yet covered by a resource class.\n *\n * @param method - HTTP method (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`).\n * @param path - API path starting with `/` (e.g. `/payments`).\n * @param options - Optional body, query parameters, and headers.\n * @returns Parsed JSON response body typed as `T`.\n * @throws {DelopayAuthenticationError} On 401 responses.\n * @throws {DelopayError} On all other non-2xx responses, timeouts, and network errors.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v !== undefined && v !== null) params.append(key, String(v));\n }\n } else {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n ...(this.jwtToken\n ? { Authorization: `Bearer ${this.jwtToken}` }\n : this.apiKey\n ? { 'api-key': this.apiKey }\n : {}),\n ...options?.headers,\n };\n\n // FormData / Blob / ArrayBuffer / URLSearchParams pass through unchanged so callers\n // can send multipart uploads. The runtime (browser or Node 18+ fetch) sets the\n // appropriate Content-Type including the multipart boundary, so we don't touch it.\n const isRawBody =\n options?.body !== undefined &&\n options?.body !== null &&\n (options.body instanceof FormData ||\n options.body instanceof Blob ||\n options.body instanceof ArrayBuffer ||\n options.body instanceof URLSearchParams);\n\n if (options?.body && !isRawBody) {\n headers['Content-Type'] = 'application/json';\n }\n\n const idempotencyKey = findIdempotencyKey(headers)?.trim();\n const isRetryable =\n method === 'GET' ||\n method === 'DELETE' ||\n (idempotencyKey !== undefined && idempotencyKey !== '');\n\n // Serialize body once so circular-reference errors surface immediately and big payloads\n // aren't re-stringified on every retry attempt. Raw bodies pass through untouched.\n let serializedBody: BodyInit | undefined;\n if (isRawBody) {\n serializedBody = options?.body as BodyInit;\n } else if (options?.body) {\n serializedBody = JSON.stringify(options.body);\n }\n\n const callerSignal = options?.signal;\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n\n const timeoutMs = options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n let retryAfterOverrideMs: number | null = null;\n\n const safeUrl = () => redactUrlForLogging(url);\n const emit = (event: 'request' | 'response' | 'retry', data: Record<string, unknown>) => {\n if (!this.debug) return;\n if (this.logger) {\n this.logger(event, data);\n return;\n }\n if (event === 'request')\n console.log(`[delopay] ${data.method as string} ${data.url as string}`);\n else if (event === 'response')\n console.log(\n `[delopay] ${data.status as number} ${data.method as string} ${data.path as string}`,\n );\n else\n console.log(\n `[delopay] retry ${data.attempt as number}/${data.maxRetries as number} ${data.method as string} ${data.path as string}`,\n );\n };\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const base = Math.min(500 * 2 ** (attempt - 1), 5000);\n // Full jitter: pick uniformly in [0, base) to avoid synchronized retry storms.\n const jittered = Math.random() * base;\n const delay = Math.max(retryAfterOverrideMs ?? 0, jittered);\n retryAfterOverrideMs = null;\n await new Promise((resolve) => setTimeout(resolve, delay));\n emit('retry', { attempt, maxRetries: this.maxRetries, method, path });\n }\n\n const timeoutCtrl = new AbortController();\n const timeoutId = setTimeout(() => timeoutCtrl.abort(), timeoutMs);\n const combined = combineSignals(\n callerSignal ? [timeoutCtrl.signal, callerSignal] : [timeoutCtrl.signal],\n );\n\n try {\n emit('request', { method, url: safeUrl(), path });\n\n const response = await fetch(url, {\n method,\n headers,\n body: serializedBody,\n signal: combined.signal,\n });\n\n const requestId =\n response.headers?.get('x-request-id') ?? response.headers?.get('x-trace-id') ?? undefined;\n\n emit('response', { status: response.status, method, path, requestId });\n\n if (!response.ok) {\n const rawBody = await response.text().catch(() => '');\n let parsed: Record<string, unknown> = {};\n if (rawBody) {\n try {\n parsed = JSON.parse(rawBody) as Record<string, unknown>;\n } catch {\n // non-JSON error body (HTML from a proxy, truncated stream, etc.) — keep raw\n }\n }\n // API wraps errors as { error: { message, code, type, data? } } — unwrap if present\n const err = (parsed.error as Record<string, unknown>) ?? parsed;\n const message =\n (err.message as string) ?? `Request failed with status ${response.status}`;\n const code = (err.code as string) ?? '';\n const type = (err.error_type as string) ?? (err.type as string) ?? '';\n const data =\n err.data && typeof err.data === 'object' && !Array.isArray(err.data)\n ? (err.data as Record<string, unknown>)\n : undefined;\n const truncatedRaw = truncateRawBody(rawBody);\n\n if (response.status === 401) {\n throw new DelopayAuthenticationError(message, {\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n }\n\n const error = new DelopayError(message, {\n status: response.status,\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n\n // Retry on 5xx and 429 (rate limit). 4xx other than 429 are not transient.\n const isTransientStatus = response.status >= 500 || response.status === 429;\n if (isTransientStatus && isRetryable && attempt < this.maxRetries) {\n if (response.status === 429) {\n retryAfterOverrideMs = parseRetryAfter(response.headers?.get('retry-after') ?? null);\n }\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n } catch (err) {\n if (err instanceof DelopayError || err instanceof DelopayAuthenticationError) {\n throw err;\n }\n if (err instanceof Error && err.name === 'AbortError') {\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n lastError = new DelopayError('Request timed out', {\n status: 0,\n code: 'TIMEOUT',\n type: 'timeout_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n if (err instanceof TypeError) {\n lastError = new DelopayError(`Network error: ${err.message}`, {\n status: 0,\n code: 'NETWORK',\n type: 'network_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n combined.dispose();\n }\n }\n\n throw lastError;\n }\n\n /**\n * Auto-paginate a list endpoint. Yields items one by one, fetching\n * the next page automatically when the current one is exhausted.\n *\n * @param listFn - A function that takes `{ limit, offset }` and returns `{ data: T[] }` or `T[]`.\n * @param params - Additional parameters to pass to every page request.\n * @param pageSize - Number of items per page. Defaults to `50`.\n *\n * @example\n * ```typescript\n * for await (const payment of delopay.paginate(\n * (p) => delopay.payments.list(p),\n * )) {\n * console.log(payment.payment_id);\n * }\n * ```\n */\n async *paginate<T, P extends Record<string, unknown>>(\n listFn: (params: P & { limit: number; offset: number }) => Promise<{ data: T[] } | T[]>,\n params?: P,\n pageSize = 50,\n ): AsyncGenerator<T> {\n let offset = 0;\n while (true) {\n const result = await listFn({\n ...((params ?? {}) as P),\n limit: pageSize,\n offset,\n });\n const items = Array.isArray(result) ? result : result.data;\n if (items.length === 0) break;\n for (const item of items) {\n yield item;\n }\n if (items.length < pageSize) break;\n offset += items.length;\n }\n }\n}\n"],"mappings":"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","names":[]}