squarefi-bff-api-module 1.36.37 → 1.36.38

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.
@@ -1543,7 +1543,13 @@ export interface paths {
1543
1543
  * @description Uploads KYC files against a wallet via `multipart/form-data`, with no
1544
1544
  * cardholder involved. The form field name is the document type
1545
1545
  * (`selfie`, `gov_id_front`, `gov_id_back`); one file per type, 5MB max
1546
- * each, formats png/jpeg/pdf.
1546
+ * each, photos only (png/jpeg).
1547
+ *
1548
+ * Send the file the camera produced, unchanged: cropping, resizing or
1549
+ * re-encoding a document photo can make the vendor's tampering check
1550
+ * answer `Forgery attempt has been made.` — a verdict far worse than the
1551
+ * poor quality it was meant to fix. Too small to read means retake it
1552
+ * (card filling the frame, straight, no glare), not improve the file.
1547
1553
  *
1548
1554
  * Send one file per request to get per-file progress and retry a single
1549
1555
  * file, or send several at once. The response returns an `id` per file;
@@ -1878,11 +1884,12 @@ export interface paths {
1878
1884
  */
1879
1885
  cardholder_relationship?: "EMPLOYEE" | "CONTRACTOR";
1880
1886
  /**
1881
- * @description Identity document type (KYC vendors)
1887
+ * @description Identity document type (KYC vendors). Which values are accepted depends on the country that issued the document — read cardholder_requirements.country_rules[gov_id_country].gov_id_types instead of hardcoding the list (id_card_cn is the mainland China resident ID, id_card_hk the HKID).
1888
+ *
1882
1889
  * @enum {string}
1883
1890
  */
1884
- gov_id_type?: "passport" | "id_card" | "driving_license";
1885
- /** @description Identity document number */
1891
+ gov_id_type?: "passport" | "id_card" | "driving_license" | "residence_permit_eu" | "residence_permit_ae" | "id_card_cn" | "id_card_hk";
1892
+ /** @description Identity document number (passport / driving licence / national ID). */
1886
1893
  gov_id_number?: string;
1887
1894
  /**
1888
1895
  * @description Issuing country of the identity document (2-3 letter code)
@@ -1896,9 +1903,16 @@ export interface paths {
1896
1903
  gov_id_issuance_date?: string;
1897
1904
  /**
1898
1905
  * Format: date
1899
- * @description Identity document expiry date (YYYY-MM-DD)
1906
+ * @description Identity document expiry date (YYYY-MM-DD). Required by the vendor review even for a document issued for life (an Indonesian KTP, "SEUMUR HIDUP"), which has no expiry printed on it — send the issuance date plus 100 years.
1907
+ *
1900
1908
  */
1901
1909
  gov_id_expiration_date?: string;
1910
+ /**
1911
+ * @description Tax identifier of the cardholder, separate from the document number. Required by Interlace CONSUMER programs when nationality is USA, where it must be a valid SSN (9 digits or XXX-XX-XXXX).
1912
+ *
1913
+ * @example 123-45-6789
1914
+ */
1915
+ tax_identification_number?: string;
1902
1916
  /** @description Cardholder's address */
1903
1917
  address?: {
1904
1918
  /**
@@ -1913,7 +1927,11 @@ export interface paths {
1913
1927
  line2?: string;
1914
1928
  /** @example New York */
1915
1929
  city?: string;
1916
- /** @example NY */
1930
+ /**
1931
+ * @description Subdivision. Required for a US or Canadian address and must be the two-letter code (AL, ON); optional elsewhere.
1932
+ *
1933
+ * @example NY
1934
+ */
1917
1935
  state?: string;
1918
1936
  /** @example 10001 */
1919
1937
  postal_code?: string;
@@ -2261,6 +2279,16 @@ export interface paths {
2261
2279
  * **Retryable**: a failed submit leaves the draft untouched — complete the dossier and
2262
2280
  * call this endpoint again.
2263
2281
  *
2282
+ * **After a rejection**: a cardholder whose identity review came back
2283
+ * `review_status: REJECTED` or `REQUEST` (read it, with `reject_reason`, from
2284
+ * `GET /api/issuing/cardholders/{cardholder_id}`) may be submitted again. Fix what the
2285
+ * vendor named — `PATCH` the field, or upload a better photo and re-attach it via
2286
+ * `POST /cardholders/{cardholder_id}/documents`, which replaces the document of that
2287
+ * type — then call this endpoint once more. The review restarts on the vendor account the
2288
+ * person already has: the same document cannot be registered twice at the vendor, so a
2289
+ * fresh cardholder is NOT the way to retry. While a review is running, another submit is
2290
+ * refused with `409`.
2291
+ *
2264
2292
  * **Authentication**: x-api-key header required
2265
2293
  *
2266
2294
  */
@@ -2320,7 +2348,7 @@ export interface paths {
2320
2348
  "application/json": components["schemas"]["ApiErrorResponse"];
2321
2349
  };
2322
2350
  };
2323
- /** @description Cardholder is not a draft (already submitted) */
2351
+ /** @description Cardholder is live at the vendor, or its review is still running */
2324
2352
  409: {
2325
2353
  headers: {
2326
2354
  [name: string]: unknown;
@@ -5072,10 +5100,10 @@ export interface paths {
5072
5100
  *
5073
5101
  * Two-phase: the order is created in `NEW` status without touching the
5074
5102
  * balance; `POST /api/orders/{id}/approve` checks the balance, debits the
5075
- * funds and dispatches the on-chain send. If the destination address
5076
- * belongs to a wallet in the same tenant, the order is created as
5077
- * `OMNIBUS_INTERNAL_TRANSFER` (no on-chain transaction) — still `NEW` at
5078
- * create, debited + settled synchronously to `COMPLETE` at approve.
5103
+ * funds and dispatches the on-chain send. This endpoint is external-only:
5104
+ * the order always goes on-chain, even if the destination address belongs
5105
+ * to a wallet on this platform. Internal (off-chain) transfers are created
5106
+ * only through the internal transfer endpoint.
5079
5107
  *
5080
5108
  * **Prerequisites:**
5081
5109
  * - A counterparty destination of type `CRYPTO_EXTERNAL` or `CRYPTO_INTERNAL`
@@ -7355,7 +7383,7 @@ export interface components {
7355
7383
  */
7356
7384
  level?: "minimal" | "basic" | "full";
7357
7385
  /**
7358
- * @description Required field names; address fields are dotted (address.line1)
7386
+ * @description Required field names; address fields are dotted (address.line1). Interlace CONSUMER also lists gov_id_issuance_date and gov_id_expiration_date (ISO YYYY-MM-DD).
7359
7387
  * @example [
7360
7388
  * "first_name",
7361
7389
  * "last_name",
@@ -7368,6 +7396,37 @@ export interface components {
7368
7396
  required?: string[];
7369
7397
  /** @description Documents that must be attached; empty below the full level */
7370
7398
  required_documents?: ("gov_id_front" | "gov_id_back" | "selfie")[];
7399
+ /** @description Human-readable constraints the field list cannot express. Interlace CONSUMER: if nationality is USA, tax_identification_number is required and must be a valid SSN. */
7400
+ notes?: string[];
7401
+ /** @description What each country changes, keyed by ISO 3166-1 alpha-3 with a `default` entry; empty when the vendor reviews nothing. These fields stay out of `required` because they only hold once the nationality or address country is known: read the rule for the nationality the user picked (required_by_nationality), the rule for the address country (required_by_address), and the rule for the country that issued the document (gov_id_types). */
7402
+ country_rules?: {
7403
+ [key: string]: {
7404
+ /**
7405
+ * @description gov_id_type values accepted for a document issued by this country
7406
+ * @example [
7407
+ * "passport",
7408
+ * "driving_license",
7409
+ * "id_card"
7410
+ * ]
7411
+ */
7412
+ gov_id_types?: string[];
7413
+ /**
7414
+ * @description Extra fields a person of this nationality must provide
7415
+ * @example [
7416
+ * "tax_identification_number"
7417
+ * ]
7418
+ */
7419
+ required_by_nationality?: string[];
7420
+ /**
7421
+ * @description Extra fields an address in this country must carry
7422
+ * @example [
7423
+ * "address.state"
7424
+ * ]
7425
+ */
7426
+ required_by_address?: string[];
7427
+ notes?: string[];
7428
+ };
7429
+ };
7371
7430
  };
7372
7431
  /** @description Available order types */
7373
7432
  order_types?: Record<string, never>[];
@@ -406,7 +406,20 @@ export interface paths {
406
406
  * "transaction_currency": "PLN",
407
407
  * "vendor_transaction_id": "A2012189003898834946",
408
408
  * "timestamp": "2026-01-16T23:43:37.851",
409
- * "otp": null
409
+ * "otp": null,
410
+ * "cardholder": {
411
+ * "id": "uuid",
412
+ * "first_name": "Paul",
413
+ * "last_name": "Kashuba",
414
+ * "phone": "+15551234567",
415
+ * "email": "p.kashuba@gmail.com",
416
+ * "kyc_level": "basic"
417
+ * },
418
+ * "sub_account": {
419
+ * "id": "uuid",
420
+ * "balance": 181.25,
421
+ * "currency": "USD"
422
+ * }
410
423
  * },
411
424
  * "created_at": "2026-01-16T15:43:40.168+00"
412
425
  * }
@@ -4175,11 +4188,12 @@ export interface paths {
4175
4188
  */
4176
4189
  cardholder_relationship?: "EMPLOYEE" | "CONTRACTOR";
4177
4190
  /**
4178
- * @description Identity document type (KYC vendors)
4191
+ * @description Identity document type (KYC vendors). Which values are accepted depends on the country that issued the document — read cardholder_requirements.country_rules[gov_id_country].gov_id_types instead of hardcoding the list (id_card_cn is the mainland China resident ID, id_card_hk the HKID).
4192
+ *
4179
4193
  * @enum {string}
4180
4194
  */
4181
- gov_id_type?: "passport" | "id_card" | "driving_license";
4182
- /** @description Identity document number */
4195
+ gov_id_type?: "passport" | "id_card" | "driving_license" | "residence_permit_eu" | "residence_permit_ae" | "id_card_cn" | "id_card_hk";
4196
+ /** @description Identity document number (passport / driving licence / national ID). */
4183
4197
  gov_id_number?: string;
4184
4198
  /**
4185
4199
  * @description Issuing country of the identity document (2-3 letter code)
@@ -4193,9 +4207,16 @@ export interface paths {
4193
4207
  gov_id_issuance_date?: string;
4194
4208
  /**
4195
4209
  * Format: date
4196
- * @description Identity document expiry date (YYYY-MM-DD)
4210
+ * @description Identity document expiry date (YYYY-MM-DD). Required by the vendor review even for a document issued for life (an Indonesian KTP, "SEUMUR HIDUP"), which has no expiry printed on it — send the issuance date plus 100 years.
4211
+ *
4197
4212
  */
4198
4213
  gov_id_expiration_date?: string;
4214
+ /**
4215
+ * @description Tax identifier of the cardholder, separate from the document number. Required by Interlace CONSUMER programs when nationality is USA, where it must be a valid SSN (9 digits or XXX-XX-XXXX).
4216
+ *
4217
+ * @example 123-45-6789
4218
+ */
4219
+ tax_identification_number?: string;
4199
4220
  /** @description Cardholder's address */
4200
4221
  address?: {
4201
4222
  /**
@@ -4210,7 +4231,11 @@ export interface paths {
4210
4231
  line2?: string;
4211
4232
  /** @example New York */
4212
4233
  city?: string;
4213
- /** @example NY */
4234
+ /**
4235
+ * @description Subdivision. Required for a US or Canadian address and must be the two-letter code (AL, ON); optional elsewhere.
4236
+ *
4237
+ * @example NY
4238
+ */
4214
4239
  state?: string;
4215
4240
  /** @example 10001 */
4216
4241
  postal_code?: string;
@@ -4404,110 +4429,7 @@ export interface paths {
4404
4429
  };
4405
4430
  options?: never;
4406
4431
  head?: never;
4407
- /**
4408
- * Update cardholder
4409
- * @description Updates cardholder information.
4410
- *
4411
- * **Authentication**: Bearer token with x-tenant-id header required
4412
- *
4413
- * **Access Control**: Cardholder must belong to the user's wallet
4414
- *
4415
- */
4416
- patch: {
4417
- parameters: {
4418
- query?: {
4419
- /** @description Wallet ID for access validation */
4420
- wallet_id?: string;
4421
- };
4422
- header?: never;
4423
- path: {
4424
- /** @description The ID of the cardholder to update */
4425
- cardholder_id: string;
4426
- };
4427
- cookie?: never;
4428
- };
4429
- requestBody: {
4430
- content: {
4431
- "application/json": {
4432
- /** @description Cardholder's first name */
4433
- first_name?: string;
4434
- /** @description Cardholder's last name */
4435
- last_name?: string;
4436
- /**
4437
- * Format: email
4438
- * @description Cardholder's email address
4439
- */
4440
- email?: string;
4441
- /** @description Cardholder's phone number */
4442
- phone?: string;
4443
- /**
4444
- * @description Cardholder's nationality as ISO 3166-1 alpha-3 country code
4445
- * @example USA
4446
- */
4447
- nationality?: string;
4448
- /** @enum {string} */
4449
- gender?: "M" | "F";
4450
- /** @enum {string} */
4451
- cardholder_relationship?: "EMPLOYEE" | "CONTRACTOR";
4452
- /** @enum {string} */
4453
- gov_id_type?: "passport" | "id_card" | "driving_license";
4454
- gov_id_number?: string;
4455
- /** @description 2-3 letter uppercase country code */
4456
- gov_id_country?: string;
4457
- /** Format: date */
4458
- gov_id_issuance_date?: string;
4459
- /** Format: date */
4460
- gov_id_expiration_date?: string;
4461
- address?: {
4462
- line1?: string;
4463
- line2?: string;
4464
- city?: string;
4465
- state?: string;
4466
- postal_code?: string;
4467
- country?: string;
4468
- };
4469
- };
4470
- };
4471
- };
4472
- responses: {
4473
- /** @description Cardholder updated successfully */
4474
- 200: {
4475
- headers: {
4476
- [name: string]: unknown;
4477
- };
4478
- content: {
4479
- "application/json": {
4480
- /** @example true */
4481
- success?: boolean;
4482
- data?: components["schemas"]["IssuingCardholder"];
4483
- /** @example Cardholder updated successfully */
4484
- message?: string;
4485
- };
4486
- };
4487
- };
4488
- /** @description Invalid request parameters */
4489
- 400: {
4490
- headers: {
4491
- [name: string]: unknown;
4492
- };
4493
- content?: never;
4494
- };
4495
- /** @description Access denied to this cardholder */
4496
- 403: {
4497
- headers: {
4498
- [name: string]: unknown;
4499
- };
4500
- content?: never;
4501
- };
4502
- /** @description Cardholder not found */
4503
- 404: {
4504
- headers: {
4505
- [name: string]: unknown;
4506
- };
4507
- content?: never;
4508
- };
4509
- };
4510
- };
4432
+ patch?: never;
4511
4433
  trace?: never;
4512
4434
  };
4513
4435
  "/frontend/issuing/cardholders/{cardholder_id}/submit": {
@@ -4532,8 +4454,17 @@ export interface paths {
4532
4454
  * **Retryable**: a failed submit leaves the draft untouched. Nothing is rolled back,
4533
4455
  * and the same endpoint can be called again once the dossier is complete.
4534
4456
  *
4535
- * **Idempotency**: submitting an already-active cardholder returns `409
4536
- * CARDHOLDER_NOT_DRAFT` rather than registering it twice.
4457
+ * **After a rejection**: a cardholder whose identity review came back
4458
+ * `review_status: REJECTED` or `REQUEST` (read it, with `reject_reason`, from
4459
+ * `GET /frontend/issuing/cardholders/{cardholder_id}`) may be submitted again. Fix what
4460
+ * the vendor named — `PATCH` the field, or upload a better photo and re-attach it via
4461
+ * `POST /cardholders/{cardholder_id}/documents`, which replaces the document of that
4462
+ * type — then call this endpoint once more. The review restarts on the vendor account
4463
+ * the person already has: the same document cannot be registered twice at the vendor, so
4464
+ * a fresh cardholder is NOT the way to retry.
4465
+ *
4466
+ * **Idempotency**: while a review is running, or once the cardholder is live, another
4467
+ * submit returns `409 CARDHOLDER_NOT_DRAFT` rather than spending a second review.
4537
4468
  *
4538
4469
  * **Authentication**: Bearer token with x-tenant-id header required
4539
4470
  *
@@ -4592,7 +4523,7 @@ export interface paths {
4592
4523
  };
4593
4524
  content?: never;
4594
4525
  };
4595
- /** @description Cardholder is not a draft (already submitted) */
4526
+ /** @description Cardholder is live at the vendor, or its review is still running */
4596
4527
  409: {
4597
4528
  headers: {
4598
4529
  [name: string]: unknown;
@@ -4628,8 +4559,8 @@ export interface paths {
4628
4559
  * @description Uploads KYC files against a wallet via `multipart/form-data`, with no
4629
4560
  * cardholder involved — the upload step of the create flow runs before the
4630
4561
  * cardholder exists. The form field name is the document type (`selfie`,
4631
- * `gov_id_front`, `gov_id_back`); one file per type, 5MB max each, formats
4632
- * png/jpeg/pdf.
4562
+ * `gov_id_front`, `gov_id_back`); one file per type, 5MB max each, photos
4563
+ * only (png/jpeg).
4633
4564
  *
4634
4565
  * Send one file per request so the UI can show progress per file and retry
4635
4566
  * a single file. The response returns an `id` per file; pass those ids to
@@ -4640,6 +4571,14 @@ export interface paths {
4640
4571
  * boundary itself, and the file has to be appended as a `File`/`Blob`, not
4641
4572
  * as a name or a base64 string.
4642
4573
  *
4574
+ * **Send the file the camera produced, unchanged.** Do not crop, rotate,
4575
+ * resize or re-encode it on the client: the vendor's identity review runs
4576
+ * a tampering check, and a re-encoded document photo can come back as
4577
+ * `Forgery attempt has been made.` — a verdict far worse than the poor
4578
+ * quality it was meant to fix. When a photo is too small or unreadable,
4579
+ * ask the person to retake it (card filling the frame, straight, no
4580
+ * glare) instead of improving the file.
4581
+ *
4643
4582
  * An upload that is never attached is deleted by a cleanup sweep.
4644
4583
  *
4645
4584
  * **Authentication**: Bearer token with x-tenant-id header required
@@ -6743,10 +6682,13 @@ export interface paths {
6743
6682
  * the order is created in `NEW` status without touching the balance;
6744
6683
  * `POST /frontend/orders/{id}/approve` (OTP-gated, keyed on the order
6745
6684
  * id) checks the balance, debits the funds and dispatches the on-chain
6746
- * send. If the destination address belongs to a wallet in the same
6747
- * tenant, the order is created as `OMNIBUS_INTERNAL_TRANSFER` (no
6748
- * on-chain transaction) — still `NEW` at create, debited + settled
6749
- * synchronously to `COMPLETE` at approve.
6685
+ * send. This endpoint is external-only: the order always goes on-chain,
6686
+ * even if the destination address belongs to a wallet on this platform
6687
+ * (the receiver is then credited by the regular deposit flow). Internal
6688
+ * (off-chain, fee-free) transfers are created only through the internal
6689
+ * transfer endpoint — use
6690
+ * `GET /frontend/counterparty/destinations/{id}/internal-transfer` to
6691
+ * offer that option when the destination supports it.
6750
6692
  *
6751
6693
  */
6752
6694
  post: {
@@ -11695,7 +11637,7 @@ export interface paths {
11695
11637
  put?: never;
11696
11638
  /**
11697
11639
  * Send mock notification events (development only)
11698
- * @description Publishes MOCK events straight to the delivery channels so a client can verify its realtime integration: `notification.created` plus a push carrier on the personal channel, and `data.changed` on the wallet channel when `wallet_id` is passed. Nothing is stored — the mock does not appear in the inbox. Available only on development deployments.
11640
+ * @description Publishes MOCK events straight to the delivery channels so a client can verify its realtime integration: `notification.created` plus a push carrier on the personal channel, and `data.changed` on the wallet channel when `wallet_id` is passed. The mock events are not stored. Additionally, when the wallet has at least one order, a REAL `ORDER_STATUS_CHANGED` notification is produced through the regular pipeline for the wallet's newest order — it lands in the inbox of every wallet member and is delivered over realtime and push (`inbox_outcome` reports the result; `null` means no order was found). Available only on development deployments.
11699
11641
  */
11700
11642
  post: {
11701
11643
  parameters: {
@@ -11730,6 +11672,16 @@ export interface paths {
11730
11672
  notification_id?: string;
11731
11673
  /** Format: uuid */
11732
11674
  signaled_wallet_id?: string | null;
11675
+ /**
11676
+ * @description Result of the real inbox notification; null when no wallet was passed or it has no orders
11677
+ * @enum {string|null}
11678
+ */
11679
+ inbox_outcome?: "PROCESSED" | "SKIPPED_UNRESOLVED" | "SKIPPED_DUPLICATE" | null;
11680
+ /**
11681
+ * Format: uuid
11682
+ * @description Order the real notification was built from
11683
+ */
11684
+ inbox_order_uuid?: string | null;
11733
11685
  };
11734
11686
  };
11735
11687
  };
@@ -12050,9 +12002,20 @@ export interface components {
12050
12002
  cardholder_requirements?: {
12051
12003
  /** @enum {string} */
12052
12004
  level?: "minimal" | "basic" | "full";
12053
- /** @description Required field names; address fields are dotted (address.line1) */
12005
+ /** @description Required field names; address fields are dotted (address.line1). Interlace CONSUMER also lists gov_id_issuance_date and gov_id_expiration_date (ISO YYYY-MM-DD). */
12054
12006
  required?: string[];
12055
12007
  required_documents?: ("gov_id_front" | "gov_id_back" | "selfie")[];
12008
+ /** @description Human-readable constraints the field list cannot express. Interlace CONSUMER: if nationality is USA, tax_identification_number is required and must be a valid SSN. */
12009
+ notes?: string[];
12010
+ /** @description What each country changes, keyed by ISO 3166-1 alpha-3 with a `default` entry; empty when the vendor reviews nothing. These fields stay out of `required` because they only hold once the nationality or address country is known: read the rule for the nationality the user picked (required_by_nationality), the rule for the address country (required_by_address), and the rule for the country that issued the document (gov_id_types). */
12011
+ country_rules?: {
12012
+ [key: string]: {
12013
+ gov_id_types?: string[];
12014
+ required_by_nationality?: string[];
12015
+ required_by_address?: string[];
12016
+ notes?: string[];
12017
+ };
12018
+ };
12056
12019
  };
12057
12020
  /** Format: uuid */
12058
12021
  account_currency: string;
@@ -12079,7 +12042,7 @@ export interface components {
12079
12042
  } & {
12080
12043
  [key: string]: unknown;
12081
12044
  };
12082
- /** @description Merchant of a card transaction. */
12045
+ /** @description Merchant of a card transaction. Always present: a row with no merchant (top-up, withdrawal, transfer) carries empty strings, so `merchant.name` is safe to read without a guard. */
12083
12046
  TransactionMerchant: {
12084
12047
  name?: string;
12085
12048
  category_code?: string;
@@ -12270,7 +12233,19 @@ export interface components {
12270
12233
  transaction_amount?: number;
12271
12234
  /** @example USD */
12272
12235
  transaction_currency?: string;
12236
+ /** @description What actually left the card: `billing_amount` plus `fee` for a debit. Show this one when a fee sits inside the operation. */
12273
12237
  total_amount?: number;
12238
+ /** @description Fee charged inside this operation, in billing currency. 0 for vendors that bill fees as their own transactions (those arrive as separate rows with `transaction_type: FEE`). */
12239
+ fee?: number;
12240
+ /** @description Vendor's itemisation of `fee`; empty when it gave none. */
12241
+ fee_details?: {
12242
+ amount?: number;
12243
+ /** @example USD */
12244
+ currency?: string;
12245
+ /** @description Vendor's own fee code — no cross-vendor meaning. */
12246
+ type?: string | null;
12247
+ }[];
12248
+ /** @description Units of billing currency per unit of transaction currency, so `transaction_amount * conversion_rate ≈ billing_amount`. 1 when the currencies match. */
12274
12249
  conversion_rate?: number;
12275
12250
  failure_reason?: string;
12276
12251
  adjustment_type?: string | null;
@@ -12422,12 +12397,30 @@ export interface components {
12422
12397
  account_currency?: string;
12423
12398
  /** Format: uuid */
12424
12399
  destination_currency?: string;
12400
+ /** @description Settlement destination address (when the program settles to crypto) */
12401
+ destination_address?: string | null;
12402
+ /** Format: uuid */
12403
+ integration_vendor_id?: string;
12425
12404
  vendor_account_id?: string | null;
12405
+ /** @description Customer name the account is held under */
12406
+ customer_name?: string | null;
12426
12407
  /** @description Bank account details for deposits, derived from deposit_instructions. Returned null when deposits are disabled for the account. */
12427
12408
  account_details?: Record<string, never> | null;
12428
12409
  /** @description Deposit requisites (source of truth). Returned null when deposits are disabled for the account. */
12429
12410
  deposit_instructions?: Record<string, never> | null;
12430
12411
  meta?: Record<string, never> | null;
12412
+ /** @description Account currency details — present on hydrated reads (e.g. embedded in a single-order response) */
12413
+ account_currency_details?: components["schemas"]["CurrencyDetails"] | null;
12414
+ /** @description Destination currency details — present on hydrated reads (e.g. embedded in a single-order response) */
12415
+ destination_currency_details?: components["schemas"]["CurrencyDetails"] | null;
12416
+ /** @description Integration vendor details — present on hydrated reads (e.g. embedded in a single-order response) */
12417
+ integration_vendor?: {
12418
+ /** Format: uuid */
12419
+ id?: string;
12420
+ name?: string;
12421
+ code?: string;
12422
+ type?: string;
12423
+ } | null;
12431
12424
  /** Format: date-time */
12432
12425
  created_at?: string;
12433
12426
  };
@@ -12446,12 +12439,111 @@ export interface components {
12446
12439
  /** Format: uuid */
12447
12440
  destination_currency_id?: string;
12448
12441
  };
12449
- /** @description Public order metadata fields */
12442
+ /** @description Currency subset joined onto order and virtual-account reads (from the `crypto` table). */
12443
+ CurrencyDetails: {
12444
+ /** Format: uuid */
12445
+ uuid: string;
12446
+ name: string;
12447
+ symbol: string;
12448
+ icon?: string | null;
12449
+ /** @description Number of minor-unit decimals */
12450
+ decimal: number;
12451
+ };
12452
+ /** @description Public order metadata. The stored `meta` JSONB is reduced server-side to a fixed allowlist of public keys — workflow/provider internals never appear. Every field is optional: presence depends on the order type (crypto transfer, fiat off-ramp, exchange, internal transfer, card top-up, deposit). */
12450
12453
  OrderMeta: {
12451
12454
  /** @description Legacy idempotency key — null on orders created by the current flow */
12452
12455
  request_id?: string | null;
12453
- note?: string | null;
12456
+ /** @description Amount sent/received (excluding fees) */
12457
+ transaction_amount?: number | null;
12458
+ /** Format: uuid */
12459
+ transaction_amount_currency?: string | null;
12460
+ /** @description Total amount debited (including fees) */
12461
+ billing_amount?: number | null;
12462
+ /** Format: uuid */
12463
+ billing_amount_currency?: string | null;
12464
+ fee?: number | null;
12465
+ /** Format: uuid */
12466
+ fee_currency?: string | null;
12467
+ network_fee?: number | null;
12468
+ /** Format: uuid */
12469
+ network_fee_currency?: string | null;
12470
+ exchange_rate?: number | null;
12471
+ /** @description Blockchain chain ID (null for fiat orders) */
12472
+ chain_id?: number | null;
12473
+ /** @description Source crypto address */
12474
+ from_address?: string | null;
12475
+ /** @description Destination crypto address */
12476
+ to_address?: string | null;
12477
+ /** @description Destination crypto address (crypto transfers) */
12478
+ to_crypto_address?: string | null;
12479
+ /** @description Blockchain transaction id (when settled on-chain) */
12480
+ txid?: string | null;
12481
+ /** @description Blockchain transaction hash (when settled on-chain) */
12482
+ transaction_hash?: string | null;
12483
+ /** Format: uuid */
12484
+ from_currency_id?: string | null;
12485
+ /** Format: uuid */
12486
+ to_currency_id?: string | null;
12487
+ /**
12488
+ * Format: uuid
12489
+ * @description Sender wallet (internal transfers)
12490
+ */
12491
+ from_wallet_uuid?: string | null;
12492
+ /**
12493
+ * Format: uuid
12494
+ * @description Receiver wallet (internal transfers)
12495
+ */
12496
+ to_wallet_uuid?: string | null;
12497
+ /**
12498
+ * Format: uuid
12499
+ * @description Mirror-leg order id (internal transfers)
12500
+ */
12501
+ linked_order_id?: string | null;
12502
+ /**
12503
+ * Format: uuid
12504
+ * @description Mirror-leg order uuid (internal transfers)
12505
+ */
12506
+ linked_order_uuid?: string | null;
12507
+ /** @description True when the order settled as an internal (on-platform) transfer */
12508
+ is_internal?: boolean | null;
12509
+ /** Format: uuid */
12510
+ counterparty_account_id?: string | null;
12511
+ counterparty_account_name?: string | null;
12512
+ counterparty_account_nickname?: string | null;
12513
+ /** Format: uuid */
12514
+ counterparty_destination_id?: string | null;
12515
+ /** Format: uuid */
12516
+ virtual_account_id?: string | null;
12517
+ virtual_account_name?: string | null;
12518
+ /**
12519
+ * Format: uuid
12520
+ * @description Card sub-account (card top-up orders)
12521
+ */
12522
+ sub_account_id?: string | null;
12523
+ /** @description Sender details on inbound (deposit) orders, normalized to one canonical shape across rails. Keys: `profile` (sender identity), `account_information` (bank identifiers: account_number, routing_number, iban, swift_bic, sort_code, currency_code, institution_name, intermediary_institution_name), `wallet_information` (crypto counterpart on internal transfers), `reference`, `memo`. */
12524
+ originator?: {
12525
+ [key: string]: unknown;
12526
+ } | null;
12527
+ /** @description Card authorizations: card id */
12528
+ card_id?: string | null;
12529
+ /** @description Card authorizations: merchant name */
12530
+ merchant_name?: string | null;
12531
+ /** @description Card authorizations: merchant category code */
12532
+ mcc?: string | null;
12533
+ /** @description Card authorizations: amount in merchant currency */
12534
+ merchant_amount?: number | null;
12535
+ merchant_currency?: string | null;
12536
+ is_cross_currency?: boolean | null;
12537
+ fx_fee_percent?: number | null;
12538
+ fee_fiat?: number | null;
12539
+ request_type?: string | null;
12540
+ settlement_kind?: string | null;
12541
+ /** @description User-provided payment reference */
12454
12542
  reference?: string | null;
12543
+ /** @description User-provided internal note */
12544
+ note?: string | null;
12545
+ /** Format: date-time */
12546
+ completed_at?: string | null;
12455
12547
  };
12456
12548
  /** @description Order record */
12457
12549
  Order: {
@@ -12492,6 +12584,36 @@ export interface components {
12492
12584
  /** Format: uuid */
12493
12585
  sub_account_id?: string | null;
12494
12586
  info?: string | null;
12587
+ fee?: number | null;
12588
+ /** Format: uuid */
12589
+ fee_currency_id?: string | null;
12590
+ network_fee?: number | null;
12591
+ /** Format: uuid */
12592
+ network_fee_currency_id?: string | null;
12593
+ exchange_rate?: number | null;
12594
+ /** Format: uuid */
12595
+ from_currency_id?: string | null;
12596
+ /** Format: uuid */
12597
+ to_currency_id?: string | null;
12598
+ /** @description Editable free-text comment (see PUT /frontend/orders/{order_id}/comment) */
12599
+ comment?: string | null;
12600
+ /**
12601
+ * Format: uuid
12602
+ * @description user_data uuid of the last comment editor
12603
+ */
12604
+ comment_updated_by?: string | null;
12605
+ /** Format: date-time */
12606
+ comment_updated_at?: string | null;
12607
+ /** @description Async workflow run id (null for synchronous orders) */
12608
+ workflow_run_id?: string | null;
12609
+ /** @description Ledger integrity: signing nonce */
12610
+ nonce?: string | null;
12611
+ /** @description Ledger integrity: row signature */
12612
+ signature?: string | null;
12613
+ /** @description Ledger integrity: signing key version */
12614
+ sig_key_version?: string | null;
12615
+ /** @description Computed dust flag — amount below the render threshold for either currency. Returned by the list endpoint (GET /frontend/orders/wallet/{wallet_uuid}); absent from single-order reads. */
12616
+ is_threshold_amount?: boolean;
12495
12617
  meta?: components["schemas"]["OrderMeta"];
12496
12618
  /**
12497
12619
  * Format: date-time
@@ -12505,17 +12627,105 @@ export interface components {
12505
12627
  };
12506
12628
  /** @description Single-order read shape (GET /orders/id/{order_id} and GET /orders/uuid/{order_uuid}) — the base Order plus context objects hydrated from its `meta` references. */
12507
12629
  OrderDetail: components["schemas"]["Order"] & {
12630
+ /** @description Owning wallet reference */
12631
+ wallet?: {
12632
+ /** Format: uuid */
12633
+ uuid: string;
12634
+ /** Format: uuid */
12635
+ tenant_id: string;
12636
+ };
12637
+ /** @description Source currency details (resolved from `from_uuid`) */
12638
+ from_currency?: components["schemas"]["CurrencyDetails"];
12639
+ /** @description Destination currency details (resolved from `to_uuid`) */
12640
+ to_currency?: components["schemas"]["CurrencyDetails"];
12508
12641
  /** @description Virtual account referenced by the order (fiat off-ramp/on-ramp), hydrated with currency and vendor details. Absent/null when the order has no `meta.virtual_account_id`. */
12509
12642
  virtual_account?: components["schemas"]["VirtualAccount"] | null;
12510
- /** @description Raw `counterparty_destinations` row with embedded `counterparty_account`, `external_banking_data` and `external_crypto_data`. Present when the order has a `meta.counterparty_destination_id`; absent otherwise. */
12511
- counterparty_destination?: {
12512
- [key: string]: unknown;
12513
- } | null;
12514
- /** @description Documents attached to the order; empty array when none (or when document loading failed). */
12643
+ /** @description Receiver of the order. Present when the order has a `meta.counterparty_destination_id`; absent otherwise. */
12644
+ counterparty_destination?: components["schemas"]["OrderCounterpartyDestination"] | null;
12645
+ /** @description Documents attached to the order; empty array when none (or when document loading failed). Returned by GET /frontend/orders/id/{order_id} only; absent from the by-uuid read. */
12515
12646
  documents?: {
12516
12647
  [key: string]: unknown;
12517
12648
  }[];
12518
12649
  };
12650
+ /** @description Counterparty destination as embedded in single-order reads — the raw `counterparty_destinations` row with its parent account and payload rows. Distinct from the `CounterpartyDestination` shape served by the /frontend/counterparty endpoints (`external_banking_data`/`external_crypto_data` instead of `banking_data`/`crypto_data`/`internal_data`). */
12651
+ OrderCounterpartyDestination: {
12652
+ /** Format: uuid */
12653
+ id: string;
12654
+ /**
12655
+ * Format: uuid
12656
+ * @description Parent counterparty account id
12657
+ */
12658
+ counterparty_account_id: string;
12659
+ /** @description User-friendly alias */
12660
+ nickname?: string | null;
12661
+ /**
12662
+ * @description Destination / payment rail type
12663
+ * @enum {string}
12664
+ */
12665
+ type: "ACH" | "SWIFT" | "SEPA" | "CRYPTO_EXTERNAL" | "CRYPTO_INTERNAL" | "CHAPS" | "FPS" | "FEDWIRE" | "INTERNAL";
12666
+ /** Format: uuid */
12667
+ external_banking_data_id?: string | null;
12668
+ /** Format: uuid */
12669
+ external_crypto_data_id?: string | null;
12670
+ /**
12671
+ * Format: uuid
12672
+ * @description Internal-destination payload id (INTERNAL type)
12673
+ */
12674
+ internal_wallet_data_id?: string | null;
12675
+ /** @description Soft-delete flag; a deleted destination stays readable on historical orders */
12676
+ is_deleted?: boolean | null;
12677
+ /** Format: date-time */
12678
+ deleted_at?: string | null;
12679
+ /** @description Ledger integrity: signing nonce */
12680
+ nonce?: string | null;
12681
+ /** @description Ledger integrity: row signature */
12682
+ signature?: string | null;
12683
+ /** @description Ledger integrity: signing key version */
12684
+ sig_key_version?: string | null;
12685
+ /** Format: date-time */
12686
+ created_at: string;
12687
+ /** Format: date-time */
12688
+ updated_at: string;
12689
+ /** @description Parent counterparty account */
12690
+ counterparty_account?: {
12691
+ /** Format: uuid */
12692
+ id: string;
12693
+ name: string;
12694
+ type: string;
12695
+ email?: string | null;
12696
+ phone?: string | null;
12697
+ /**
12698
+ * Format: uuid
12699
+ * @description Owning wallet uuid
12700
+ */
12701
+ wallet_id?: string | null;
12702
+ };
12703
+ /** @description Banking details (bank rails); null for crypto/internal destinations */
12704
+ external_banking_data?: {
12705
+ /** Format: uuid */
12706
+ id?: string;
12707
+ account_number?: string | null;
12708
+ /** @description ABA routing number */
12709
+ routing_number?: string | null;
12710
+ bank_name?: string | null;
12711
+ swift_bic?: string | null;
12712
+ iban?: string | null;
12713
+ note?: string | null;
12714
+ /** Format: uuid */
12715
+ address_id?: string | null;
12716
+ } | null;
12717
+ /** @description Crypto address details (crypto rails); null for bank/internal destinations */
12718
+ external_crypto_data?: {
12719
+ /** Format: uuid */
12720
+ id?: string;
12721
+ /** @description Blockchain address */
12722
+ address?: string;
12723
+ /** Format: uuid */
12724
+ currency_id?: string;
12725
+ /** @description Memo/tag (XRP, XLM, …) */
12726
+ memo?: string | null;
12727
+ } | null;
12728
+ };
12519
12729
  /** @description Supporting document attached to an order at creation time (persisted to order_documents). */
12520
12730
  OrderDocumentInput: {
12521
12731
  /**
@@ -2643,10 +2643,10 @@ export interface paths {
2643
2643
  * @description Sends crypto from the wallet's omnibus balance via a counterparty
2644
2644
  * destination. Two-phase: created `NEW` without touching the balance;
2645
2645
  * `POST /admin/orders/{id}/approve` checks the balance, debits the funds
2646
- * and dispatches the on-chain send. A destination address internal to
2647
- * the tenant downgrades the order to `OMNIBUS_INTERNAL_TRANSFER` —
2648
- * still `NEW` at create, debited + settled synchronously to `COMPLETE`
2649
- * at approve.
2646
+ * and dispatches the on-chain send. This endpoint is external-only: the
2647
+ * order always goes on-chain, even if the destination address belongs to
2648
+ * a wallet on this platform. Internal (off-chain) transfers are created
2649
+ * only through the internal transfer endpoint.
2650
2650
  *
2651
2651
  */
2652
2652
  post: {
@@ -6079,11 +6079,12 @@ export interface paths {
6079
6079
  */
6080
6080
  cardholder_relationship?: "EMPLOYEE" | "CONTRACTOR";
6081
6081
  /**
6082
- * @description Identity document type (KYC vendors)
6082
+ * @description Identity document type (KYC vendors). Which values are accepted depends on the country that issued the document — read cardholder_requirements.country_rules[gov_id_country].gov_id_types instead of hardcoding the list (id_card_cn is the mainland China resident ID, id_card_hk the HKID).
6083
+ *
6083
6084
  * @enum {string}
6084
6085
  */
6085
- gov_id_type?: "passport" | "id_card" | "driving_license";
6086
- /** @description Identity document number */
6086
+ gov_id_type?: "passport" | "id_card" | "driving_license" | "residence_permit_eu" | "residence_permit_ae" | "id_card_cn" | "id_card_hk";
6087
+ /** @description Identity document number (passport / driving licence / national ID). */
6087
6088
  gov_id_number?: string;
6088
6089
  /**
6089
6090
  * @description Issuing country of the identity document (2-3 letter code)
@@ -6097,9 +6098,16 @@ export interface paths {
6097
6098
  gov_id_issuance_date?: string;
6098
6099
  /**
6099
6100
  * Format: date
6100
- * @description Identity document expiry date (YYYY-MM-DD)
6101
+ * @description Identity document expiry date (YYYY-MM-DD). Required by the vendor review even for a document issued for life (an Indonesian KTP, "SEUMUR HIDUP"), which has no expiry printed on it — send the issuance date plus 100 years.
6102
+ *
6101
6103
  */
6102
6104
  gov_id_expiration_date?: string;
6105
+ /**
6106
+ * @description Tax identifier of the cardholder, separate from the document number. Required by Interlace CONSUMER programs when nationality is USA, where it must be a valid SSN (9 digits or XXX-XX-XXXX).
6107
+ *
6108
+ * @example 123-45-6789
6109
+ */
6110
+ tax_identification_number?: string;
6103
6111
  /** @description Cardholder's address */
6104
6112
  address?: {
6105
6113
  /**
@@ -6114,7 +6122,11 @@ export interface paths {
6114
6122
  line2?: string;
6115
6123
  /** @example New York */
6116
6124
  city?: string;
6117
- /** @example NY */
6125
+ /**
6126
+ * @description Subdivision. Required for a US or Canadian address and must be the two-letter code (AL, ON); optional elsewhere.
6127
+ *
6128
+ * @example NY
6129
+ */
6118
6130
  state?: string;
6119
6131
  /** @example 10001 */
6120
6132
  postal_code?: string;
@@ -6236,67 +6248,7 @@ export interface paths {
6236
6248
  };
6237
6249
  options?: never;
6238
6250
  head?: never;
6239
- /** Update cardholder */
6240
- patch: {
6241
- parameters: {
6242
- query?: never;
6243
- header?: never;
6244
- path: {
6245
- cardholder_id: string;
6246
- };
6247
- cookie?: never;
6248
- };
6249
- requestBody: {
6250
- content: {
6251
- "application/json": {
6252
- /** Format: uuid */
6253
- wallet_id: string;
6254
- first_name?: string;
6255
- last_name?: string;
6256
- email?: string;
6257
- phone?: string;
6258
- /** @description ISO 3166-1 alpha-3 country code */
6259
- nationality?: string;
6260
- /** @enum {string} */
6261
- gender?: "M" | "F";
6262
- /** @enum {string} */
6263
- cardholder_relationship?: "EMPLOYEE" | "CONTRACTOR";
6264
- /** @enum {string} */
6265
- gov_id_type?: "passport" | "id_card" | "driving_license";
6266
- gov_id_number?: string;
6267
- /** @description 2-3 letter uppercase country code */
6268
- gov_id_country?: string;
6269
- /** Format: date */
6270
- gov_id_issuance_date?: string;
6271
- /** Format: date */
6272
- gov_id_expiration_date?: string;
6273
- address?: {
6274
- line1?: string;
6275
- line2?: string;
6276
- city?: string;
6277
- state?: string;
6278
- postal_code?: string;
6279
- country?: string;
6280
- };
6281
- };
6282
- };
6283
- };
6284
- responses: {
6285
- /** @description Cardholder updated */
6286
- 200: {
6287
- headers: {
6288
- [name: string]: unknown;
6289
- };
6290
- content: {
6291
- "application/json": {
6292
- /** @example true */
6293
- success?: boolean;
6294
- data?: components["schemas"]["Cardholder"];
6295
- };
6296
- };
6297
- };
6298
- };
6299
- };
6251
+ patch?: never;
6300
6252
  trace?: never;
6301
6253
  };
6302
6254
  "/admin/issuing/cardholders/{cardholder_id}/documents": {
@@ -6395,8 +6347,14 @@ export interface paths {
6395
6347
  * Upload KYC document files
6396
6348
  * @description Uploads KYC files against a wallet via `multipart/form-data`, with no
6397
6349
  * cardholder involved. The form field name is the document type (`selfie`,
6398
- * `gov_id_front`, `gov_id_back`); one file per type, 5MB max each, formats
6399
- * png/jpeg/pdf.
6350
+ * `gov_id_front`, `gov_id_back`); one file per type, 5MB max each, photos
6351
+ * only (png/jpeg).
6352
+ *
6353
+ * Send the file the camera produced, unchanged: cropping, resizing or
6354
+ * re-encoding a document photo can make the vendor's tampering check
6355
+ * answer `Forgery attempt has been made.` — a verdict far worse than the
6356
+ * poor quality it was meant to fix. Too small to read means retake it
6357
+ * (card filling the frame, straight, no glare), not improve the file.
6400
6358
  *
6401
6359
  * The response returns an `id` per file; pass those to
6402
6360
  * `POST /admin/issuing/cardholders/{cardholder_id}/documents` to attach
@@ -6540,6 +6498,13 @@ export interface paths {
6540
6498
  * not met; `error.details.missing` lists every field and file still needed. A failed
6541
6499
  * submit leaves the draft untouched, so it can be retried.
6542
6500
  *
6501
+ * A cardholder whose identity review came back `review_status: REJECTED` or `REQUEST`
6502
+ * (both readable, with `reject_reason`, on the cardholder) may be submitted again: fix
6503
+ * what the vendor named, replace the document if that is what it disliked, and call this
6504
+ * endpoint once more. The review restarts on the vendor account the person already has —
6505
+ * the same document cannot be registered twice at the vendor, so a fresh cardholder is
6506
+ * NOT the way to retry. While a review is running, another submit is refused with `409`.
6507
+ *
6543
6508
  */
6544
6509
  post: {
6545
6510
  parameters: {
@@ -6581,7 +6546,7 @@ export interface paths {
6581
6546
  };
6582
6547
  content?: never;
6583
6548
  };
6584
- /** @description Cardholder is not a draft (already submitted) */
6549
+ /** @description Cardholder is live at the vendor, or its review is still running */
6585
6550
  409: {
6586
6551
  headers: {
6587
6552
  [name: string]: unknown;
@@ -1969,11 +1969,16 @@ export interface components {
1969
1969
  readonly support_text?: string | null;
1970
1970
  readonly support_phone?: string | null;
1971
1971
  };
1972
+ MailingDataEntity: {
1973
+ readonly support_email?: string | null;
1974
+ };
1972
1975
  SupportedLocalesEntity: {
1973
1976
  default: string;
1974
1977
  supported: string[];
1975
1978
  };
1976
1979
  SystemConfigDto: {
1980
+ tenant_id: string;
1981
+ app_url: string | null;
1977
1982
  /** @enum {string} */
1978
1983
  default_theme_mode: "dark" | "light";
1979
1984
  enable_kyc: boolean;
@@ -1990,6 +1995,7 @@ export interface components {
1990
1995
  enable_referral_program: boolean;
1991
1996
  readonly metrics_data?: components["schemas"]["MetricsDataEntity"] | null;
1992
1997
  readonly statement_branding?: components["schemas"]["StatementBrandingEntity"] | null;
1998
+ readonly mailing_data?: components["schemas"]["MailingDataEntity"] | null;
1993
1999
  /** @enum {string} */
1994
2000
  kyc_data_provider: "persona" | "sumsub";
1995
2001
  readonly supported_locales?: components["schemas"]["SupportedLocalesEntity"] | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "squarefi-bff-api-module",
3
- "version": "1.36.37",
3
+ "version": "1.36.38",
4
4
  "description": "Squarefi BFF API client module",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",