By Maya Patel, payments integration analyst with 8 years of API and webhook support experience
Last reviewed: July 30, 2026
Finix provides separate sandbox and live APIs for creating payments, authorizations, refunds and merchant records. Developers should attach a unique idempotency_id to supported money-moving requests so that a timeout or repeated checkout submission does not initiate the same transaction twice. This independent guide is not affiliated with or operated by Finix.
Webhooks report later state changes, but they should not be treated as the only copy of a payment record. Store the original API response, verify webhook authenticity and fetch the current Finix resource when an event arrives out of order.
What is the Finix API?
The Finix API is a resource-oriented payment interface that uses JSON requests and standard HTTP methods. Its resources include Authorizations, Transfers, Payment Instruments, Merchants, Settlements, Disputes, Refunds, Devices and Webhooks.
Finix provides two separate environments:
| Environment | Purpose |
|---|---|
| Sandbox | Building and testing an integration |
| Live | Processing real payments |
The accounts use different API credentials and base URLs. Data created in the sandbox does not appear in the live environment, and sandbox credentials cannot be assumed to work against production.
Check the hostname first.
A payment that appears to be missing may have been created under the other environment. This frequently happens after a developer switches the front end to live mode while a background service continues using a sandbox configuration.
Finix also uses API version headers. A production integration should send the version expected by its implementation rather than relying on examples copied without checking the current documentation.
Why can a checkout create two charges?
Duplicate charges usually begin with uncertainty.
The buyer presses the payment button, but the page appears to hang. The application does not know whether Finix received the request, so the buyer presses the button again or the server automatically retries it.
Without duplicate protection, those requests may create separate payment resources.
Finix addresses this through idempotency_id. The developer generates a unique value and includes it with a supported request. Finix recommends a UUID, which is a 128-bit identifier commonly represented as a 36-character string.
The same identifier must remain attached to the same logical transaction.
| Situation | Correct idempotency behavior |
| Buyer presses once | Generate one unique ID |
| Network times out | Retry with the same ID |
| Buyer presses again for the same order | Reuse the existing order’s ID |
| Buyer begins a genuinely new purchase | Generate a new ID |
| Payment amount changes | Do not reuse the earlier request as though it were identical |
Finix documents idempotency for Transfers, Authorizations and transfer reversals. Its recent release notes also state that an idempotency_id can be included when creating a refund or reversal, reducing the risk of duplicate refunds.
Disable the pay button after submission, but do not rely on that browser control alone. Mobile reconnects, server retries and impatient users can bypass front-end protection.
What happens when the same ID is submitted again?
Finix stores the idempotency identifier in relation to the supported endpoint. Its documentation says a repeated identical request produces a 422 Unprocessable Entity response rather than initiating another transaction.
That response should not automatically be shown to the buyer as “payment failed.”
It may mean the first request already reached Finix.
The application should locate the earlier result associated with the order and idempotency value, then fetch the corresponding Authorization, Transfer or refund resource before deciding what happened.
A weak integration follows this pattern:
- Request times out.
- Application retries with a new identifier.
- Both payments succeed.
- Buyer sees two charges.
A safer integration retains the original identifier and reconciles the response.
Finix notes that idempotency is scoped to the endpoint. The same string being evaluated on one endpoint does not necessarily protect an unrelated action on another endpoint.
Use one business-operation record that maps the internal order to the Finix resource, endpoint and idempotency identifier.
How do Finix webhooks work?
A webhook lets Finix send an HTTP POST request to a configured endpoint when an API resource is created or updated. Examples include a Transfer being created, a Merchant becoming approved or a Dispute being won.
This solves the asynchronous-state problem.
A merchant onboarding request may remain under review after the original API call returns. An ACH transaction can change later. A dispute can move through several states. Constantly polling every resource would be inefficient, so Finix sends event notifications.
Webhooks can be created through the API or Dashboard. Finix allows the integration to:
- Set the endpoint URL
- Select subscribed events
- Use Basic or Bearer authentication
- Disable the webhook
- Verify the
Finix-Signatureheader - Inspect previously sent events in webhook logs
Finix recommends authenticated webhooks in production. An unauthenticated endpoint should be limited to sandbox testing.
Authentication and signature verification are separate checks. Using both creates stronger evidence that the request was intended for the application and originated from Finix.
Why won’t Finix create my webhook?
When a webhook is created through the API, Finix sends an empty test event to the configured URL. The endpoint must respond successfully before Finix enables the webhook.
A configuration can fail when:
- The URL returns
404 - The route accepts
GETbut notPOST - Authentication rejects the test
- TLS or certificate configuration fails
- A firewall blocks Finix
- The endpoint waits too long
- The application expects a populated event body
Finix’s documented failed-creation example reports that the configured URL returned HTTP 404.
Accept the empty validation request first. Skip business-event parsing until the endpoint has confirmed that the incoming body actually contains an event.
Production handlers should also return a successful response quickly and perform slower processing through a queue. A webhook endpoint that waits for inventory, email and accounting updates before responding creates unnecessary timeout risk.
Can webhook events arrive more than once?
Payment integrations should be designed as though an event may be delivered more than once or processed after a newer event.
That is a standard defensive practice for webhook systems. Finix’s idempotency protection applies to supported API requests; it does not mean the merchant’s webhook consumer can safely repeat every internal action whenever it sees another notification.
For example, a repeated payment event must not:
- Ship a second product
- Add revenue twice
- Send two customer receipts
- Credit an account twice
- Trigger duplicate marketplace payouts
Store the Finix resource ID and relevant state transition before carrying out the business action. If that event or transition has already been processed, acknowledge it without repeating the effect.
Do not rely on event arrival order. Fetch the current resource from Finix when the order matters, because a delayed notification may describe an earlier state than the one now held by the API.
The webhook is a signal.
The resource is the current record.
How long are webhook logs available?
Finix’s Webhook Logs display webhooks sent during the previous 30 days. The logs can be used to find events and debug delivery problems.
Thirty days is useful for recent incidents, but it is not a permanent business archive.
An integration should retain its own event-processing records, including:
- Finix event or resource identifier
- Reception time
- Authentication result
- Processing result
- Retry count
- Related internal order
- Error message
- Final reconciliation status
Do not wait beyond the log window to investigate a missing event. Once Finix’s searchable history has expired, reconstructing the sequence may depend on the merchant’s own database and resource-fetch history.
Finix’s logs help answer whether a webhook was sent. Application logs answer what the merchant’s server did with it.
What do Finix API error codes mean?
Finix uses standard HTTP status codes. A 2xx response indicates success, while 4xx and 5xx responses indicate failed requests. Finix says API responses typically return in under one second, although processor or card-network communication may add latency. The maximum documented API-request timeout is five minutes.
| HTTP code | Finix meaning | First check |
400 | Request cannot be parsed | JSON syntax and formatting |
401 | Authentication failed | Environment and API credentials |
402 | Upstream processor error or decline | Failure code and message |
403 | Credentials lack permission | Account role or API access |
404 | Resource not found | Resource ID and environment |
409 | Request conflicts with current state | Existing dispute or resource status |
422 | Valid parameters but operation failed | Idempotency or business-rule error |
429 | Rate limit reached | Retry strategy and request volume |
Finix returns a failure_code and failure_message when a payment is declined. Those fields are more useful than the HTTP status alone because they can distinguish an issuer decline from a card-network error or Finix fraud decision.
Preserve both fields internally.
A generic buyer message may be appropriate for security, but support staff need the actual reason to determine whether another attempt is sensible.
What causes a 409 Conflict?
A 409 means the requested action conflicts with the resource’s present state.
One documented example occurs when a merchant tries to refund or reverse a payment after a dispute has opened. Finix rejects the action because the disputed funds are already being handled through the chargeback process.
Other conflicts may arise when an application:
- Attempts an action that is no longer permitted
- Repeats a state transition
- Uses an outdated understanding of the resource
- Modifies a record that has already moved forward
Fetch the current resource before retrying a 409.
Repeating the identical request without examining the state usually produces the same result and can hide the underlying workflow mistake.
How should a 429 rate-limit error be handled?
Finix returns HTTP 429 TOO_MANY_REQUESTS when an integration exceeds an API rate limit. Its documentation tells developers to include error handling for this response and reduce excessive programmatic requests.
Do not retry immediately in a tight loop.
Use delayed retries with increasing intervals, limit concurrency and replace unnecessary polling with webhooks. Requests should also be consolidated where the API provides list or filtered-resource operations.
A practical pattern is:
- Stop the immediate retry loop.
- Queue the request.
- Wait before the next attempt.
- Increase the delay after another
429. - Alert the integration team if the queue continues growing.
The exact rate limit may depend on the account or endpoint. Finix does not publish one universal number on the reviewed public page.
Finix API FAQ
Does Finix prevent duplicate charges automatically?
Only when the integration uses the supported idempotency control correctly.
What should I do after a payment timeout?
Retry the same logical payment with the same idempotency_id, then fetch the original Finix resource. Do not generate a new ID merely because the first response was not received.
Why does a repeated request return 422?
Finix may be rejecting a repeated idempotent operation. Check whether the first request already created the Authorization, Transfer or refund before telling the buyer that payment failed.
Should production webhooks use authentication?
Yes. Finix recommends authenticated webhooks in production and supports Basic or Bearer authentication together with signature verification.
Why did webhook creation fail with 404?
Finix tests the endpoint during creation. A 404 means the configured route did not successfully accept the validation request. Confirm the exact URL and that it accepts an empty HTTP POST.
Can I recover an old webhook from Finix?
Webhook Logs cover the past 30 days. Older event history should be retained in the integration’s own logging and reconciliation system.
What does Finix error 429 mean?
The application reached an API rate limit. Reduce request volume and retry later rather than immediately repeating the call.
Assign one idempotency identifier to each payment operation, make webhook processing repeat-safe and use the Finix resource state as the final reference before shipping goods, issuing money or changing an account balance.