Skip to main content
GET
Poll the lifecycle of a full_enrollment session created by Enroll Card. This endpoint is server-to-server and returns no payment token, dynamic CVV, cryptogram, order, or transaction. GET /v1/sessions/{sessionId}/status · Authenticated with the same merchant secret key that created the session.
This endpoint supports only full_enrollment card sessions. Payment sessions must use Get Payment Result; calling the wrong status resource returns 409.

Path parameters

string
required
The session_id returned by POST /v1/sessions/enroll-card when enrollment_mode is full_enrollment.

Response

The JSON shape is stable across pending work, recoverable failures, success, cancellation, and expiry.
string
Enrollment session identifier.
string
Session lifecycle: requires_action, processing, completed, failed, cancelled, or expired.
string
Durable work completed: not_started, card_provisioned, or fully_enrolled.
string | null
Merchant-scoped card identifier. It becomes non-null after card provisioning succeeds, even if later passkey work is incomplete or fails.
string | null
registered when this flow created a passkey, existing when it verified an already available passkey, or null before passkey completion.
provided when the create request included consent_id; otherwise not_provided. This reports reference presence, not independent proof of consent.
object | null
Safe failure information: code, message, and retryable. It is null when no failure is active and after completion or cancellation.

How to interpret status and outcome

Enrollment success is exactly status: "completed" together with outcome: "fully_enrolled". Do not infer full enrollment from a non-null card_id: card_id proves only that card provisioning completed.

API compatibility note — upcoming webhook release

For an unfinished full-enrollment session, revocation at or after expires_at returns status: "expired". Earlier versions reported cancelled after any revocation. Revocation before expiry remains cancelled, including on repeated revoke calls after the deadline. Persisted completion and non-recoverable failure retain their existing precedence. The response fields and status enum are unchanged. Action required: If your integration treats every revoked session as cancelled, handle expired as a terminal result too. Stop polling in either case; create a new session only if the cardholder wants to continue. This matches the enrollment webhook event chronology.

Retry behavior

When error.retryable is true, the cardholder retries inside the existing iframe:
  • Do not call a retry API—there is no public retry endpoint.
  • Do not create another enrollment session.
  • Do not ask the cardholder to select or enter the card again after card_id exists.
  • Keep polling this same session_id while the cardholder selects Try again.
Prava retains the selected/provisioned card and restarts only the recoverable enrollment step. Incorrect OTP attempts remain inside the card-network experience and do not require merchant-side state.

Examples

Polling example

Poll from your backend, not the browser. A practical starting cadence is once per second while the cardholder is active, backing off toward five seconds during longer processing. The endpoint is limited to 120 requests per minute.

Error responses

Enrollment lifecycle failures use HTTP 200 with the stable response above. HTTP errors mean the status request itself could not be served. Every response includes an X-Response-ID header. Include it when contacting support@prava.space.

Authorizations

Authorization
string
header
required

Your secret key: sk_test_* (sandbox) or sk_live_* (production).

Path Parameters

sessionId
string
required

The session_id returned for a full_enrollment request

Response

Current card-enrollment lifecycle

session_id
string
required
status
enum<string>
required

Lifecycle state of the interactive session.

Available options:
requires_action,
processing,
completed,
failed,
cancelled,
expired
outcome
enum<string>
required

The durable enrollment work that has completed.

Available options:
not_started,
card_provisioned,
fully_enrolled
card_id
string | null
required

Merchant-scoped card identifier after provisioning.

passkey
enum<string> | null
required

Whether this flow registered a passkey, verified an existing one, or has not completed passkey readiness.

Available options:
registered,
existing,
null

Whether consent_id was supplied on session creation.

Available options:
provided,
not_provided
error
null | object
required