Transaction Verification
Overview
The Requery Transaction endpoint retrieves the current status of a specific transaction using its unique reference. Essential for verifying payment completion, handling webhook failures, and providing status updates to customers.
Endpoint Details
Endpoint: GET /api/v1/transactions/in/check-transaction-status/{reference}
Authentication: Bearer token (merchant_secret_key) in Authorisation header
Path Parameter: reference (String) - Transaction reference (e.g., PISL2509280000000238)
Code Snippets
- JavaScript
- TypeScript
- Java
- Python
- C#
const reference = "PISL2509280000000238";
const url = `https://ags.payislands.com/api/v1/transactions/in/check-transaction-status/${reference}`;
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.MERCHANT_SECRET_KEY}` },
});
const json = await res.json();
console.log(json);
const reference = "PISL2509280000000238";
const url = `https://ags.payislands.com/api/v1/transactions/in/check-transaction-status/${reference}`;
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.MERCHANT_SECRET_KEY as string}` },
});
const json = (await res.json()) as unknown;
console.log(json);
import okhttp3.*;
import java.io.IOException;
public class VerifyTransaction {
public static void main(String[] args) throws IOException {
String reference = "PISL2509280000000238";
String url = "https://ags.payislands.com/api/v1/transactions/in/check-transaction-status/" + reference;
String merchantSecretKey = System.getenv("MERCHANT_SECRET_KEY");
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.get()
.addHeader("Authorization", "Bearer " + merchantSecretKey)
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
}
}
import os
import requests
reference = "PISL2509280000000238"
url = f"https://ags.payislands.com/api/v1/transactions/in/check-transaction-status/{reference}"
headers = {"Authorization": f"Bearer {os.environ['MERCHANT_SECRET_KEY']}"}
resp = requests.get(url, headers=headers, timeout=30)
print(resp.status_code, resp.text)
using System.Net.Http;
using System.Net.Http.Headers;
var reference = "PISL2509280000000238";
var url = $"https://ags.payislands.com/api/v1/transactions/in/check-transaction-status/{reference}";
var merchantSecretKey = Environment.GetEnvironmentVariable("MERCHANT_SECRET_KEY");
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", merchantSecretKey);
var resp = await http.GetAsync(url);
var body = await resp.Content.ReadAsStringAsync();
Console.WriteLine(body);
Response Structure
Success Response (200 OK)
{
"status": true,
"message": "",
"data": {
"reference": "PISL2509280000000238",
"payment_status": "pending",
"amount": "1000",
"payment_item": { /* complete payment item object */ },
"customer": {
"id": 46,
"customer_tag": "Cus_208FZen2hmLqKTcTlj8hiV1PdR",
"first_name": "Sunday",
"last_name": "Dere"
},
"business": {
"business_name": "Dune Imperium"
}
},
"statusCode": 200
}
Failure Response (400 Bad Request)
{
"status": false,
"message": "transaction not found",
"data": null,
"statusCode": 400
}
Key Response Fields
reference
- Confirms the queried transaction reference
- Use for verification and logging
payment_status
- Critical field - Current transaction state
- Values:
pending- Payment not completedpaid- Successfully processedfailed- Payment attempt failedcancelled- Transaction cancelledexpired- Payment window expired
amount
- Transaction amount in smallest currency unit (kobo/cents)
- String format: "1000" = ₦10.00
payment_item
- Complete payment item object with product/service details
- Includes name, pricing, categories, form requirements, and split configuration
customer
- Customer identification information
- Contains ID, customer tag, and name
business
- Merchant business information
- Contains business name
Primary Use Cases
1. Webhook Failure Recovery
Query transaction status when webhook notification fails or is delayed. Wait reasonable time (5-10 minutes) before querying.
2. Real-Time Status Updates
Provide live payment status to customers waiting on payment page. Use intelligent polling with exponential backoff.
3. Pre-Fulfillment Verification
Verify payment completion before releasing goods/services. Always confirm status is "paid" before fulfillment.
4. Customer Support
Look up transaction status when customers inquire about payments. Verify reference before searching.
5. Reconciliation
Periodically verify transaction records match payment gateway. Compare local status with API response.
6. Abandoned Transaction Follow-up
Check status of pending transactions for recovery campaigns. Focus on transactions 24-72 hours old.
Best Practices
Polling Strategy
- Start with 3-5 second intervals
- Implement exponential backoff (increase interval over time)
- Maximum interval: 30 seconds
- Stop polling after 10 minutes or when terminal state reached
- Terminal states: paid, failed, cancelled, expired
Rate Limiting
- Minimum 2 seconds between requests for same reference
- Batch queries with delays between batches
- Implement request queue for high-volume scenarios
Caching
- Cache responses for 5 seconds for non-terminal states
- Cache terminal states for 1 hour
- Invalidate cache on webhook receipt
Error Handling
- Transaction not found (400): Don't retry, verify reference
- Authentication failure (403): Check credentials, don't retry
- Network errors: Retry with exponential backoff (max 3 attempts)
- Log all errors with context
Monitoring
- Log all requery attempts with duration
- Alert on slow responses (>5 seconds)
- Track failure patterns by reference
- Monitor query frequency to prevent abuse
When to Use Requery
✅ Appropriate Uses
- Webhook backup verification
- Customer status inquiries
- Pre-fulfillment checks
- Daily reconciliation
- Abandoned transaction checks
- Payment flow debugging
❌ Avoid Using For
- Continuous rapid polling (< 2 seconds)
- Primary status notification (use webhooks)
- Bulk historical queries (use transaction histories)
- Real-time dashboards with hundreds of references
- Long-term status storage
Common Error Scenarios
Transaction Not Found
Cause: Invalid reference or transaction doesn't exist Solution: Verify reference format and ensure transaction was initialized
Authentication Failure
Cause: Invalid or expired merchant_secret_key Solution: Verify credentials and key permissions
Rate Limiting
Cause: Too many requests in short period Solution: Implement proper delays and request queuing
Implementation Guidelines
Polling Implementation
- Use exponential backoff starting at 3 seconds
- Maximum 100 polling attempts
- Stop on terminal states
- Implement timeout after 10 minutes
Batch Queries
- Process maximum 5 references concurrently
- Add 1 second delay between batches
- Handle failures individually
- Use Promise.allSettled for parallel processing
Circuit Breaker
- Open circuit after 5 consecutive failures
- Wait 60 seconds before retry
- Gradually resume service with half-open state
- Verify status field is true
- Check payment_status exists
- Validate reference matches query
- Ensure data object is populated