@codespar/sdk 0.16.5 → 0.16.7
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.
- package/dist/generated/openapi.d.ts +434 -35
- package/dist/generated/openapi.d.ts.map +1 -1
- package/dist/generated/operations.d.ts +12 -0
- package/dist/generated/operations.d.ts.map +1 -1
- package/dist/generated/operations.js +2 -0
- package/dist/generated/operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -45,6 +45,70 @@ export interface paths {
|
|
|
45
45
|
patch?: never;
|
|
46
46
|
trace?: never;
|
|
47
47
|
};
|
|
48
|
+
"/.well-known/codespar-receipt-keys.json": {
|
|
49
|
+
parameters: {
|
|
50
|
+
query?: never;
|
|
51
|
+
header?: never;
|
|
52
|
+
path?: never;
|
|
53
|
+
cookie?: never;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Receipt verification keys (JWKS)
|
|
57
|
+
* @description The public half of the key that signs agentic receipts, so a party with no CodeSpar credential can check one. An agentic receipt carries two seals: `receipt_sig`, an HMAC under the consumer's own secret, which proves the payment to whoever holds that secret and to nobody else; and `receipt_sig_ed25519`, made with the key published here.
|
|
58
|
+
*
|
|
59
|
+
* To verify: take `receipt_sig_kid` from the receipt, find the key with that `kid` below, build `codespar-receipt:v1:<receipt_id>:<chain>` and check the base64url signature over those UTF-8 bytes with any Ed25519 verifier. `x` is the raw 32-byte public key, base64url (RFC 8037).
|
|
60
|
+
*
|
|
61
|
+
* Keys ROTATE and a retired key stays listed — that is what keeps an old receipt verifiable. A revoked key is removed entirely: its private half is assumed compromised, so signatures it made are worth nothing. An empty `keys` means this deployment publishes none, which is consistent with its receipts carrying a null `receipt_sig_kid`.
|
|
62
|
+
*
|
|
63
|
+
* Every `kid` names the DEPLOYMENT that minted it — `<did>#<namespace>-<n>`, and `key_namespace` repeats the namespace this document serves. A `receipt_sig_kid` that is ABSENT here therefore means the receipt came from another environment (a sandbox receipt checked against production, most often), which is `unknown_key` and NOT a tampered receipt. Before ent#1641 the id was `<did>#<n>` in every environment, so receipts sealed then carry an id that more than one document may claim; they keep verifying against the document of the environment that issued them and nowhere else.
|
|
64
|
+
*/
|
|
65
|
+
get: {
|
|
66
|
+
parameters: {
|
|
67
|
+
query?: never;
|
|
68
|
+
header?: never;
|
|
69
|
+
path?: never;
|
|
70
|
+
cookie?: never;
|
|
71
|
+
};
|
|
72
|
+
requestBody?: never;
|
|
73
|
+
responses: {
|
|
74
|
+
/** @description OK */
|
|
75
|
+
200: {
|
|
76
|
+
headers: {
|
|
77
|
+
[name: string]: unknown;
|
|
78
|
+
};
|
|
79
|
+
content: {
|
|
80
|
+
"application/json": {
|
|
81
|
+
issuer: string;
|
|
82
|
+
/** @description The deployment whose keys this document serves, and the namespace every `kid` below carries. A kid from another namespace is unknown here, not forged. */
|
|
83
|
+
key_namespace: string;
|
|
84
|
+
algorithm: string;
|
|
85
|
+
/** @description The template of the bytes a signature covers, stated so a verifier needs nothing else from us. */
|
|
86
|
+
signing_string: string;
|
|
87
|
+
keys: {
|
|
88
|
+
kid: string;
|
|
89
|
+
kty: string;
|
|
90
|
+
crv: string;
|
|
91
|
+
x: string;
|
|
92
|
+
alg: string;
|
|
93
|
+
use: string;
|
|
94
|
+
/** @description `active` or `retired`. A retired key signs nothing new. */
|
|
95
|
+
status: string;
|
|
96
|
+
created_at: string;
|
|
97
|
+
retired_at: string | null;
|
|
98
|
+
}[];
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
put?: never;
|
|
105
|
+
post?: never;
|
|
106
|
+
delete?: never;
|
|
107
|
+
options?: never;
|
|
108
|
+
head?: never;
|
|
109
|
+
patch?: never;
|
|
110
|
+
trace?: never;
|
|
111
|
+
};
|
|
48
112
|
"/.well-known/oauth-authorization-server": {
|
|
49
113
|
parameters: {
|
|
50
114
|
query?: never;
|
|
@@ -1388,6 +1452,7 @@ export interface paths {
|
|
|
1388
1452
|
content: {
|
|
1389
1453
|
"application/json": {
|
|
1390
1454
|
name: string;
|
|
1455
|
+
/** @description The event type to subscribe to. Matching is EXACT string equality — there is no prefix and no wildcard, so `commerce.payment.succeeded` does not receive `commerce.payment.received`. A name outside the list below is accepted and recorded (`trigger.event_unknown`) rather than refused, so you can subscribe ahead of a release; until something emits it the subscription simply never fires. What this build emits: approval.decided, approval.pending, commerce.account_launch_in.received, commerce.account_launch_out.received, commerce.account_status.changed, commerce.cashout.confirmed, commerce.charge.cancelled, commerce.charge.created, commerce.charge.expired, commerce.charge.expiry_notified, commerce.charge.paid, commerce.charge.payment_notified, commerce.dict_claim.cancelled, commerce.dict_claim.completed, commerce.dict_claim.confirmed, commerce.dict_claim.opened, commerce.dict_claim.waiting, commerce.internal_transfer_in.received, commerce.internal_transfer_out.received, commerce.mandate.granted, commerce.mandate.paused, commerce.mandate.resumed, commerce.mandate.revoked, commerce.onboarding.backgroundcheck_approved, commerce.onboarding.backgroundcheck_pending, commerce.onboarding.backgroundcheck_rejected, commerce.onboarding.documentscopy_approved, commerce.onboarding.documentscopy_pending, commerce.onboarding.documentscopy_processing, commerce.onboarding.documentscopy_rejected, commerce.onboarding.proposal_approved, commerce.onboarding.proposal_processing_documentscopy, commerce.onboarding.proposal_rejected, commerce.payment.failed, commerce.payment.pending, commerce.payment.received, commerce.payment.refunded, commerce.payment.succeeded, commerce.payment.updated, commerce.pix_out.failed, commerce.pix_out.succeeded, commerce.pix_out.unconfirmed, commerce.pix_reversal_in.received, commerce.pix_reversal_out.received, commerce.rinne.observed, commerce.spend.failed, commerce.spend.settled, commerce.ted_in.succeeded, dda.boleto.registered, dda.subscription.activated, dda.subscription.failed, proxy_call.failed, proxy_call.succeeded, session.closed, system.health.degraded, system.health.recovered, tool_call.failed, tool_call.succeeded, trigger.paused_automatically, trigger.test_fire, user.signed_up. */
|
|
1391
1456
|
event: string;
|
|
1392
1457
|
server_id?: string;
|
|
1393
1458
|
/** Format: uri */
|
|
@@ -1505,6 +1570,7 @@ export interface paths {
|
|
|
1505
1570
|
content: {
|
|
1506
1571
|
"application/json": {
|
|
1507
1572
|
name: string;
|
|
1573
|
+
/** @description The event type to subscribe to. Matching is EXACT string equality — there is no prefix and no wildcard, so `commerce.payment.succeeded` does not receive `commerce.payment.received`. A name outside the list below is accepted and recorded (`trigger.event_unknown`) rather than refused, so you can subscribe ahead of a release; until something emits it the subscription simply never fires. What this build emits: approval.decided, approval.pending, commerce.account_launch_in.received, commerce.account_launch_out.received, commerce.account_status.changed, commerce.cashout.confirmed, commerce.charge.cancelled, commerce.charge.created, commerce.charge.expired, commerce.charge.expiry_notified, commerce.charge.paid, commerce.charge.payment_notified, commerce.dict_claim.cancelled, commerce.dict_claim.completed, commerce.dict_claim.confirmed, commerce.dict_claim.opened, commerce.dict_claim.waiting, commerce.internal_transfer_in.received, commerce.internal_transfer_out.received, commerce.mandate.granted, commerce.mandate.paused, commerce.mandate.resumed, commerce.mandate.revoked, commerce.onboarding.backgroundcheck_approved, commerce.onboarding.backgroundcheck_pending, commerce.onboarding.backgroundcheck_rejected, commerce.onboarding.documentscopy_approved, commerce.onboarding.documentscopy_pending, commerce.onboarding.documentscopy_processing, commerce.onboarding.documentscopy_rejected, commerce.onboarding.proposal_approved, commerce.onboarding.proposal_processing_documentscopy, commerce.onboarding.proposal_rejected, commerce.payment.failed, commerce.payment.pending, commerce.payment.received, commerce.payment.refunded, commerce.payment.succeeded, commerce.payment.updated, commerce.pix_out.failed, commerce.pix_out.succeeded, commerce.pix_out.unconfirmed, commerce.pix_reversal_in.received, commerce.pix_reversal_out.received, commerce.rinne.observed, commerce.spend.failed, commerce.spend.settled, commerce.ted_in.succeeded, dda.boleto.registered, dda.subscription.activated, dda.subscription.failed, proxy_call.failed, proxy_call.succeeded, session.closed, system.health.degraded, system.health.recovered, tool_call.failed, tool_call.succeeded, trigger.paused_automatically, trigger.test_fire, user.signed_up. */
|
|
1508
1574
|
event: string;
|
|
1509
1575
|
server_id?: string;
|
|
1510
1576
|
/** Format: uri */
|
|
@@ -4241,6 +4307,165 @@ export interface paths {
|
|
|
4241
4307
|
patch?: never;
|
|
4242
4308
|
trace?: never;
|
|
4243
4309
|
};
|
|
4310
|
+
"/v1/audit-events/verify": {
|
|
4311
|
+
parameters: {
|
|
4312
|
+
query?: never;
|
|
4313
|
+
header?: never;
|
|
4314
|
+
path?: never;
|
|
4315
|
+
cookie?: never;
|
|
4316
|
+
};
|
|
4317
|
+
get?: never;
|
|
4318
|
+
put?: never;
|
|
4319
|
+
/**
|
|
4320
|
+
* Verify the chain over an interval
|
|
4321
|
+
* @description Walks your chain across the interval and answers with a verdict: `verified`, `broken` with the first violated sequence, or `unverified` when a stretch of it could not be checked at all.
|
|
4322
|
+
*
|
|
4323
|
+
* Before this existed a client had to COMPOSE that answer — list the interval, read `watermark_sequence` off `/v1/audit-events/health`, and call the interval verified when every sequence sat at or below it. The deduction is sound and conservative, and it is still the client asserting something this server never said. This operation says it. It runs the same walk as the background verifier: the same link check, the same hash recompute, the same tombstone-witness rule, over the same rows.
|
|
4324
|
+
*
|
|
4325
|
+
* `unverified` is NOT a weaker `verified` and NOT a `broken`. It means part of the interval has no verifiable link — rows are missing, or the first row has no predecessor to measure against — so nothing here certifies that stretch either way. `unverified_segments` names them, capped at 20 entries while `unverified_segment_count` stays the true total.
|
|
4326
|
+
*
|
|
4327
|
+
* THE INTERVAL IS STATED IN TIME AND THE CHAIN IS ORDERED BY SEQUENCE. `from`/`to` select rows by `happened_at`; the walk then covers the contiguous sequence span those rows occupy, reported as `sequence_range`, because a link can only be checked against the row immediately before it. That span can hold more rows than the window does, which is why `events_walked` is reported next to `events_in_interval`.
|
|
4328
|
+
*
|
|
4329
|
+
* BOUNDED BY ROWS, not by days: at most 50,000 rows in the span, or the request is refused with 413 `interval_too_large` and the count, so you can split it. A day count would bound nothing — `happened_at` is written by whoever appended the event, so an hour-wide window can hold an entire chain.
|
|
4330
|
+
*
|
|
4331
|
+
* Unlike `GET /v1/audit-events/health`, this read has NO side effects. It opens no incident, records no unverifiable segment and moves no watermark; poll it as often as you like.
|
|
4332
|
+
*/
|
|
4333
|
+
post: {
|
|
4334
|
+
parameters: {
|
|
4335
|
+
query?: never;
|
|
4336
|
+
header?: never;
|
|
4337
|
+
path?: never;
|
|
4338
|
+
cookie?: never;
|
|
4339
|
+
};
|
|
4340
|
+
requestBody?: {
|
|
4341
|
+
content: {
|
|
4342
|
+
"application/json": {
|
|
4343
|
+
/** @description Start of the interval, inclusive. ISO 8601, read against `happened_at`. */
|
|
4344
|
+
from: string;
|
|
4345
|
+
/** @description End of the interval, inclusive. ISO 8601, read against `happened_at`. */
|
|
4346
|
+
to: string;
|
|
4347
|
+
};
|
|
4348
|
+
};
|
|
4349
|
+
};
|
|
4350
|
+
responses: {
|
|
4351
|
+
/** @description OK */
|
|
4352
|
+
200: {
|
|
4353
|
+
headers: {
|
|
4354
|
+
[name: string]: unknown;
|
|
4355
|
+
};
|
|
4356
|
+
content: {
|
|
4357
|
+
"application/json": {
|
|
4358
|
+
/**
|
|
4359
|
+
* @description `verified` — every row in the span linked to the one before it and hashed to its stored `entry_hash`. `broken` — a row was caught lying, named by `first_violation`. `unverified` — nothing was caught, and part of the span has no verifiable link, so it is certified neither way.
|
|
4360
|
+
* @enum {string}
|
|
4361
|
+
*/
|
|
4362
|
+
status: "verified" | "unverified" | "broken";
|
|
4363
|
+
interval: {
|
|
4364
|
+
/** Format: date-time */
|
|
4365
|
+
from: string;
|
|
4366
|
+
/** Format: date-time */
|
|
4367
|
+
to: string;
|
|
4368
|
+
};
|
|
4369
|
+
/** @description The contiguous sequence span the interval's rows occupy, and what was walked. */
|
|
4370
|
+
sequence_range: {
|
|
4371
|
+
from: number;
|
|
4372
|
+
to: number;
|
|
4373
|
+
};
|
|
4374
|
+
/** @description Rows whose `happened_at` falls inside the interval. */
|
|
4375
|
+
events_in_interval: number;
|
|
4376
|
+
/** @description Rows inside `sequence_range`. At least `events_in_interval`, and larger when rows written with a `happened_at` outside the window sit between them. */
|
|
4377
|
+
events_walked: number;
|
|
4378
|
+
/** @description Rows that passed both checks. Below `events_walked` when the walk stopped at a break. */
|
|
4379
|
+
events_verified: number;
|
|
4380
|
+
/** @description The last sequence that verified. null when the very first row of the span did not, which is also the shape of a break at `sequence_range.from`. */
|
|
4381
|
+
verified_through_sequence: number | null;
|
|
4382
|
+
/** @description The FIRST violated sequence. The walk stops there; later rows are not reported. */
|
|
4383
|
+
first_violation: {
|
|
4384
|
+
sequence_number: number;
|
|
4385
|
+
/**
|
|
4386
|
+
* @description Which check fired. `chain_link_break_detected` — this row's `prev_hash` does not match the previous row's `entry_hash`, which is the only cross-row binding there is. `chain_integrity_break_detected` — the row's own fields no longer hash to its stored `entry_hash`. `tombstone_witness_missing` — an anonymized row with no live witness vouching for it, which would otherwise buy silence for free.
|
|
4387
|
+
* @enum {string}
|
|
4388
|
+
*/
|
|
4389
|
+
check: "chain_link_break_detected" | "chain_integrity_break_detected" | "tombstone_witness_missing";
|
|
4390
|
+
detail: string;
|
|
4391
|
+
} | null;
|
|
4392
|
+
/** @description A sample, capped at 20. `unverified_segment_count` is the total. */
|
|
4393
|
+
unverified_segments: {
|
|
4394
|
+
/** @description Last sequence verified before the hole; 0 when there was no anchor at all. */
|
|
4395
|
+
from_sequence: number;
|
|
4396
|
+
/** @description First sequence observed after the hole. */
|
|
4397
|
+
to_sequence: number;
|
|
4398
|
+
/** @enum {string} */
|
|
4399
|
+
reason: "sequence_gap" | "no_anchor";
|
|
4400
|
+
detail: string;
|
|
4401
|
+
}[];
|
|
4402
|
+
unverified_segment_count: number;
|
|
4403
|
+
/**
|
|
4404
|
+
* Format: date-time
|
|
4405
|
+
* @description When this walk ran. The verdict is about the rows as they stood then.
|
|
4406
|
+
*/
|
|
4407
|
+
checked_at: string;
|
|
4408
|
+
};
|
|
4409
|
+
};
|
|
4410
|
+
};
|
|
4411
|
+
/** @description Bad Request. `invalid_body` when `from` or `to` is missing or not a string, `invalid_iso_8601` when either is not a date this server can parse, `from_after_to` when the interval is inverted. */
|
|
4412
|
+
400: {
|
|
4413
|
+
headers: {
|
|
4414
|
+
[name: string]: unknown;
|
|
4415
|
+
};
|
|
4416
|
+
content: {
|
|
4417
|
+
"application/json": {
|
|
4418
|
+
/** @enum {string} */
|
|
4419
|
+
error: "invalid_body" | "invalid_iso_8601" | "from_after_to";
|
|
4420
|
+
};
|
|
4421
|
+
};
|
|
4422
|
+
};
|
|
4423
|
+
/** @description The sequence span covered by the interval holds more rows than one request will walk. Split the interval; `row_count` and `limit` say by how much. */
|
|
4424
|
+
413: {
|
|
4425
|
+
headers: {
|
|
4426
|
+
[name: string]: unknown;
|
|
4427
|
+
};
|
|
4428
|
+
content: {
|
|
4429
|
+
"application/json": {
|
|
4430
|
+
/** @enum {string} */
|
|
4431
|
+
error: "interval_too_large";
|
|
4432
|
+
remediation: string;
|
|
4433
|
+
row_count: number;
|
|
4434
|
+
limit: number;
|
|
4435
|
+
sequence_range: {
|
|
4436
|
+
from: number;
|
|
4437
|
+
to: number;
|
|
4438
|
+
};
|
|
4439
|
+
};
|
|
4440
|
+
};
|
|
4441
|
+
};
|
|
4442
|
+
/** @description The interval holds no audit events, so there is no verdict to give. Deliberately NOT a `verified` 200: a walk over nothing trivially finds nothing wrong, and a clean verdict for a period the chain says nothing about is the one claim a proof bundle must not carry — a mistyped date and an intact month would read identically. */
|
|
4443
|
+
422: {
|
|
4444
|
+
headers: {
|
|
4445
|
+
[name: string]: unknown;
|
|
4446
|
+
};
|
|
4447
|
+
content: {
|
|
4448
|
+
"application/json": {
|
|
4449
|
+
/** @enum {string} */
|
|
4450
|
+
error: "interval_empty";
|
|
4451
|
+
remediation: string;
|
|
4452
|
+
interval: {
|
|
4453
|
+
/** Format: date-time */
|
|
4454
|
+
from: string;
|
|
4455
|
+
/** Format: date-time */
|
|
4456
|
+
to: string;
|
|
4457
|
+
};
|
|
4458
|
+
};
|
|
4459
|
+
};
|
|
4460
|
+
};
|
|
4461
|
+
};
|
|
4462
|
+
};
|
|
4463
|
+
delete?: never;
|
|
4464
|
+
options?: never;
|
|
4465
|
+
head?: never;
|
|
4466
|
+
patch?: never;
|
|
4467
|
+
trace?: never;
|
|
4468
|
+
};
|
|
4244
4469
|
"/v1/audit-events/incidents": {
|
|
4245
4470
|
parameters: {
|
|
4246
4471
|
query?: never;
|
|
@@ -6141,6 +6366,11 @@ export interface paths {
|
|
|
6141
6366
|
status: "active" | "blocked" | "canceled";
|
|
6142
6367
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6143
6368
|
token_id: string | null;
|
|
6369
|
+
/**
|
|
6370
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6371
|
+
* @enum {string}
|
|
6372
|
+
*/
|
|
6373
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6144
6374
|
/** Format: date-time */
|
|
6145
6375
|
created_at: string;
|
|
6146
6376
|
}[];
|
|
@@ -6269,6 +6499,11 @@ export interface paths {
|
|
|
6269
6499
|
status: "active" | "blocked" | "canceled";
|
|
6270
6500
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6271
6501
|
token_id: string | null;
|
|
6502
|
+
/**
|
|
6503
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6504
|
+
* @enum {string}
|
|
6505
|
+
*/
|
|
6506
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6272
6507
|
/** Format: date-time */
|
|
6273
6508
|
created_at: string;
|
|
6274
6509
|
};
|
|
@@ -6313,6 +6548,11 @@ export interface paths {
|
|
|
6313
6548
|
status: "active" | "blocked" | "canceled";
|
|
6314
6549
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6315
6550
|
token_id: string | null;
|
|
6551
|
+
/**
|
|
6552
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6553
|
+
* @enum {string}
|
|
6554
|
+
*/
|
|
6555
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6316
6556
|
/** Format: date-time */
|
|
6317
6557
|
created_at: string;
|
|
6318
6558
|
} | null;
|
|
@@ -6353,6 +6593,11 @@ export interface paths {
|
|
|
6353
6593
|
status: "active" | "blocked" | "canceled";
|
|
6354
6594
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6355
6595
|
token_id: string | null;
|
|
6596
|
+
/**
|
|
6597
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6598
|
+
* @enum {string}
|
|
6599
|
+
*/
|
|
6600
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6356
6601
|
/** Format: date-time */
|
|
6357
6602
|
created_at: string;
|
|
6358
6603
|
};
|
|
@@ -6406,6 +6651,11 @@ export interface paths {
|
|
|
6406
6651
|
status: "active" | "blocked" | "canceled";
|
|
6407
6652
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6408
6653
|
token_id: string | null;
|
|
6654
|
+
/**
|
|
6655
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6656
|
+
* @enum {string}
|
|
6657
|
+
*/
|
|
6658
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6409
6659
|
/** Format: date-time */
|
|
6410
6660
|
created_at: string;
|
|
6411
6661
|
} | null;
|
|
@@ -6621,6 +6871,11 @@ export interface paths {
|
|
|
6621
6871
|
status: "active" | "blocked" | "canceled";
|
|
6622
6872
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6623
6873
|
token_id: string | null;
|
|
6874
|
+
/**
|
|
6875
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6876
|
+
* @enum {string}
|
|
6877
|
+
*/
|
|
6878
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6624
6879
|
/** Format: date-time */
|
|
6625
6880
|
created_at: string;
|
|
6626
6881
|
} | {
|
|
@@ -6664,6 +6919,11 @@ export interface paths {
|
|
|
6664
6919
|
status: "active" | "blocked" | "canceled";
|
|
6665
6920
|
/** @description The card's token in the cardholder-data environment. Null until ingest lands, which is its own step after the card exists, so a freshly issued card can be readable here with no token yet. */
|
|
6666
6921
|
token_id: string | null;
|
|
6922
|
+
/**
|
|
6923
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
6924
|
+
* @enum {string}
|
|
6925
|
+
*/
|
|
6926
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
6667
6927
|
/** Format: date-time */
|
|
6668
6928
|
created_at: string;
|
|
6669
6929
|
} | null;
|
|
@@ -8300,6 +8560,11 @@ export interface paths {
|
|
|
8300
8560
|
status: "active" | "blocked" | "canceled";
|
|
8301
8561
|
/** @description The card-data-environment token id, null until the mint flow allocates one. Allocation happens BEFORE the card material is ingested, so a token id with no material behind it is a recorded failure rather than a silent gap. It is the handle a PCI-scoped surface exchanges for card material; no card material is reachable through this API with it. */
|
|
8302
8562
|
token_id: string | null;
|
|
8563
|
+
/**
|
|
8564
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
8565
|
+
* @enum {string}
|
|
8566
|
+
*/
|
|
8567
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
8303
8568
|
/** Format: date-time */
|
|
8304
8569
|
created_at: string;
|
|
8305
8570
|
} | {
|
|
@@ -8334,6 +8599,11 @@ export interface paths {
|
|
|
8334
8599
|
status: "active" | "blocked" | "canceled";
|
|
8335
8600
|
/** @description The card-data-environment token id, null until the mint flow allocates one. Allocation happens BEFORE the card material is ingested, so a token id with no material behind it is a recorded failure rather than a silent gap. It is the handle a PCI-scoped surface exchanges for card material; no card material is reachable through this API with it. */
|
|
8336
8601
|
token_id: string | null;
|
|
8602
|
+
/**
|
|
8603
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
8604
|
+
* @enum {string}
|
|
8605
|
+
*/
|
|
8606
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
8337
8607
|
/** Format: date-time */
|
|
8338
8608
|
created_at: string;
|
|
8339
8609
|
} | null;
|
|
@@ -8455,6 +8725,11 @@ export interface paths {
|
|
|
8455
8725
|
/** @enum {string} */
|
|
8456
8726
|
status: "active" | "blocked" | "canceled";
|
|
8457
8727
|
token_id: string | null;
|
|
8728
|
+
/**
|
|
8729
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
8730
|
+
* @enum {string}
|
|
8731
|
+
*/
|
|
8732
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
8458
8733
|
/** Format: date-time */
|
|
8459
8734
|
created_at: string;
|
|
8460
8735
|
};
|
|
@@ -8492,6 +8767,11 @@ export interface paths {
|
|
|
8492
8767
|
/** @enum {string} */
|
|
8493
8768
|
status: "active" | "blocked" | "canceled";
|
|
8494
8769
|
token_id: string | null;
|
|
8770
|
+
/**
|
|
8771
|
+
* @description Whether the cardholder-data environment holds this card's PAN. `ingested`: it does, and `token_id` names the token. `not_configured`: this deployment has no CDE, the PAN was never asked for, and no retry of the Idempotency-Key changes that — a deployment posture, not a caller fault. `not_ingested`: a CDE exists and the card has no token; on a mint that is the 502 `issuer_ingest_failed` retry contract, on a read it is a card whose ingest has not landed.
|
|
8772
|
+
* @enum {string}
|
|
8773
|
+
*/
|
|
8774
|
+
cde: "ingested" | "not_ingested" | "not_configured";
|
|
8495
8775
|
/** Format: date-time */
|
|
8496
8776
|
created_at: string;
|
|
8497
8777
|
};
|
|
@@ -14358,6 +14638,17 @@ export interface paths {
|
|
|
14358
14638
|
* - `partner` — your server submits. `attestation` is REQUIRED (400 `attestation_required`): the IP and user-agent recorded are your server's, so the only statement about the human is yours. It is signed into the mandate as `consent_attestation` and cannot be edited afterwards without breaking the signature.
|
|
14359
14639
|
*
|
|
14360
14640
|
* `attestation.method` says how the human authorized: `partner_session` (an authenticated session in your product), `in_person`, `verified_code` (a code YOU issued and verified), or `partner_biometric` (YOU ran a biometric check at the moment of the act). `partner_biometric` is not a flavour of `partner_session`: in a dispute a session says someone was logged in and a biometric says a body was present. We capture and verify no biometric ourselves — this records what YOU assert, sealed by the mandate signature so it cannot be edited afterwards; the evidence behind it stays with you. `asserted_at` is the instant you say they authorized, in Unix seconds. `reference` is your own record id, `[A-Za-z0-9_-]{1,120}`, and never personal data — it is joined into the signed string, so the character set is the schema's, not a suggestion.
|
|
14641
|
+
*
|
|
14642
|
+
* `attestation.evidence` (optional) is what you OBSERVED of the act, signed with the rest of the mandate. `channel` is required and decides which other keys may be present, because a value a channel cannot expose was inferred, and an inferred value inside a signed record reads exactly like an observed one:
|
|
14643
|
+
*
|
|
14644
|
+
* - `whatsapp`, `sms`, `email`, `llm_chat` — `contact`, `message_id`, `session_id`, `provider_ts`. These hand you a conversation, not a connection.
|
|
14645
|
+
* - `web_chat` — the above plus `ip`, `user_agent`, `geo`. A browser has no install, so no `device_id_hash`.
|
|
14646
|
+
* - `app` — the above plus `device_id_hash`.
|
|
14647
|
+
* - `other` — everything, because we cannot say what a channel we have not named exposes. An auditor reading `other` knows exactly that.
|
|
14648
|
+
*
|
|
14649
|
+
* A key outside its channel's set, or a key the object does not declare, is a 400 `attestation_evidence_invalid` with `details.key` naming it — never a silent drop. `contact` is the e-mail or E.164 phone the consumer acted from; it is hashed server-side into the signed `contact_hash` and never stored in the clear. `device_id_hash` you hash yourself (64 hex characters). `geo` is `{country, region, city}` and refuses coordinates.
|
|
14650
|
+
*
|
|
14651
|
+
* `method: "verified_code"` additionally REQUIRES `evidence.contact` to carry a contact verification we ran for this consumer in the last 24h (`POST /v1/consumers/{consumerId}/contact-verifications`), or the submit is refused with 409 `contact_verification_required` and the token is left unspent. A rung that is only asserted is not stronger than the one below it.
|
|
14361
14652
|
*/
|
|
14362
14653
|
post: {
|
|
14363
14654
|
parameters: {
|
|
@@ -14381,6 +14672,23 @@ export interface paths {
|
|
|
14381
14672
|
method: "partner_session" | "in_person" | "verified_code" | "partner_biometric";
|
|
14382
14673
|
asserted_at: number;
|
|
14383
14674
|
reference?: string;
|
|
14675
|
+
evidence?: {
|
|
14676
|
+
/** @enum {string} */
|
|
14677
|
+
channel: "whatsapp" | "web_chat" | "app" | "llm_chat" | "sms" | "email" | "other";
|
|
14678
|
+
message_id?: string;
|
|
14679
|
+
session_id?: string;
|
|
14680
|
+
provider_ts?: number;
|
|
14681
|
+
/** Format: ip */
|
|
14682
|
+
ip?: string;
|
|
14683
|
+
user_agent?: string;
|
|
14684
|
+
device_id_hash?: string;
|
|
14685
|
+
geo?: {
|
|
14686
|
+
country: string;
|
|
14687
|
+
region?: string;
|
|
14688
|
+
city?: string;
|
|
14689
|
+
};
|
|
14690
|
+
contact?: string;
|
|
14691
|
+
};
|
|
14384
14692
|
};
|
|
14385
14693
|
};
|
|
14386
14694
|
};
|
|
@@ -14405,7 +14713,7 @@ export interface paths {
|
|
|
14405
14713
|
};
|
|
14406
14714
|
};
|
|
14407
14715
|
};
|
|
14408
|
-
/** @description The body did not match the schema (`invalid_body`, with the Zod issues in `details.issues`),
|
|
14716
|
+
/** @description The body did not match the schema (`invalid_body`, with the Zod issues in `details.issues`), the attestation does not match the token's surface (`attestation_required` on `partner` without one, `attestation_not_accepted` on `hosted` with one), or the evidence carries a key its channel cannot expose or one the object does not declare (`attestation_evidence_invalid`, `details.key`). */
|
|
14409
14717
|
400: {
|
|
14410
14718
|
headers: {
|
|
14411
14719
|
[name: string]: unknown;
|
|
@@ -14414,7 +14722,7 @@ export interface paths {
|
|
|
14414
14722
|
"application/json": {
|
|
14415
14723
|
error: {
|
|
14416
14724
|
/** @enum {string} */
|
|
14417
|
-
code: "invalid_body" | "attestation_required" | "attestation_not_accepted";
|
|
14725
|
+
code: "invalid_body" | "attestation_required" | "attestation_not_accepted" | "attestation_evidence_invalid";
|
|
14418
14726
|
message: string;
|
|
14419
14727
|
details?: {
|
|
14420
14728
|
[key: string]: unknown;
|
|
@@ -14445,7 +14753,7 @@ export interface paths {
|
|
|
14445
14753
|
};
|
|
14446
14754
|
};
|
|
14447
14755
|
};
|
|
14448
|
-
/** @description The token was already submitted, or a concurrent submit won the race
|
|
14756
|
+
/** @description The token was already submitted, or a concurrent submit won the race (nothing was created twice: the loser rolls back whole); or `method: "verified_code"` was claimed without a contact verification for this consumer in the last 24h, in which case nothing was created at all and the token is still pending. */
|
|
14449
14757
|
409: {
|
|
14450
14758
|
headers: {
|
|
14451
14759
|
[name: string]: unknown;
|
|
@@ -14454,7 +14762,7 @@ export interface paths {
|
|
|
14454
14762
|
"application/json": {
|
|
14455
14763
|
error: {
|
|
14456
14764
|
/** @enum {string} */
|
|
14457
|
-
code: "consent_already_resolved" | "consent_race";
|
|
14765
|
+
code: "consent_already_resolved" | "consent_race" | "contact_verification_required";
|
|
14458
14766
|
message: string;
|
|
14459
14767
|
details?: {
|
|
14460
14768
|
[key: string]: unknown;
|
|
@@ -14540,6 +14848,7 @@ export interface paths {
|
|
|
14540
14848
|
attempt_id?: string;
|
|
14541
14849
|
ted?: components["schemas"]["TedDestination"];
|
|
14542
14850
|
quote?: components["schemas"]["SpendQuote"];
|
|
14851
|
+
actor?: components["schemas"]["PaymentActor"];
|
|
14543
14852
|
};
|
|
14544
14853
|
};
|
|
14545
14854
|
};
|
|
@@ -14553,7 +14862,7 @@ export interface paths {
|
|
|
14553
14862
|
"application/json": components["schemas"]["SpendOutcome"];
|
|
14554
14863
|
};
|
|
14555
14864
|
};
|
|
14556
|
-
/** @description The body did not match the schema. */
|
|
14865
|
+
/** @description The body did not match the schema (`invalid_body`), or `actor.on_behalf_of` names a consumer other than the one this mandate belongs to (`actor_consumer_mismatch`). Nothing was read, held or sent in either case. */
|
|
14557
14866
|
400: {
|
|
14558
14867
|
headers: {
|
|
14559
14868
|
[name: string]: unknown;
|
|
@@ -14562,7 +14871,7 @@ export interface paths {
|
|
|
14562
14871
|
"application/json": {
|
|
14563
14872
|
error: {
|
|
14564
14873
|
/** @enum {string} */
|
|
14565
|
-
code: "invalid_body";
|
|
14874
|
+
code: "invalid_body" | "actor_consumer_mismatch";
|
|
14566
14875
|
message: string;
|
|
14567
14876
|
details?: {
|
|
14568
14877
|
[key: string]: unknown;
|
|
@@ -14765,6 +15074,7 @@ export interface paths {
|
|
|
14765
15074
|
attempt_id?: string;
|
|
14766
15075
|
ted?: components["schemas"]["TedDestination"];
|
|
14767
15076
|
quote?: components["schemas"]["SpendQuote"];
|
|
15077
|
+
actor?: components["schemas"]["PaymentActor"];
|
|
14768
15078
|
};
|
|
14769
15079
|
};
|
|
14770
15080
|
};
|
|
@@ -14778,7 +15088,7 @@ export interface paths {
|
|
|
14778
15088
|
"application/json": components["schemas"]["SpendOutcome"];
|
|
14779
15089
|
};
|
|
14780
15090
|
};
|
|
14781
|
-
/** @description The body did not match the schema. */
|
|
15091
|
+
/** @description The body did not match the schema (`invalid_body`), or `actor.on_behalf_of` names a consumer other than the one this mandate belongs to (`actor_consumer_mismatch`). Nothing was read, held or sent in either case. */
|
|
14782
15092
|
400: {
|
|
14783
15093
|
headers: {
|
|
14784
15094
|
[name: string]: unknown;
|
|
@@ -14787,7 +15097,7 @@ export interface paths {
|
|
|
14787
15097
|
"application/json": {
|
|
14788
15098
|
error: {
|
|
14789
15099
|
/** @enum {string} */
|
|
14790
|
-
code: "invalid_body";
|
|
15100
|
+
code: "invalid_body" | "actor_consumer_mismatch";
|
|
14791
15101
|
message: string;
|
|
14792
15102
|
details?: {
|
|
14793
15103
|
[key: string]: unknown;
|
|
@@ -14942,6 +15252,7 @@ export interface paths {
|
|
|
14942
15252
|
attempt_id?: string;
|
|
14943
15253
|
ted?: components["schemas"]["TedDestination"];
|
|
14944
15254
|
quote?: components["schemas"]["SpendQuote"];
|
|
15255
|
+
actor?: components["schemas"]["PaymentActor"];
|
|
14945
15256
|
};
|
|
14946
15257
|
};
|
|
14947
15258
|
};
|
|
@@ -14955,7 +15266,7 @@ export interface paths {
|
|
|
14955
15266
|
"text/event-stream": string;
|
|
14956
15267
|
};
|
|
14957
15268
|
};
|
|
14958
|
-
/** @description The body did not match the schema. */
|
|
15269
|
+
/** @description The body did not match the schema (`invalid_body`), or `actor.on_behalf_of` names a consumer other than the one this mandate belongs to (`actor_consumer_mismatch`). Nothing was read, held or sent in either case. */
|
|
14959
15270
|
400: {
|
|
14960
15271
|
headers: {
|
|
14961
15272
|
[name: string]: unknown;
|
|
@@ -14964,7 +15275,7 @@ export interface paths {
|
|
|
14964
15275
|
"application/json": {
|
|
14965
15276
|
error: {
|
|
14966
15277
|
/** @enum {string} */
|
|
14967
|
-
code: "invalid_body";
|
|
15278
|
+
code: "invalid_body" | "actor_consumer_mismatch";
|
|
14968
15279
|
message: string;
|
|
14969
15280
|
details?: {
|
|
14970
15281
|
[key: string]: unknown;
|
|
@@ -15132,6 +15443,8 @@ export interface paths {
|
|
|
15132
15443
|
*
|
|
15133
15444
|
* **`idempotency_key` is REQUIRED for that combination**, and it is checked before anything reaches the issuer. A repeat with the same key returns the charge already issued, or its still-open reservation, instead of a second receivable the same debtor could pay twice. Send it as the `Idempotency-Key` header, as the body's `idempotency_key`, or as both with the SAME value; two different values are refused rather than one silently winning.
|
|
15134
15445
|
*
|
|
15446
|
+
* **`consumer_id` is REQUIRED for a `boleto` too**: it names the merchant-side consumer the receivable settles into, and its wallet is what the payment credits. Without it there is nothing to settle into and the call is refused with `consumer_id_required` before anything is sent. In a test project any stable id of your own works: the project's shared-sandbox receiver stands in for the consumer's account at the issuer (the consumer is never onboarded there), and `POST /v1/test/charges/{chargeId}/pay` settles the charge into that consumer's wallet.
|
|
15447
|
+
*
|
|
15135
15448
|
* An agreement in N instalments is N cobranças, one per parcela, each with its own `due_date` and its own key. There is no single instalment charge.
|
|
15136
15449
|
*
|
|
15137
15450
|
* **Each refusal names a `reason`, and the reason is what to branch on.** The two error `code` values (`invalid_args`, `provider_error`) are too coarse: they cover six different situations, and reading them as one would turn `not found` into `bad request`.
|
|
@@ -15140,7 +15453,9 @@ export interface paths {
|
|
|
15140
15453
|
* |---|---|---|
|
|
15141
15454
|
* | `charge_id_missing` | 400 | the call named no charge |
|
|
15142
15455
|
* | `project_scope_missing` | 400 | the credential is not project-scoped, and a charge belongs to one project |
|
|
15456
|
+
* | `consumer_id_required` | 400 | a `boleto` create named no `consumer_id`, so there is no wallet for the receivable to settle into |
|
|
15143
15457
|
* | `charge_not_found` | 404 | no charge under that id FOR THIS TENANT |
|
|
15458
|
+
* | `charge_reference_ambiguous` | 409 | the reference is one charge's id AND another's idempotency key; query by the charge id |
|
|
15144
15459
|
* | `issuance_unconfirmed` | 409 | the key holds a reservation whose create never got an answer |
|
|
15145
15460
|
* | `already_payment_notified` | 409 | the clearing house already notified a payment |
|
|
15146
15461
|
* | `not_cancellable_in_this_state` | 409 | the issuer accepts a cancellation only in some states |
|
|
@@ -15159,11 +15474,13 @@ export interface paths {
|
|
|
15159
15474
|
requestBody?: {
|
|
15160
15475
|
content: {
|
|
15161
15476
|
"application/json": {
|
|
15162
|
-
/** @description In minor units. */
|
|
15477
|
+
/** @description In MAJOR units of `currency`, NOT minor: `12.5` is R$ 12,50 and comes back as `amount_minor: 1250`. Sending `1250` here issues a R$ 1.250,00 charge. This is the one field of the charge family that takes major units; every `*_minor` field, including the response's `amount_minor`, is in centavos. */
|
|
15163
15478
|
amount: number;
|
|
15164
15479
|
currency: string;
|
|
15165
15480
|
/** @description `pix`, `boleto`, `card` or `wallet`. */
|
|
15166
15481
|
method: string;
|
|
15482
|
+
/** @description The merchant-side consumer the charge settles into: its wallet is credited when the debtor pays. REQUIRED for `boleto` (refused with `consumer_id_required` otherwise); optional for the other methods, where an absent value falls back to the session's user when there is one. */
|
|
15483
|
+
consumer_id?: string;
|
|
15167
15484
|
description?: string;
|
|
15168
15485
|
buyer?: {
|
|
15169
15486
|
[key: string]: unknown;
|
|
@@ -15189,7 +15506,11 @@ export interface paths {
|
|
|
15189
15506
|
"application/json": {
|
|
15190
15507
|
/** @description The issuer's charge id. Null while the issuance is unconfirmed. */
|
|
15191
15508
|
id: string | null;
|
|
15192
|
-
/**
|
|
15509
|
+
/**
|
|
15510
|
+
* @description The provider's state as far as we know it, normalized (`PROCESSING`, `PENDING`, `CONFIRMED`, `CANCELLED`, `EXPIRED`). Forced to PROCESSING until the issuance is confirmed.
|
|
15511
|
+
*
|
|
15512
|
+
* **A charge settled by the sandbox payer answers `CONFIRMED` here**, the same value a real payment leaves a live read answering — so a client that polls `status` sees the test payment exactly where it would see a live one. The issuer's homolog account never sees that money and keeps answering PENDING (EXPIRED after the due date); that answer stays in `raw` and is not reported as `status` or as a `status_conflict`, because for a test charge the fixture is the issuer's truth. `settlement: "confirmed"` and `local_status: "settled"` say the same thing from our side.
|
|
15513
|
+
*/
|
|
15193
15514
|
status: string;
|
|
15194
15515
|
/** @description What CodeSpar recorded, which is a different question from `status`. */
|
|
15195
15516
|
local_status: string;
|
|
@@ -15197,9 +15518,9 @@ export interface paths {
|
|
|
15197
15518
|
status_conflict: boolean;
|
|
15198
15519
|
method: string;
|
|
15199
15520
|
currency: string;
|
|
15200
|
-
/** @description In units. */
|
|
15521
|
+
/** @description In MAJOR units of `currency`: `12.5` is R$ 12,50. Always `amount_minor / 100`. */
|
|
15201
15522
|
amount: number;
|
|
15202
|
-
/** @description In minor units. */
|
|
15523
|
+
/** @description In minor units (centavos): `1250` is R$ 12,50. */
|
|
15203
15524
|
amount_minor: number;
|
|
15204
15525
|
due_date: string | null;
|
|
15205
15526
|
/** @description True only when all four hold: the issuance is confirmed, our row is still open, the provider says PENDING, and at least one document exists. This is the field to branch on, not `status`. */
|
|
@@ -15224,7 +15545,7 @@ export interface paths {
|
|
|
15224
15545
|
};
|
|
15225
15546
|
};
|
|
15226
15547
|
};
|
|
15227
|
-
/** @description The call is malformed, or the two idempotency keys disagree. */
|
|
15548
|
+
/** @description The call is malformed, names no consumer for a boleto, or the two idempotency keys disagree. */
|
|
15228
15549
|
400: {
|
|
15229
15550
|
headers: {
|
|
15230
15551
|
[name: string]: unknown;
|
|
@@ -15233,7 +15554,7 @@ export interface paths {
|
|
|
15233
15554
|
"application/json": {
|
|
15234
15555
|
error: {
|
|
15235
15556
|
/** @enum {string} */
|
|
15236
|
-
code: "charge_idempotency_key_required" | "idempotency_key_conflict";
|
|
15557
|
+
code: "charge_idempotency_key_required" | "consumer_id_required" | "idempotency_key_conflict";
|
|
15237
15558
|
message: string;
|
|
15238
15559
|
details?: {
|
|
15239
15560
|
[key: string]: unknown;
|
|
@@ -15301,7 +15622,9 @@ export interface paths {
|
|
|
15301
15622
|
};
|
|
15302
15623
|
/**
|
|
15303
15624
|
* Read a charge
|
|
15304
|
-
* @description Reads a charge this project issued. `chargeId` accepts EITHER the id the create returned OR the caller's own `idempotency_key` — the row is resolved under this credential's org and project, which is what makes another tenant's id simply not found.
|
|
15625
|
+
* @description Reads a charge this project issued. `chargeId` accepts EITHER the id the create returned (the issuer's charge transaction id) OR the caller's own `idempotency_key` — the row is resolved under this credential's org and project, which is what makes another tenant's id simply not found. A value that is one charge's id AND another charge's key is refused with `charge_reference_ambiguous` rather than answered for whichever came first; query by the charge id in that case. The Pix leg's own transaction id is not a reference here.
|
|
15626
|
+
*
|
|
15627
|
+
* **A charge the sandbox payer settled answers `status: "CONFIRMED"`** with `settlement: "confirmed"` and `local_status: "settled"` — see `status` on the response for why the issuer's own PENDING is not reported.
|
|
15305
15628
|
*
|
|
15306
15629
|
* **Branch on `payable`, not on `status`.** `payable` is true only when the issuance is confirmed, our row is still open, the provider says PENDING, and at least one payable document exists. A cobrança com vencimento answers PROCESSING with `payable: false` and no document at first, because the instrument registers with the clearing house before it can be paid.
|
|
15307
15630
|
*
|
|
@@ -15313,7 +15636,9 @@ export interface paths {
|
|
|
15313
15636
|
* |---|---|---|
|
|
15314
15637
|
* | `charge_id_missing` | 400 | the call named no charge |
|
|
15315
15638
|
* | `project_scope_missing` | 400 | the credential is not project-scoped, and a charge belongs to one project |
|
|
15639
|
+
* | `consumer_id_required` | 400 | a `boleto` create named no `consumer_id`, so there is no wallet for the receivable to settle into |
|
|
15316
15640
|
* | `charge_not_found` | 404 | no charge under that id FOR THIS TENANT |
|
|
15641
|
+
* | `charge_reference_ambiguous` | 409 | the reference is one charge's id AND another's idempotency key; query by the charge id |
|
|
15317
15642
|
* | `issuance_unconfirmed` | 409 | the key holds a reservation whose create never got an answer |
|
|
15318
15643
|
* | `already_payment_notified` | 409 | the clearing house already notified a payment |
|
|
15319
15644
|
* | `not_cancellable_in_this_state` | 409 | the issuer accepts a cancellation only in some states |
|
|
@@ -15342,7 +15667,11 @@ export interface paths {
|
|
|
15342
15667
|
"application/json": {
|
|
15343
15668
|
/** @description The issuer's charge id. Null while the issuance is unconfirmed. */
|
|
15344
15669
|
id: string | null;
|
|
15345
|
-
/**
|
|
15670
|
+
/**
|
|
15671
|
+
* @description The provider's state as far as we know it, normalized (`PROCESSING`, `PENDING`, `CONFIRMED`, `CANCELLED`, `EXPIRED`). Forced to PROCESSING until the issuance is confirmed.
|
|
15672
|
+
*
|
|
15673
|
+
* **A charge settled by the sandbox payer answers `CONFIRMED` here**, the same value a real payment leaves a live read answering — so a client that polls `status` sees the test payment exactly where it would see a live one. The issuer's homolog account never sees that money and keeps answering PENDING (EXPIRED after the due date); that answer stays in `raw` and is not reported as `status` or as a `status_conflict`, because for a test charge the fixture is the issuer's truth. `settlement: "confirmed"` and `local_status: "settled"` say the same thing from our side.
|
|
15674
|
+
*/
|
|
15346
15675
|
status: string;
|
|
15347
15676
|
/** @description What CodeSpar recorded, which is a different question from `status`. */
|
|
15348
15677
|
local_status: string;
|
|
@@ -15350,9 +15679,9 @@ export interface paths {
|
|
|
15350
15679
|
status_conflict: boolean;
|
|
15351
15680
|
method: string;
|
|
15352
15681
|
currency: string;
|
|
15353
|
-
/** @description In units. */
|
|
15682
|
+
/** @description In MAJOR units of `currency`: `12.5` is R$ 12,50. Always `amount_minor / 100`. */
|
|
15354
15683
|
amount: number;
|
|
15355
|
-
/** @description In minor units. */
|
|
15684
|
+
/** @description In minor units (centavos): `1250` is R$ 12,50. */
|
|
15356
15685
|
amount_minor: number;
|
|
15357
15686
|
due_date: string | null;
|
|
15358
15687
|
/** @description True only when all four hold: the issuance is confirmed, our row is still open, the provider says PENDING, and at least one document exists. This is the field to branch on, not `status`. */
|
|
@@ -15417,7 +15746,7 @@ export interface paths {
|
|
|
15417
15746
|
};
|
|
15418
15747
|
};
|
|
15419
15748
|
};
|
|
15420
|
-
/** @description The charge exists and is not readable in this state. */
|
|
15749
|
+
/** @description The charge exists and is not readable in this state, or the reference names two charges. */
|
|
15421
15750
|
409: {
|
|
15422
15751
|
headers: {
|
|
15423
15752
|
[name: string]: unknown;
|
|
@@ -15426,7 +15755,7 @@ export interface paths {
|
|
|
15426
15755
|
"application/json": {
|
|
15427
15756
|
error: {
|
|
15428
15757
|
/** @enum {string} */
|
|
15429
|
-
code: "issuance_unconfirmed";
|
|
15758
|
+
code: "issuance_unconfirmed" | "charge_reference_ambiguous";
|
|
15430
15759
|
message: string;
|
|
15431
15760
|
details?: {
|
|
15432
15761
|
[key: string]: unknown;
|
|
@@ -15490,7 +15819,9 @@ export interface paths {
|
|
|
15490
15819
|
* |---|---|---|
|
|
15491
15820
|
* | `charge_id_missing` | 400 | the call named no charge |
|
|
15492
15821
|
* | `project_scope_missing` | 400 | the credential is not project-scoped, and a charge belongs to one project |
|
|
15822
|
+
* | `consumer_id_required` | 400 | a `boleto` create named no `consumer_id`, so there is no wallet for the receivable to settle into |
|
|
15493
15823
|
* | `charge_not_found` | 404 | no charge under that id FOR THIS TENANT |
|
|
15824
|
+
* | `charge_reference_ambiguous` | 409 | the reference is one charge's id AND another's idempotency key; query by the charge id |
|
|
15494
15825
|
* | `issuance_unconfirmed` | 409 | the key holds a reservation whose create never got an answer |
|
|
15495
15826
|
* | `already_payment_notified` | 409 | the clearing house already notified a payment |
|
|
15496
15827
|
* | `not_cancellable_in_this_state` | 409 | the issuer accepts a cancellation only in some states |
|
|
@@ -15519,7 +15850,11 @@ export interface paths {
|
|
|
15519
15850
|
"application/json": {
|
|
15520
15851
|
/** @description The issuer's charge id. Null while the issuance is unconfirmed. */
|
|
15521
15852
|
id: string | null;
|
|
15522
|
-
/**
|
|
15853
|
+
/**
|
|
15854
|
+
* @description The provider's state as far as we know it, normalized (`PROCESSING`, `PENDING`, `CONFIRMED`, `CANCELLED`, `EXPIRED`). Forced to PROCESSING until the issuance is confirmed.
|
|
15855
|
+
*
|
|
15856
|
+
* **A charge settled by the sandbox payer answers `CONFIRMED` here**, the same value a real payment leaves a live read answering — so a client that polls `status` sees the test payment exactly where it would see a live one. The issuer's homolog account never sees that money and keeps answering PENDING (EXPIRED after the due date); that answer stays in `raw` and is not reported as `status` or as a `status_conflict`, because for a test charge the fixture is the issuer's truth. `settlement: "confirmed"` and `local_status: "settled"` say the same thing from our side.
|
|
15857
|
+
*/
|
|
15523
15858
|
status: string;
|
|
15524
15859
|
/** @description What CodeSpar recorded, which is a different question from `status`. */
|
|
15525
15860
|
local_status: string;
|
|
@@ -15527,9 +15862,9 @@ export interface paths {
|
|
|
15527
15862
|
status_conflict: boolean;
|
|
15528
15863
|
method: string;
|
|
15529
15864
|
currency: string;
|
|
15530
|
-
/** @description In units. */
|
|
15865
|
+
/** @description In MAJOR units of `currency`: `12.5` is R$ 12,50. Always `amount_minor / 100`. */
|
|
15531
15866
|
amount: number;
|
|
15532
|
-
/** @description In minor units. */
|
|
15867
|
+
/** @description In minor units (centavos): `1250` is R$ 12,50. */
|
|
15533
15868
|
amount_minor: number;
|
|
15534
15869
|
due_date: string | null;
|
|
15535
15870
|
/** @description True only when all four hold: the issuance is confirmed, our row is still open, the provider says PENDING, and at least one document exists. This is the field to branch on, not `status`. */
|
|
@@ -15603,7 +15938,7 @@ export interface paths {
|
|
|
15603
15938
|
"application/json": {
|
|
15604
15939
|
error: {
|
|
15605
15940
|
/** @enum {string} */
|
|
15606
|
-
code: "issuance_unconfirmed" | "already_payment_notified" | "not_cancellable_in_this_state";
|
|
15941
|
+
code: "issuance_unconfirmed" | "already_payment_notified" | "not_cancellable_in_this_state" | "charge_reference_ambiguous";
|
|
15607
15942
|
message: string;
|
|
15608
15943
|
details?: {
|
|
15609
15944
|
[key: string]: unknown;
|
|
@@ -15784,7 +16119,7 @@ export interface paths {
|
|
|
15784
16119
|
};
|
|
15785
16120
|
};
|
|
15786
16121
|
};
|
|
15787
|
-
/** @description The charge exists and cannot be paid: `issuance_unconfirmed` is a reservation whose create never got an answer; `charge_not_payable` is a charge already closed (expired or cancelled). */
|
|
16122
|
+
/** @description The charge exists and cannot be paid: `issuance_unconfirmed` is a reservation whose create never got an answer; `charge_not_payable` is a charge already closed (expired or cancelled); `charge_reference_ambiguous` is a reference that is one charge's id and another's idempotency key — pay by the charge id. */
|
|
15788
16123
|
409: {
|
|
15789
16124
|
headers: {
|
|
15790
16125
|
[name: string]: unknown;
|
|
@@ -15793,7 +16128,7 @@ export interface paths {
|
|
|
15793
16128
|
"application/json": {
|
|
15794
16129
|
error: {
|
|
15795
16130
|
/** @enum {string} */
|
|
15796
|
-
code: "issuance_unconfirmed" | "charge_not_payable";
|
|
16131
|
+
code: "issuance_unconfirmed" | "charge_not_payable" | "charge_reference_ambiguous";
|
|
15797
16132
|
message: string;
|
|
15798
16133
|
details?: {
|
|
15799
16134
|
[key: string]: unknown;
|
|
@@ -15977,7 +16312,7 @@ export interface paths {
|
|
|
15977
16312
|
};
|
|
15978
16313
|
};
|
|
15979
16314
|
};
|
|
15980
|
-
/** @description The charge exists and cannot be paid: `issuance_unconfirmed` is a reservation whose create never got an answer; `charge_not_payable` is a charge already closed (expired or cancelled). */
|
|
16315
|
+
/** @description The charge exists and cannot be paid: `issuance_unconfirmed` is a reservation whose create never got an answer; `charge_not_payable` is a charge already closed (expired or cancelled); `charge_reference_ambiguous` is a reference that is one charge's id and another's idempotency key — pay by the charge id. */
|
|
15981
16316
|
409: {
|
|
15982
16317
|
headers: {
|
|
15983
16318
|
[name: string]: unknown;
|
|
@@ -15986,7 +16321,7 @@ export interface paths {
|
|
|
15986
16321
|
"application/json": {
|
|
15987
16322
|
error: {
|
|
15988
16323
|
/** @enum {string} */
|
|
15989
|
-
code: "issuance_unconfirmed" | "charge_not_payable";
|
|
16324
|
+
code: "issuance_unconfirmed" | "charge_not_payable" | "charge_reference_ambiguous";
|
|
15990
16325
|
message: string;
|
|
15991
16326
|
details?: {
|
|
15992
16327
|
[key: string]: unknown;
|
|
@@ -17717,6 +18052,18 @@ export interface paths {
|
|
|
17717
18052
|
receipt_id: string;
|
|
17718
18053
|
/** @enum {string} */
|
|
17719
18054
|
state: "paid" | "delivered" | "exception" | "voided";
|
|
18055
|
+
/** @description WHO triggered the spend, as the caller declared it at payment time. Null when they declared none, and null is the honest answer rather than a gap to fill: it is never inferred from `mandate.scope` or from the agent the mandate was signed for. A null here means nobody said, not that an agent did it. */
|
|
18056
|
+
actor: {
|
|
18057
|
+
/** @enum {string} */
|
|
18058
|
+
type: "agent";
|
|
18059
|
+
id: string;
|
|
18060
|
+
on_behalf_of: string;
|
|
18061
|
+
} | {
|
|
18062
|
+
/** @enum {string} */
|
|
18063
|
+
type: "human";
|
|
18064
|
+
id: string;
|
|
18065
|
+
channel?: string;
|
|
18066
|
+
} | null;
|
|
17720
18067
|
mandate: {
|
|
17721
18068
|
id: string;
|
|
17722
18069
|
nonce: string;
|
|
@@ -17770,6 +18117,10 @@ export interface paths {
|
|
|
17770
18117
|
} | null;
|
|
17771
18118
|
chain: string;
|
|
17772
18119
|
receipt_sig: string;
|
|
18120
|
+
/** @description base64url Ed25519 signature over `codespar-receipt:v1:<receipt_id>:<chain>`, made with the platform issuer key. Verifiable by anyone: fetch `/.well-known/codespar-receipt-keys.json` (no credential), take the key whose `kid` is the one below, and check the signature over that string. Null on a receipt sealed before this existed, and on one sealed while the key could not be resolved — `receipt_sig` is the HMAC seal either way and is unaffected. */
|
|
18121
|
+
receipt_sig_ed25519: string | null;
|
|
18122
|
+
/** @description Which published key signed it, `<did:web:...>#<namespace>-<n>`. Keys rotate and a retired key stays published, so an old receipt names its own key rather than leaving a verifier to try each one. The namespace names the DEPLOYMENT that minted the key (ent#1641), so a kid absent from the key document you fetched means the receipt came from another environment — `unknown_key`, not a tampered receipt. */
|
|
18123
|
+
receipt_sig_kid: string | null;
|
|
17773
18124
|
exceptions: {
|
|
17774
18125
|
code: string;
|
|
17775
18126
|
detail: string;
|
|
@@ -17824,6 +18175,18 @@ export interface paths {
|
|
|
17824
18175
|
receipt_id: string;
|
|
17825
18176
|
/** @enum {string} */
|
|
17826
18177
|
state: "paid" | "delivered" | "exception" | "voided";
|
|
18178
|
+
/** @description WHO triggered the spend, as the caller declared it at payment time. Null when they declared none, and null is the honest answer rather than a gap to fill: it is never inferred from `mandate.scope` or from the agent the mandate was signed for. A null here means nobody said, not that an agent did it. */
|
|
18179
|
+
actor: {
|
|
18180
|
+
/** @enum {string} */
|
|
18181
|
+
type: "agent";
|
|
18182
|
+
id: string;
|
|
18183
|
+
on_behalf_of: string;
|
|
18184
|
+
} | {
|
|
18185
|
+
/** @enum {string} */
|
|
18186
|
+
type: "human";
|
|
18187
|
+
id: string;
|
|
18188
|
+
channel?: string;
|
|
18189
|
+
} | null;
|
|
17827
18190
|
mandate: {
|
|
17828
18191
|
id: string;
|
|
17829
18192
|
nonce: string;
|
|
@@ -17877,6 +18240,10 @@ export interface paths {
|
|
|
17877
18240
|
} | null;
|
|
17878
18241
|
chain: string;
|
|
17879
18242
|
receipt_sig: string;
|
|
18243
|
+
/** @description base64url Ed25519 signature over `codespar-receipt:v1:<receipt_id>:<chain>`, made with the platform issuer key. Verifiable by anyone: fetch `/.well-known/codespar-receipt-keys.json` (no credential), take the key whose `kid` is the one below, and check the signature over that string. Null on a receipt sealed before this existed, and on one sealed while the key could not be resolved — `receipt_sig` is the HMAC seal either way and is unaffected. */
|
|
18244
|
+
receipt_sig_ed25519: string | null;
|
|
18245
|
+
/** @description Which published key signed it, `<did:web:...>#<namespace>-<n>`. Keys rotate and a retired key stays published, so an old receipt names its own key rather than leaving a verifier to try each one. The namespace names the DEPLOYMENT that minted the key (ent#1641), so a kid absent from the key document you fetched means the receipt came from another environment — `unknown_key`, not a tampered receipt. */
|
|
18246
|
+
receipt_sig_kid: string | null;
|
|
17880
18247
|
exceptions: {
|
|
17881
18248
|
code: string;
|
|
17882
18249
|
detail: string;
|
|
@@ -19786,6 +20153,18 @@ export interface paths {
|
|
|
19786
20153
|
receipt_id: string;
|
|
19787
20154
|
/** @enum {string} */
|
|
19788
20155
|
state: "paid" | "delivered" | "exception" | "voided";
|
|
20156
|
+
/** @description WHO triggered the spend, as the caller declared it at payment time. Null when they declared none, and null is the honest answer rather than a gap to fill: it is never inferred from `mandate.scope` or from the agent the mandate was signed for. A null here means nobody said, not that an agent did it. */
|
|
20157
|
+
actor: {
|
|
20158
|
+
/** @enum {string} */
|
|
20159
|
+
type: "agent";
|
|
20160
|
+
id: string;
|
|
20161
|
+
on_behalf_of: string;
|
|
20162
|
+
} | {
|
|
20163
|
+
/** @enum {string} */
|
|
20164
|
+
type: "human";
|
|
20165
|
+
id: string;
|
|
20166
|
+
channel?: string;
|
|
20167
|
+
} | null;
|
|
19789
20168
|
mandate: {
|
|
19790
20169
|
id: string;
|
|
19791
20170
|
nonce: string;
|
|
@@ -19839,6 +20218,10 @@ export interface paths {
|
|
|
19839
20218
|
} | null;
|
|
19840
20219
|
chain: string;
|
|
19841
20220
|
receipt_sig: string;
|
|
20221
|
+
/** @description base64url Ed25519 signature over `codespar-receipt:v1:<receipt_id>:<chain>`, made with the platform issuer key. Verifiable by anyone: fetch `/.well-known/codespar-receipt-keys.json` (no credential), take the key whose `kid` is the one below, and check the signature over that string. Null on a receipt sealed before this existed, and on one sealed while the key could not be resolved — `receipt_sig` is the HMAC seal either way and is unaffected. */
|
|
20222
|
+
receipt_sig_ed25519: string | null;
|
|
20223
|
+
/** @description Which published key signed it, `<did:web:...>#<namespace>-<n>`. Keys rotate and a retired key stays published, so an old receipt names its own key rather than leaving a verifier to try each one. The namespace names the DEPLOYMENT that minted the key (ent#1641), so a kid absent from the key document you fetched means the receipt came from another environment — `unknown_key`, not a tampered receipt. */
|
|
20224
|
+
receipt_sig_kid: string | null;
|
|
19842
20225
|
exceptions: {
|
|
19843
20226
|
code: string;
|
|
19844
20227
|
detail: string;
|
|
@@ -24433,7 +24816,7 @@ export interface paths {
|
|
|
24433
24816
|
"application/json": {
|
|
24434
24817
|
/** @description `did:web:` derived from the org and the handle. */
|
|
24435
24818
|
agent_did: string;
|
|
24436
|
-
/** @description `<agent_did>#<n
|
|
24819
|
+
/** @description `<agent_did>#<namespace>-<n>` — the namespace names the deployment that minted the key (ent#1641). */
|
|
24437
24820
|
kid: string;
|
|
24438
24821
|
/** @description Raw 32-byte Ed25519 public key, base64. */
|
|
24439
24822
|
pubkey: string;
|
|
@@ -24646,7 +25029,7 @@ export interface paths {
|
|
|
24646
25029
|
*
|
|
24647
25030
|
* Takes no body. Unlike rotation, this is the verb that stops a key from counting: the mandate spend gate resolves the key an existing mandate was signed with and refuses the spend once that key is revoked, so revoking reaches BACKWARDS into mandates already issued.
|
|
24648
25031
|
*
|
|
24649
|
-
* `{kid}` is a full key id of the form `<did:web:...>#<n>`, and its `#` MUST be percent-encoded as `%23` to survive as one path segment. This revokes ONE key; it does not revoke the agent identity.
|
|
25032
|
+
* `{kid}` is a full key id of the form `<did:web:...>#<namespace>-<n>`, and its `#` MUST be percent-encoded as `%23` to survive as one path segment. This revokes ONE key; it does not revoke the agent identity.
|
|
24650
25033
|
*
|
|
24651
25034
|
* Revoking an already-revoked key is 409 rather than a no-op, so a retry after a timeout is distinguishable from a first call.
|
|
24652
25035
|
*/
|
|
@@ -24658,7 +25041,7 @@ export interface paths {
|
|
|
24658
25041
|
orgId: string;
|
|
24659
25042
|
/** @description The registration handle, not the `did:web`. */
|
|
24660
25043
|
agentId: string;
|
|
24661
|
-
/** @description `<did:web:...>#<n>`, with the `#` percent-encoded as `%23`. */
|
|
25044
|
+
/** @description `<did:web:...>#<namespace>-<n>`, with the `#` percent-encoded as `%23`. */
|
|
24662
25045
|
kid: string;
|
|
24663
25046
|
};
|
|
24664
25047
|
cookie?: never;
|
|
@@ -32722,7 +33105,7 @@ export interface paths {
|
|
|
32722
33105
|
content: {
|
|
32723
33106
|
"application/json": {
|
|
32724
33107
|
agent_did: string;
|
|
32725
|
-
/** @description `<did>#<n
|
|
33108
|
+
/** @description `<did>#<namespace>-<n>`: the namespace names the deployment that minted the key (ent#1641), n is its ordinal. */
|
|
32726
33109
|
kid: string;
|
|
32727
33110
|
/** @description base64. */
|
|
32728
33111
|
pubkey: string;
|
|
@@ -33618,7 +34001,7 @@ export interface paths {
|
|
|
33618
34001
|
*
|
|
33619
34002
|
* It also changes what counterparties can see. The published `did:web` document lists the identity's keys where status is not `revoked`, so a REVOKED key disappears from it while a RETIRED one stays and keeps verifying its own past issuance. Revoking is the verb for a key you believe is compromised; rotating is the verb for hygiene.
|
|
33620
34003
|
*
|
|
33621
|
-
* `{kid}` is a full kid (`<did>#<n>`), and its `#` MUST be percent-encoded as `%23` so the whole kid arrives as one path segment.
|
|
34004
|
+
* `{kid}` is a full kid (`<did>#<namespace>-<n>`), and its `#` MUST be percent-encoded as `%23` so the whole kid arrives as one path segment.
|
|
33622
34005
|
*
|
|
33623
34006
|
* Idempotency is NOT offered: revoking an already-revoked key is 409, not a repeat of the 200.
|
|
33624
34007
|
*/
|
|
@@ -36029,6 +36412,22 @@ export interface components {
|
|
|
36029
36412
|
session_id?: string;
|
|
36030
36413
|
at?: string;
|
|
36031
36414
|
};
|
|
36415
|
+
/** @description WHO triggered this spend, recorded on the receipt and read back from it. Optional, and absence is a real answer: a spend that sends no actor records `null`, and nothing is ever inferred from `agent_id` — that field names the agent the mandate was SIGNED for, which is an authority, not an event. A person acting through WhatsApp under an agent's mandate and the agent acting unattended are the same row without this field. */
|
|
36416
|
+
PaymentActor: {
|
|
36417
|
+
/** @enum {string} */
|
|
36418
|
+
type: "agent";
|
|
36419
|
+
/** @description The agent's own identifier. */
|
|
36420
|
+
id: string;
|
|
36421
|
+
/** @description The consumer the agent is acting for. It must be the consumer this mandate belongs to; any other value is refused with `actor_consumer_mismatch` before anything is read, held or sent. */
|
|
36422
|
+
on_behalf_of: string;
|
|
36423
|
+
} | {
|
|
36424
|
+
/** @enum {string} */
|
|
36425
|
+
type: "human";
|
|
36426
|
+
/** @description The person's identifier — a user id, not a name. */
|
|
36427
|
+
id: string;
|
|
36428
|
+
/** @description Where the person acted from: `whatsapp`, `dashboard`, `cli`. */
|
|
36429
|
+
channel?: string;
|
|
36430
|
+
};
|
|
36032
36431
|
};
|
|
36033
36432
|
responses: never;
|
|
36034
36433
|
parameters: never;
|