JSR — Journey without redirection
Lina's initiation APIs for JSR (Journey without redirection / redirectless) are designed to shorten integration time so you can offer a modern payment experience on Open Finance — including Instant Pix and Scheduled Pix after the payer completes a one-time enrollment at their bank.
Automatic Pix (automatic payments) will follow different routes; that flow will be documented separately.
Part 1 — Enrollment (link the device once)
Before any redirectless payment, the end user must complete an enrollment:
your app opens a bank redirect once, the user confirms the link at the
account holder, then your relying-party page receives OAuth-style
parameters in the URL fragment (#), not the query string.
- Obtain an access token (same OAuth pattern as the rest of Lina Pay).
- Call
GET /api/v1/open-integration/participants/registered(orGET /api/v1/sub-tenants/{subTenantId}/participants/most-usedfor a prioritized list) so the user can pick an institution. - Call
POST /api/v1/jsr/enrollmentswithorganisationId,authorisationServerId, nestedenrollmentdata,riskSignals, andredirectUri. The API returnsid(treat this as the enrollment identifier for later paths) andredirectUrlwhere the user completes consent at the bank. - After the bank finishes, the browser lands on your
redirectUrlwith a fragment such as#code=...&id_token=...&state=.... Parse the fragment and sendcode,state, andid_tokenascode,state, andidTokentoPOST /api/v1/jsr/enrollments/device/options(plustenantIdandplatform). - Use the returned FIDO2 registration options with
navigator.credentials.create()on the user's device. - POST the WebAuthn credential payload to
POST /api/v1/jsr/enrollments/<id>/device(see Register enrollment device). WhenstatusisAUTHORISED, enrollment is complete and you can offer redirectless payments for that link.
Part 2 — Redirectless payment (after enrollment)
Precondition: an enrollment exists with status AUTHORISED.
- The user selects which enrollment to pay with (
enrollmentId). Optionally callPOST /api/v1/pix/detailsfirst to resolve and display a Pix key or QR Code before building the payment payload. - Call
POST /api/v1/jsr/consentswithenrollmentIdand thepaymentpayload — the institution and FIDO relying-party context are already resolved from the enrollment, so they aren't sent again here. The response is 201 withid(the payment request id),consentId, and FIDO2 assertion options (fidoSignOptions). - Trigger
navigator.credentials.get()with those options (biometrics, PIN, security key, etc.) and collect the assertion. - Call
POST /api/v1/jsr/paymentswithenrollmentId,paymentRequestId(theidfrom step 2),riskSignals, andfidoAssertion(the WebAuthn assertion from step 3). Lina accepts the instruction and settles with the ASPSP asynchronously. - This call responds immediately with
status: RECEBIDOon the payment leg — settlement hasn't happened yet. Confirm the outcome withGET /api/v1/payments/requests/{paymentRequestId}, or wait for the webhook. See Authorise payment for the full explanation of the asynchronous processing, webhook, and polling fallbacks. - Render success or failure from the payment request payload (
statussuch asPAGOor terminal error states;RECEBIDO/EM_PROCESSAMENTOmean it's still pending).
After the payment: webhook, polling, and asynchronous processing
The POST /api/v1/jsr/payments call above responds immediately with
status: RECEBIDO — it does not wait for a final status before responding.
See How payment status settles
on the Authorise payment reference page for the full breakdown of the
asynchronous processing, the webhook, Lina's internal retries, and the
optional client-side polling endpoint
(Get payment from holder).
Payment status values
The status enums below come back on the POST /api/v1/jsr/payments response
and on GET /api/v1/payments/requests/{paymentRequestId}. The request-level
status describes the overall consent state, while the payment-level status
describes each payment inside the request.
Payment request status
| Status | Meaning |
|---|---|
PENDENTE | The consent has been created but the user has not authorized it yet. |
EM_PROCESSAMENTO | The consent is being processed by the account holder. |
CONSUMIDO | The consent was authorized and the payment(s) were submitted. This is the terminal happy-path status. |
EXPIRADO | The consent expired before the user authorized it. |
CANCELADO | The consent was cancelled before completion. |
ERRO_NA_DETENTORA | The account holder returned an error while processing the consent. |
ERRO | Generic error state during consent processing. |
Payment status
| Status | Meaning |
|---|---|
RECEBIDO | The payment instruction is received and queued for asynchronous processing. Keep polling — it will move to EM_PROCESSAMENTO, PAGO, REJEITADO, or another terminal status next. |
PENDENTE | The payment is scheduled but not settled yet (common for future-dated payments). |
EM_PROCESSAMENTO | The payment is being settled by the account holder. |
PAGO | The payment was settled successfully. This is the terminal happy-path status. |
REJEITADO | The account holder rejected the payment. |
EXPIRADO | The payment expired before settlement. |
CANCELADO | The payment was cancelled. |
ERRO_NA_DETENTORA | The account holder returned an error during settlement. |
ERRO | Generic error state during payment processing. |
PROGRAMADO | The payment is scheduled for a future settlement date. |
AGUARDANDO_VALOR | Waiting on the value to be resolved (for example, from a QR Code) before settlement can proceed. |
PRONTO_PARA_ENVIO | The payment is queued and ready to be sent to the account holder. |
EXCLUIDO | The payment was deleted before it was sent. |
Automatic payments
Automatic Pix uses additional routes and a different sequence diagram. That documentation will be added in a future iteration.