Fetch a transaction / verify a payment
curl --request GET \
--url https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference} \
--header 'Authorization: Bearer <token>'import requests
url = "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Transaction gotten successfully",
"data": {
"reference": "GETXN_FI_2M094EW4MJSOC5",
"status": "successful",
"paid": true,
"settled": true,
"amount": 50000,
"currency": "NGN",
"paymentId": 10459445,
"transaction": {
"_id": "66a1f0c39d3e4b0012ab34cd",
"type": "Fund",
"status": "Completed",
"user": "6a82ea8c0864460002a5745e",
"reference": "GETXN_FI_2M094EW4MJSOC5",
"volume": 50000,
"currency": "NGN",
"createdAt": "2026-08-20T10:15:00.000Z"
},
"provider": null
}
}
Transactions
Fetch a transaction / verify a payment
Look up a transaction by the reference we issued, or by its id, and find out whether the payment went through
GET
api
/
transactions
/
{reference}
Fetch a transaction / verify a payment
curl --request GET \
--url https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference} \
--header 'Authorization: Bearer <token>'import requests
url = "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://ge-exchange-staging-1.herokuapp.com/v1/api/transactions/{reference}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Transaction gotten successfully",
"data": {
"reference": "GETXN_FI_2M094EW4MJSOC5",
"status": "successful",
"paid": true,
"settled": true,
"amount": 50000,
"currency": "NGN",
"paymentId": 10459445,
"transaction": {
"_id": "66a1f0c39d3e4b0012ab34cd",
"type": "Fund",
"status": "Completed",
"user": "6a82ea8c0864460002a5745e",
"reference": "GETXN_FI_2M094EW4MJSOC5",
"volume": 50000,
"currency": "NGN",
"createdAt": "2026-08-20T10:15:00.000Z"
},
"provider": null
}
}
Answers the question the payment redirect leaves open.
Fund and invest sends the buyer to Flutterwave and
brings them back to the
That
A payment is regularly
redirectUrl you supplied, with the outcome appended as query
parameters:
?status=successful&tx_ref=GETXN_FI_2M094EW4MJSOC5&transaction_id=10459445
?status=cancelled&tx_ref=GETXN_FI_KGBW0Y3O2W2GNN
status is the browser’s account of the checkout — it is not proof of payment, and it can be
edited by anyone who can edit a URL. Call this endpoint with the tx_ref before you render
anything on your return page.
Two different things are reported, because they settle at different times:
| Field | Means |
|---|---|
status / paid | whether the payment succeeded at the provider |
settled | whether GetEquity has received the money and credited the wallet |
paid: true, settled: false for a few seconds: the buyer gets back to your
page before our webhook has run. Show “payment received, investment processing” and poll this
endpoint until settled is true — do not tell the buyer the payment failed.
settled: true means the funding is on the books. On a fund-and-invest the token purchase is
queued at that moment and completes just after, so the units appear on
Member Token Balance a beat later than the
wallet credit. If your page confirms the holding rather than the payment, read the balance.
string
required
The
tx_ref returned when the payment was initiated (GETXN_FI_…), or the transaction’s own id.string
The
transaction_id from the redirect, when you have it. Saves a lookup. Pass only the one that
came back with this tx_ref — it is what gets verified, so an id from a different payment
returns that payment’s outcome.Scope
The reference must belong to you — a transaction of your organisation’s, or a payment you initiated for one of your members. Anything else returns404, whether or not it exists.
{
"status": "success",
"message": "Transaction gotten successfully",
"data": {
"reference": "GETXN_FI_2M094EW4MJSOC5",
"status": "successful",
"paid": true,
"settled": true,
"amount": 50000,
"currency": "NGN",
"paymentId": 10459445,
"transaction": {
"_id": "66a1f0c39d3e4b0012ab34cd",
"type": "Fund",
"status": "Completed",
"user": "6a82ea8c0864460002a5745e",
"reference": "GETXN_FI_2M094EW4MJSOC5",
"volume": 50000,
"currency": "NGN",
"createdAt": "2026-08-20T10:15:00.000Z"
},
"provider": null
}
}
Paid, not yet settled
transaction is null and provider carries Flutterwave’s verification, because our webhook has
not written the funding yet. Poll until settled is true.
{
"status": "success",
"message": "Transaction gotten successfully",
"data": {
"reference": "GETXN_FI_2M094EW4MJSOC5",
"status": "successful",
"paid": true,
"settled": false,
"amount": 50000,
"currency": "NGN",
"paymentId": 10459445,
"transaction": null,
"provider": {
"status": "successful",
"amount": 50000,
"currency": "NGN",
"transaction_id": 10459445,
"payment_type": "card",
"created_at": "2026-08-20T10:14:52.000Z",
"meta": {
"type": "fund_invest",
"userId": "6a82ea8c0864460002a5745e",
"tokenId": "660018c2f4a1b20011a9e0b1",
"investmentAmount": 50000
}
}
}
}
Cancelled or abandoned
The buyer came back withstatus=cancelled, and Flutterwave has no record of the reference.
{
"status": "success",
"message": "Transaction gotten successfully",
"data": {
"reference": "GETXN_FI_KGBW0Y3O2W2GNN",
"status": "not_found",
"paid": false,
"settled": false,
"amount": null,
"currency": null,
"paymentId": null,
"transaction": null,
"provider": null
}
}
Status values
status | paid | Meaning |
|---|---|---|
successful | true | The payment went through |
pending | false | The provider has it, no verdict yet |
failed | false | The payment was attempted and declined |
not_found | false | No payment against this reference — cancelled or never started |
Error responses
| Status | Error code | When |
|---|---|---|
| 404 | TRANSACTION_NOT_FOUND_ERROR | No transaction or in-flight payment of yours with this reference |
| 400 | PAYMENT_REFERENCE_REQUIRED_ERROR | No reference supplied |
A reference for a payment that never reached the provider — a checkout closed before it was
submitted — stops being resolvable 24 hours after it was initiated, and returns
404
from then on. Anything the provider has a record of, settled or not, stays resolvable.Was this page helpful?
