Transactions
What is a transaction?
A transaction represents a movement of money between your customer and your business. It is the heart of the payment system, where every payment operation is authorized, processed, and recorded.
The following parameters are mandatory or optional depending on the API integration, and parameter requirements vary with widget or checkout integration.
Create a transaction
To create a transaction through your integration via API, you must make a POST request to the /transactions endpoint with the details of the operation you want to process.
Endpoint
POST /v1/transactions
You must use your private key as a Bearer token in the authentication header:
Authorization: Bearer {your_private_key}
Required parameters
| Parameter | Type | Description |
|---|---|---|
acceptance_token | string | Acceptance token obtained from Acceptance Tokens |
amount_in_cents | integer | Transaction amount in cents. For example, 10000 = $100 COP |
currency | string | Transaction currency. Only COP (Colombian pesos) is currently available. |
customer_email | string | Customer email for receipt delivery |
payment_method | object | Object with payment method details based on its type |
reference | string | Unique reference of the transaction in your system (max 255 characters). Must be unique per transaction |
signature | string | Integrity signature to validate the transaction |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_data | object | Additional customer data (name, phone, address, etc.) |
redirect_url | string | URL to redirect the customer after payment |
ip | string | IP address of the device from which the transaction is being made |
For detailed information on how to generate the integrity signature, check the guide at Widget & Checkout Web - Generate an integrity signature.
Request example - Credit Card
{
"amount_in_cents": 50000,
"currency": "COP",
"customer_email": "juan@example.com",
"payment_method": {
"type": "CARD",
"token": "tok_prod_1_BBb749EAB32e97a2D058Dd538a608301",
"installments": 1
},
"signature": "37c8407747e595535433ef8f6a811d853cd943046624a0ec04662b17bbf33bf5",
"payment_method_type": "CARD",
"reference": "ORDER-2024-001",
"acceptance_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"ip": "192.168.1.100"
}
Response - Transaction created
A successfully created transaction returns a 201 status code with the following data:
{
"data": {
"id": "1292-1602113476-10985",
"reference": "ORDER-2024-001",
"created_at": "2024-01-15T14:30:45.000Z",
"amount_in_cents": 50000,
"currency": "COP",
"customer_email": "juan@example.com",
"payment_method_type": "CARD",
"status": "PENDING",
"status_message": "The transaction is being processed",
"merchant": {
"id": "pub_prod_xxx",
"name": "My Business",
"legal_name": "My Business SAS"
},
"payment_method": {
"type": "CARD",
"brand": "VISA",
"last_four": "4242"
}
}
}
Transaction statuses
A transaction can have the following statuses:
| Status | Description |
|---|---|
PENDING | The transaction was created but is still being processed |
APPROVED | The transaction was approved and the payment was completed successfully |
DECLINED | The transaction was declined (insufficient funds, invalid data, etc.) |
VOIDED | The transaction was voided (only applies to credit/debit card transactions) |
ERROR | An error occurred during processing |
A newly created transaction always has a PENDING status. Configure Webhooks in the Wompi Dashboard to automatically receive transaction.updated events on your backend server. Direct queries from the frontend are no longer supported.
Check transaction status
To check the current status of a transaction, use the endpoint:
GET /v1/transactions/{transaction_id}
As of this version, transaction queries are only available via Private Key (prv_*) from your server/backend.
Requests without authentication or using a Public Key (pub_*) are no longer supported and will return 404 Not Found.
Request example
curl -i -X GET "https://production.wompi.co/v1/transactions/{transaction_id}" \
-H "Accept: application/json" \
-H "Authorization: Bearer prv_prod_xxxxxxxxxxxxxxxxxxxxxxxx"
Response example
{
"data": {
"id": "1292-1602113476-10985",
"reference": "ORDER-2024-001",
"status": "APPROVED",
"amount_in_cents": 50000,
"currency": "COP",
"payment_method_type": "CARD",
"status_message": "Transaction approved"
}
}
Common error codes
| Code | Message | Solution |
|---|---|---|
422 | Duplicate reference | Use a unique reference for each transaction |
422 | Invalid amount | Verify that amount_in_cents is a positive integer |
400 | Invalid acceptance token | Generate a new acceptance token |
401 | Invalid authentication key | Verify your private key |
400 | Incomplete payment method | Review the required parameters of payment_method |
Before sending a transaction to Wompi, make sure to validate all required data on your client and server side. This will prevent validation errors.
Traceability and Security
Importance of capturing the IP address
Storing the IP address of the device from which each transaction originates is fundamental to:
- Fraud identification and prevention: Allows detection of suspicious patterns such as multiple transactions from geographically impossible locations in a short time and facilitates the implementation of anomaly detection rules based on location.
- Traceability: Keep a complete record of the origin of each transaction for auditing.
Always capture the IP on your backend server. If you use a proxy or load balancer, make sure the X-Forwarded-For header is configured correctly.
Best practices
1. Use unique references
Each transaction must have a unique reference. We recommend using a format that includes your order number and a timestamp:
ORDER-2024-001-1705330245
2. Use Webhooks for status updates
Direct API polling from the frontend is no longer supported.
Configure Webhooks in the Wompi Dashboard to automatically receive transaction.updated events on your backend server.
3. Store transaction information
Keep a record of transactions in your database with:
- Transaction ID
- Reference
- Status
- Amount
- Payment method
- Device IP address
- Date/time
- And any additional information you consider valuable for your business.
4. Handle errors gracefully
Always validate data before sending the transaction and handle errors appropriately:
try {
const response = await fetch('/v1/transactions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${PUBLIC_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(transactionData)
});
if (response.status === 201) {
const { data } = await response.json();
// Transaction created successfully
} else if (response.status === 422) {
const error = await response.json();
// Validation failed - invalid data
console.error('Validation error:', error);
}
} catch (error) {
console.error('Network error:', error);
}
Supported payment methods
Wompi supports multiple payment methods. For more detailed information about the specific data for each method, check the complete guide at Payment Methods.
Void a transaction
To void a card transaction (only available for certain statuses), use:
POST /v1/transactions/{transaction_id}/void
Requires your private key.
curl -X POST "https://production.wompi.co/v1/transactions/1292-1602113476-10985/void" \
-H "Authorization: Bearer priv_prod_xxx"