https://cryptobank.qbank.cl/platform; use
https://api.qbank.cl/platform only for production.
Eligibility and states
The account must be an active company account with approved KYB. The envelope is scoped to the organization and the account; a foreign ID returns404 not_found.
There is no
draft or generic pending state.
For lang=en, the organization must have the platform setting
contract_counsel_approved_en=true. Spanish issuance does not require that
English-counsel gate. The document template is version v13.3; its hash and
the CBPay signature version are frozen in the envelope snapshot.
Pricing coverage and displayed amounts
The organization issue endpoint checks pricing coverage before creating the envelope. If an enabled service has no effective fee row, it returns HTTP 422contract_unfillable with a missing array containing values in the form
pricing:<flag>. An explicit zero-percent, zero-fixed row is a valid free
configuration. transfers and swaps are exempt from this fee-row gate.
Operationally, the v13.3 agreement body no longer embeds a flat fixed-price
table. Appendix A points to the current Client Fee Schedule/Program, and its
applicable entries are grouped with localized pricing labels matching the
portal/admin pricing board, including Fiat payments, Compliance, Cards,
Banking, Wallets and Other. The effective configuration captured at issue
governs; an organization administrator must repair missing pricing and issue a
new envelope.
The internal margins fx_spread, settlement_spread and swap_spread do not
appear in the account-facing fill_snapshot or the PDF pricing appendix. The
organization-admin view retains the complete pricing snapshot for audit.
Ceremony
1
List and open the envelope
Use
GET /v1/me/contracts/envelopes and then
GET /v1/me/contracts/envelopes/{envelopeID}. The list uses page and
page_size (default 50, maximum 200). The list response uses items;
the detail response includes append-only events, with each event name in
event.2
Download the document before signing
GET /v1/me/contracts/{envelopeID}/pdf returns PDF bytes. Save the file
and make sure the legal name, address, service schedule and fee schedule
are correct. The document is pre-signed by CBPay, but remains
pending_client until the ceremony is completed.3
Provide signer identity and consent
Send the signer’s name and title in the JSON body. Consent must be the
JSON boolean
true. Include the client’s handwritten signature as
signature_png, a Base64-encoded PNG. The optional
data:image/png;base64, prefix is accepted. The OTP is not a JSON
code field: send the fresh single-use token in the X-OTP-Token header.4
Confirm completion
A successful response returns the envelope in
completed. Read the
resource again and download the PDF so your system stores the final
final_hash. The contract_envelope_completed event is delivered to the
organization-admin audience. The completed client claim also automatically
records the Client Journey milestone contract_signed with actor
system:contract-ceremony; this is not a manual admin milestone.Client signature image
signature_png is required on every client signing request. The API accepts a
Base64-encoded PNG with or without the data:image/png;base64, prefix. Before
claiming the envelope, it decodes and validates the image: at most 700,000
Base64 characters, at most 512 KiB decoded, minimum dimensions of 64×16
pixels, and at least 200 ink pixels. A failure returns HTTP 422
invalid_signature_image; the message identifies the validation cause.
After a successful claim, the PNG is embedded in the Client signature block
of the final PDF. List and detail responses expose only the boolean
has_client_signature; the signature bytes and storage key are never returned.
Earlier envelopes without a stored image continue to render the textual
signature block.
Signing notification
When an envelope is issued or reissued, the account receives a notification email with the pre-signed PDF attached. When the portal URL is configured, the email includes a Review and sign button and the same/contracts/{id}
deep-link as plain text. Email delivery is best-effort; use the envelope
resource and its events as the source of truth.
Response examples
List response:Completion event
Subscribe tocontract_envelope_completed to update an organization-admin
queue. The event is organization-admin only; the account receives the final
PDF by email and can read it through its own envelope endpoints.
The current platform payload is:
Errors and solutions
Public contract verification
Every final PDF carries a verification block on the signature page: a QR code with the public oracle URL plus a caption with the same URL and the 12-hex short document hash. Anyone with the code can confirm the document is genuine, without an account or API key. Theverify_code travels in the envelope detail (GET /v1/me/contracts/envelopes/{envelopeID}) and in the organization-admin
envelope detail, so the client can always recover the link. The code starts
with K, followed by the envelope identity and a truncated HMAC
(1+32+20 characters); it cannot be forged or enumerated.
Browsers receive a branded HTML card; API clients send
Accept: application/json (or no Accept header) and receive JSON:
this verification code does not correspond to any contract issued by this platform; requests are rate-limited per IP (429 too_many_attempts).
Download in both languages
The envelope detail returnsavailable_langs, starting with the issued language — ["es"] or ["es", "en"] for a Spanish-issued envelope (mirrored for English-issued). This field is authoritative for portal buttons. English requires counsel approval and the current template.
contrato-marco-<short>.pdf for Spanish or master-agreement-<short>.pdf for English. Requesting the other language renders the same envelope from its frozen snapshot; it is not stored or hashed separately. The cover identifies the signed PDF, its hashes, Spanish precedence under ?11 and the verification-oracle URL. The counterpart is not a second signed document.
Issuance and signature emails mention the other portal language only when it is servable; English is omitted without counsel approval.
FAQ
Does the translated PDF count as the signed agreement?
Does the translated PDF count as the signed agreement?
No. It is a reading counterpart. The issued-language PDF remains the signed document and its hash is the verification reference.
Why do I not see English?
Why do I not see English?
English requires counsel approval and the current template. Check
available_langs; the portal enables buttons from that field.FAQ
Can a person account sign the agreement?
Can a person account sign the agreement?
No. The account must be an active company account with approved KYB, and
the signer must be an owner or operator member.
Can I submit an OTP code in the JSON body?
Can I submit an OTP code in the JSON body?
No. The current handler consumes a fresh single-use token from the
X-OTP-Token header. A JSON code property is not the signing contract.What happens if the PDF has a blank field?
What happens if the PDF has a blank field?
The envelope is rejected with
contract_unfillable; CBPay never issues a
signed PDF with an unresolved required field.Can an organization void a completed envelope?
Can an organization void a completed envelope?
No.
completed is terminal. Void only while the envelope is
pending_client, with a reason; then issue a new envelope if needed.Can I retry the sign request?
Can I retry the sign request?
Yes, but use the same envelope and a fresh OTP. The atomic claim prevents
a second signature; a completed envelope returns
contract_invalid_state.The verification link answers 404. Is my contract lost?
The verification link answers 404. Is my contract lost?
No. HTTP 404 with
this verification code does not correspond to any contract issued by this platform means the code was typed or copied
wrong, or it belongs to a different envelope. Read verify_code again
from the envelope detail or scan the QR printed on the signature page;
the oracle never confirms or denies the existence of other envelopes.Does a verification code expire?
Does a verification code expire?
No. The code stays valid for the life of the envelope. If the envelope is
voided, the same code answers
failed instead of ok.