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.
Working with an AI agent? It does steps 1-3 for you - all it needs is the API key and the partnerId; it asks for the shop name and the remaining fields itself. See Building with AI agents.

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 once a payment completes. 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

Payment statuses in Paymove:

Webhook payload

The payload shape depends on whether you set a requestTemplate. Without a requestTemplate Paymove sends the full payment object. Empty fields are omitted, so a given notification may carry fewer of them:
With a requestTemplate the payload is exactly what your template renders - nothing more, nothing less. For the template in step 2 you receive:
Every field of the default payload is available as a variable:
Values substituted into a text template arrive as strings - "price": "{{price}}" yields "1000", not 1000. A variable with no value renders as empty text.
The payload carries only the fields listed in your template. If you need to tell payment statuses apart, add {{status}} to it - otherwise your endpoint cannot distinguish notifications.

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.