Check Status Manually

Check a payment's outcome when you can't wait for the webhook, and which status to trust.

While we recommend using webhooks for real-time updates, you can also check the status of a payment at any time by polling the API. This is useful in several cases:

  • When a customer returns to your success_url and you need to confirm the final status before showing an order confirmation.
  • For reconciliation scripts that check the status of pending orders.
  • As a fallback if your webhook endpoint fails.

Option 1: session status

This is the most common method. Use the session_id to retrieve the full session object, which includes the latest status and transaction_status.

GET
/checkout/v1/sessions/{id}

Authorization

Authorization
Authorization<token>

Your public API key, with the word Token and a space in front of it. Example: Token 6534bc0a7e1f4d2b9c8e3a5f7b1d2c4e6f8a9b0c — that whole value is the header. Sending the key alone returns 401 'Authentication credentials were not provided'. In this playground you may paste just the key; the prefix is added for you.

In: header

Path Parameters

id*string

The Session ID (e.g., sess_a1b2c3d4e5f6)

Response Body

application/json

curl -X GET "https://example.com/checkout/v1/sessions/sess_a1b2c3d4e5f6"
{
  "id": "cs_97_41521_d11ba771527b4056c7f85786cfbb980bc105efaf42af113d",
  "url": "https://stage-payflow.tonder.io/checkout/cs_97_41521_d11ba771527b4056c7f85786cfbb980bc105efaf42af113d",
  "status": "completed",
  "payment_id": 41521,
  "amount_total": 350,
  "currency": "MXN",
  "expires_at": 1751564943,
  "external_id": "ORD-12345",
  "session_type": "payment",
  "checkout_type": "hosted",
  "return_url": "https://my-store.com/checkout/complete",
  "metadata": {},
  "payment_method_types": [
    "card"
  ],
  "ui_config": {},
  "ui_config_version": "V1",
  "created_at": 1751478543567,
  "modified_at": 1751478550234,
  "paid_at": 1751478550234,
  "customer": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@example.com"
  },
  "line_items": [
    {
      "name": "Product 1",
      "quantity": 1,
      "unit_price": 350,
      "product_id": "prod-001"
    }
  ],
  "transaction_status": "Success",
  "provider": "tonder"
}

Option 2: transaction details

If you have a payment_id (from the session object or a webhook), you can retrieve details for that specific transaction.

GET
/checkout/v1/payments/{payment_id}

Authorization

Authorization
Authorization<token>

Your public API key, with the word Token and a space in front of it. Example: Token 6534bc0a7e1f4d2b9c8e3a5f7b1d2c4e6f8a9b0c — that whole value is the header. Sending the key alone returns 401 'Authentication credentials were not provided'. In this playground you may paste just the key; the prefix is added for you.

In: header

Path Parameters

payment_id*string

The Payment ID (e.g., pay_x1y2z3a4b5)

Response Body

application/json

curl -X GET "https://example.com/checkout/v1/payments/pay_x1y2z3a4b5"
{
  "payment_id": "pay_x1y2z3a4b5",
  "session_id": "sess_a1b2c3d4e5f6",
  "status": "Success",
  "amount": 350,
  "currency": "MXN",
  "payment_method_type": "card",
  "created_at": "2025-10-20T14:30:00Z",
  "card_details": {
    "brand": "visa",
    "last4": "4242"
  },
  "customer": {
    "name": "John Doe",
    "email": "john.doe@example.com"
  }
}

For order fulfillment, base your logic on the transaction status (transaction_status, or the status returned by GET /checkout/v1/payments/{payment_id}), not on the session status. The session status may not reflect the final payment result. See the meaning of each value in the Reference.

Next steps

Was this page helpful?

On this page