Skip to main content
The Grupo CB framework agreement is a pre-filled document issued by CBPay for a verified company account. CBPay resolves the company’s legal identity, verified address, active services, fees and its current CBPay signature before creating the envelope. If a required value has no verified source, the envelope is not created. The ceremony is completed by a human owner or operator of the company account. It requires explicit consent and a fresh, single-use OTP. API keys cannot sign. For test requests, use 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 returns 404 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 422 contract_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:
Completed response:

Completion event

Subscribe to contract_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:
The signed timestamp and language remain available from the envelope detail. Do not infer completion from email delivery: use the event and the resource state.

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. The verify_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:
The oracle exposes only verification facts: validity, class, envelope state, issuer, client legal name, template version, language, envelope short ID, both hashes, timestamps and which signatures are present. Terms, prices, addresses, emails and any other operational data never leave the server. A tampered or made-up code answers HTTP 404 with the generic message 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 returns available_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.
The PDF response is binary and uses 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

No. It is a reading counterpart. The issued-language PDF remains the signed document and its hash is the verification reference.
English requires counsel approval and the current template. Check available_langs; the portal enables buttons from that field.

FAQ

No. The account must be an active company account with approved KYB, and the signer must be an owner or operator member.
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.
The envelope is rejected with contract_unfillable; CBPay never issues a signed PDF with an unresolved required field.
No. completed is terminal. Void only while the envelope is pending_client, with a reason; then issue a new envelope if needed.
Yes, but use the same envelope and a fresh OTP. The atomic claim prevents a second signature; a completed envelope returns contract_invalid_state.
No. The code stays valid for the life of the envelope. If the envelope is voided, the same code answers failed instead of ok.
Last modified on October 12, 2026