Get transaction
curl --request GET \
--url https://api.palpluss.com/v1/transactions/{id} \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.palpluss.com/v1/transactions/{id}"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.palpluss.com/v1/transactions/{id}', 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://api.palpluss.com/v1/transactions/{id}",
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: Basic <encoded-value>"
],
]);
$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://api.palpluss.com/v1/transactions/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.palpluss.com/v1/transactions/{id}")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.palpluss.com/v1/transactions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"transactionId": "fa98a577-95ea-4a8f-8467-1fbe74f5d6f4",
"tenantId": "b6fbe75f-ce87-4d44-b318-6cfdb8b7de4d",
"type": "STK",
"status": "SUCCESS",
"amount": 1000,
"currency": "KES",
"phone": "254712345678",
"channelId": null,
"accountReference": "INV-2024-001",
"transactionDesc": "Payment for invoice #2024-001",
"provider": "m-pesa",
"providerRequestId": "29115-34620561-1",
"providerCheckoutId": "ws_CO_191220191020363925",
"resultCode": "0",
"resultDesc": "The service request is processed successfully.",
"createdAt": "2026-03-01T08:00:00.000Z",
"updatedAt": "2026-03-01T08:01:30.000Z"
},
"requestId": "c1b2a3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Invalid or revoked API key.",
"code": "INVALID_API_KEY",
"details": {}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Transaction not found.",
"code": "TRANSACTION_NOT_FOUND",
"details": {}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Rate limit exceeded. Try again in 12 seconds.",
"code": "RATE_LIMIT_EXCEEDED",
"details": {
"limit": 60,
"remaining": 0,
"resetInSeconds": 12
}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}Transactions
Get Transaction
Retrieve the full details of a single transaction by its ID.
GET
/
transactions
/
{id}
Get transaction
curl --request GET \
--url https://api.palpluss.com/v1/transactions/{id} \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.palpluss.com/v1/transactions/{id}"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.palpluss.com/v1/transactions/{id}', 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://api.palpluss.com/v1/transactions/{id}",
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: Basic <encoded-value>"
],
]);
$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://api.palpluss.com/v1/transactions/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.palpluss.com/v1/transactions/{id}")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.palpluss.com/v1/transactions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"transactionId": "fa98a577-95ea-4a8f-8467-1fbe74f5d6f4",
"tenantId": "b6fbe75f-ce87-4d44-b318-6cfdb8b7de4d",
"type": "STK",
"status": "SUCCESS",
"amount": 1000,
"currency": "KES",
"phone": "254712345678",
"channelId": null,
"accountReference": "INV-2024-001",
"transactionDesc": "Payment for invoice #2024-001",
"provider": "m-pesa",
"providerRequestId": "29115-34620561-1",
"providerCheckoutId": "ws_CO_191220191020363925",
"resultCode": "0",
"resultDesc": "The service request is processed successfully.",
"createdAt": "2026-03-01T08:00:00.000Z",
"updatedAt": "2026-03-01T08:01:30.000Z"
},
"requestId": "c1b2a3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Invalid or revoked API key.",
"code": "INVALID_API_KEY",
"details": {}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Transaction not found.",
"code": "TRANSACTION_NOT_FOUND",
"details": {}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}{
"success": false,
"error": {
"message": "Rate limit exceeded. Try again in 12 seconds.",
"code": "RATE_LIMIT_EXCEEDED",
"details": {
"limit": 60,
"remaining": 0,
"resetInSeconds": 12
}
},
"requestId": "a1b2c3d4-0000-0000-0000-000000000000"
}Retrieve a transaction by ID. Use this to confirm status, display details, or reconcile payments.
Use webhooks as your primary mechanism for receiving payment results. Poll this endpoint only when webhook delivery has failed.
When to use this endpoint
- Confirm final status when webhooks are unavailable
- Display transaction details in your application
- Reconcile payments against internal records
Response fields
| Field | Type | Description |
|---|---|---|
transaction_id | string | Transaction UUID |
type | string | STK or B2C |
status | string | Current status — see transaction lifecycle |
amount | number | Transaction amount in KES |
currency | string | Always "KES" |
phone_number | string | Normalised phone (254XXXXXXXXX) |
external_reference | string | null | Your accountReference or reference |
transaction_fee | number | Service wallet fee charged. Returned for PENDING and SUCCESS only — 0 for all other statuses. |
provider_request_id | string | null | Provider request reference |
provider_checkout_id | string | null | Provider checkout / conversation ID |
result_code | string | null | Provider result code |
result_desc | string | null | Provider result description |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 8601 timestamp |
Polling strategy
After initiating an STK Push:- Wait 15 seconds — most customers respond within this window.
- Poll every 10 seconds while status is
PENDINGorPROCESSING. - Stop when a terminal state is reached:
SUCCESS,FAILED,CANCELLED, orREVERSED. - After 5 minutes without a terminal state, treat the transaction as likely failed.
Authorizations
Paste your PalPluss API key in the username field and leave the password field empty — it is ignored.
Get your key from console → Settings → API Keys (starts with pk_live_ or pk_test_).
In your own code, send the key directly:
Authorization: Basic YOUR_API_KEY
Path Parameters
The transaction ID returned when the payment was initiated.