Get payment
API contract v1.0.0
getPayment/v1/payments/{payment_id}Returns the facts currently known for the Payment and how far the outcome has been confirmed. When you receive an old event or suspect a state conflict, rely on the latest status and version returned by this endpoint. An object that doesn't belong to the current merchant or environment returns 404, and its existence isn't revealed. A query only reads the state the platform has already recorded. It doesn't trigger a query to the provider.
Request headers
| Request headers | Required | Format | Description |
|---|---|---|---|
| Authorization | Yes | Bearer <API_KEY> | Server-side key, to be used only on the merchant's server. The merchant and environment are derived from the key. A missing, invalid, revoked or expired key returns 401. |
Request example
curl -X GET 'https://api.fluxan.co/v1/payments/<PAYMENT_ID>' \
-H 'Authorization: Bearer <TEST_SERVER_API_KEY>'Placeholders to replace
<PAYMENT_ID>: The id returned when you create a payment (starts with pay_)<TEST_SERVER_API_KEY>: Test-environment server API key, created on the "API Key" page of the merchant portal
Note
Server API keys must only be used on your own server, so the docs site doesn't offer interactive API testing. Get a test key: API Key page in the merchant portal (opens the merchant portal in a new tab) (Test environment; Requires Owner, Admin or Developer)
Responses
The payment details.
{
"id": "pay_demo_001",
"merchant_order_no": "ORDER-DEMO-001",
"environment": "test",
"amount": 10000,
"currency": "USD",
"status": "succeeded",
"resolution_status": "known",
"captured_amount": 10000,
"refunded_amount": 0,
"refund_returned_amount": 0,
"refund_reserved_amount": 0,
"refund_status": "none",
"authentication_status": "authenticated",
"reconciliation_status": "pending",
"upstream_receipt_status": "not_received",
"latest_attempt_id": "pat_demo_001",
"attempt_count": 1,
"version": 4,
"next_action": null,
"failure": null,
"description": "Example order",
"customer_reference": "CUSTOMER-DEMO-001",
"metadata": {
"business_order_type": "one_time_purchase"
},
"card": {
"brand": "visa",
"last4": "1234"
},
"created_at": "2026-09-23T09:00:00Z",
"succeeded_at": "2026-09-23T09:04:30Z",
"expires_at": "2026-09-23T09:30:00Z",
"request_id": "req_demo_028"
}Response fields
Returns an object. See the object section for field descriptions.
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Required | Platform payment ID. Example: |
merchant_order_no | string | Required | Merchant order ID, case-sensitive as sent. Example: |
environment | string | Required | Environment: test is the test environment and live is the live environment. Test and live objects are isolated from each other.
Example: |
amount | integer(int64) | Required | Order amount, in the smallest currency unit. It can't be changed after the first submission to the provider. Constraints: Example: |
currency | string | Required | Uppercase three-letter currency code. Constraints: Example: |
status | string | Required | Payment status. Clients must not treat an unknown status as success.
Example: |
resolution_status | string | Required | Outcome confirmation.
Example: |
captured_amount | integer(int64) | Required | The amount confirmed as captured; equal to amount on success. Constraints: Example: |
refunded_amount | integer(int64) | Required | The confirmed effective refunded principal: the total of successful refunds minus confirmed refund returns. It excludes refunds that are still processing and platform exception refunds. Constraints: Example: |
refund_returned_amount | integer(int64) | Required | The cumulative refund principal confirmed as returned. Constraints: Example: |
refund_reserved_amount | integer(int64) | Required | Principal reserved for refunds that are under review or processing. Constraints: Example: |
refund_status | string | Required | Refund summary status, derived from refunded_amount (the effective refunded principal): none, partial, full.
Example: |
authentication_status | stringNullable | Required | The 3DS authentication status of the current attempt, taken from the authentication session status: not_required, pending, challenge, authenticated, failed, abandoned, expired. Tolerate new values. Successful authentication (authenticated) doesn't mean the charge succeeded, so don't use it to decide the payment outcome. It's null when there is no attempt yet or the attempt hasn't entered authentication. Example: |
reconciliation_status | ReconciliationStatus | Required | The progress of the platform's funds processing, for reconciliation reference only. It doesn't indicate whether the payment succeeded or when you'll be paid out.
|
upstream_receipt_status | UpstreamReceiptStatus | Required | The progress of the platform's funds processing, for reconciliation reference only. It doesn't indicate whether the payment succeeded or when you'll be paid out.
|
latest_attempt_id | stringNullable | Required | ID of the latest payment attempt; null if no attempt has been submitted yet. Example: |
attempt_count | integer(int32) | Required | The number of attempts started. The default maximum is 3. Constraints: Example: |
version | integer(int64) | Required | Object version, which increases with every effective business change. Compare versions to discard older events, and don't order events by status name. Constraints: Example: |
next_action | NextActionNullable | Required | The action the payer must complete when status=requires_action; null in all other cases. |
type | string | Required | The initial release of the public API exposes only redirect_to_url. Clients must tolerate types that are added in the future.
Example: |
authentication_session_id | string | Required | Authentication session ID, linked to a specific payment attempt. Example: |
url | string(uri) | Required | The URL of the platform's authentication page. Example: |
expires_at | string(date-time) | Required | The time the authentication access expires (10 minutes at most). Example: |
failure | PaymentFailureNullable | Required | The reason when the attempt that latest_attempt_id points to has clearly failed; otherwise null. |
code | string | Required | Failure reason code. Example: |
message | string | Required | Sanitized description. Example: |
attempt_id | string | Required | ID of the failed payment attempt. Example: |
description | string | No | Order summary. Constraints: Example: |
customer_reference | string | No | Merchant-side customer reference. Constraints: Example: |
metadata | object | No | Custom key-value pairs set by the merchant: up to 20 keys. A key can be up to 40 characters, and a value is a string of up to 200 characters. Don't put sensitive data such as card numbers in it. The platform checks for such data and rejects the request. Constraints: Example: |
card | CardSummaryNullable | Required | Masked details of the card used in the latest attempt; null when there are no card details yet. |
brand | string | Required | Card brand. Example: |
last4 | string | Required | Last four digits of the card number. Constraints: Example: |
created_at | string(date-time) | Required | Creation time. Example: |
succeeded_at | string(date-time)Nullable | Required | The time the payment was confirmed as successful; null if it hasn't succeeded. Example: |
expires_at | string(date-time) | Required | The deadline for starting a new attempt, fixed at creation (by default 30 minutes after creation; the platform can adjust it to between 5 and 120 minutes, so go by this field). Expiry only closes the entry point for new attempts. It doesn't invalidate a payment that was already submitted. Example: |
request_id | string | Required | Unique identifier of this request, used for troubleshooting and support. Example: |
Possible error codes
| HTTP | Error code | When it occurs | How to handle |
|---|---|---|---|
| 404 | not_found | An incorrect ID; using a test key to look up a live object; looking up a platform exception refund (not returned by the open API) | Check the ID and the environment of the key you used; the platform doesn't reveal whether another merchant's object exists |
| 401 | unauthenticatedCommon | No Authorization header was sent; the key was copied incompletely; the old key expired after a rotation; the key was revoked | Check your credentials: on the API Key page in the merchant portal, verify the key's status and environment |
| 403 | forbiddenCommon | Creating a refund with a read-only key; calling getEvent without the read scope for the event's business area; if the request's source IP isn't on the key's allowlist, the more specific ip_not_allowed is returned | Use a key that has the required scope; don't work around the restriction |
| 429 | rate_limitedCommon | A rate limit per merchant and per key; switching keys doesn't get around the merchant's overall limit | Wait for Retry-After seconds, then retry with the original idempotency key |
| 500 | internal_errorCommon | — | Retry with the original idempotency key, or query by merchant order ID / refund ID; never charge again with a new key |
| 502 / 503 | upstream_unavailableCommon | A provider or platform dependency failed, and the platform can't confirm whether this request took effect | Same as above |
Notes
- Returns the facts currently known and how far the outcome has been confirmed (
resolution_status). When you receive an old event or suspect a conflict, rely on the status andversionthis endpoint returns. - A query only reads the state the platform has already recorded. It doesn't trigger a query to the provider. For how often to poll, see Recommended polling frequency.
- An object that doesn't belong to the current merchant or environment returns 404, and the platform doesn't reveal whether the object exists.