Skip to main content
Integrating with the Paymove payment gateway consists of four steps: you create a product, register a webhook, assign it to the product, and then create payments via the SDK or REST API.

1. Create a product

A product represents your store in the Paymove system. All payments and subproducts are created within this product. Example product creation request:

2. Register a webhook

A webhook is a URL on your side that Paymove calls whenever a payment status changes. This way you don’t need to manually check the status - orders can be fulfilled automatically. For the list of possible statuses, see the status table. Example webhook registration request:

How the webhook works

By default the webhook is sent only for the COMPLETED status. Notifications for the remaining statuses (CANCELED, ERROR, REFUNDED) must be enabled by Paymove for your specific product - write to integration@paymove.io.
Payment statuses in Paymove:
The status is always sent as a string (e.g. "COMPLETED"). The numbers found in older integrations are an internal database representation and never appear in the API or in webhooks.

Webhook payload

The payload shape depends on whether you set a requestTemplate. Without a requestTemplate Paymove sends the full object (empty fields are omitted):
In the default payload, price is the amount minus the Paymove fee, not the amount charged to the customer. If you verify the amount, compare it against the value you stored when creating the payment, not against this field.
With a requestTemplate the payload is exactly what your template renders. For the template from step 2:

Signature verification

Every webhook request carries an X-Paymove-Signature header. Verify it before trusting the payload - without verification, anyone who knows your URL can impersonate Paymove and have an order fulfilled without paying. Ready-to-copy code for Node.js, Python and Java: Webhook signature verification.

Required response

Your server must respond with an HTTP status equal to expectedCode. The customary body to return alongside it is:
Delivery success is decided by the HTTP status alone, and it must be exactly equal to expectedCode. With the default 200, a 201 or 204 response counts as a failure - and worse, it is not retried: only 4xx, 5xx and network errors trigger the retry schedule. A wrong 2xx loses the notification for good.
The response body is never inspected. expectedResponse is stored on the webhook and echoed back by the API, but it is never compared against what your server returns - any body will do.
If delivery fails, the webhook is retried as many times as retries specifies - 0 by default, meaning not at all. With retries set, the next attempts follow after 1 s, 5 s, 5 min, 1 h, and then every 3 h.
Paymove applies no timeout to webhook calls. Respond immediately and do the actual order processing asynchronously - otherwise a slow endpoint blocks processing.

3. Assign webhook to product

After creating a product and registering a webhook, you need to link them together. This way every payment event related to this product is automatically sent to the specified webhook URL. Example request:

4. Creating payments

After configuring the product and webhook, you can start creating payments. Choose your integration method:

SDK

Node.js package - initialize the client and call createPayment.

REST API

Direct HTTP calls - works with any language.