curl --request POST \
--url https://public-test.blips.network/transactions/{transactionId}/reject \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "KYC_NOT_APPROVED"
}
'import requests
url = "https://public-test.blips.network/transactions/{transactionId}/reject"
payload = { "reason": "KYC_NOT_APPROVED" }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'KYC_NOT_APPROVED'})
};
fetch('https://public-test.blips.network/transactions/{transactionId}/reject', 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://public-test.blips.network/transactions/{transactionId}/reject",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'KYC_NOT_APPROVED'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-test.blips.network/transactions/{transactionId}/reject"
payload := strings.NewReader("{\n \"reason\": \"KYC_NOT_APPROVED\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-test.blips.network/transactions/{transactionId}/reject")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"KYC_NOT_APPROVED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-test.blips.network/transactions/{transactionId}/reject")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"KYC_NOT_APPROVED\"\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "Transaction:019542f5-b3e7-1d02-0000-000000000021",
"type": "INCOMING",
"status": "FAILED",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCustomerId": "dbs_cust_4Er9nYwL2mQ8kR7XcT1pZa",
"createdAt": "2026-04-05T12:00:00Z",
"updatedAt": "2026-04-05T12:02:00Z",
"settledAt": "2026-04-05T12:02:00Z",
"source": {
"accountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",
"sourceType": "INTERNAL_ACCOUNT"
},
"destination": {
"destinationType": "PPV_ADDRESS",
"ppvAddress": "alice@dbs.blips.network"
},
"receivedAmount": {
"currencyCode": "SGD",
"amountMinor": "5000"
},
"failureReason": "KYC_NOT_APPROVED"
}{
"status": 400,
"code": "INVALID_REQUEST",
"message": "Invalid reject reason",
"details": {
"reason": "must use uppercase BLIPS reason-token format"
}
}{
"status": 401,
"code": "UNAUTHORIZED",
"message": "Invalid or missing API credentials",
"details": {}
}{
"status": 404,
"code": "TRANSACTION_NOT_FOUND",
"message": "Transaction not found",
"details": {}
}{
"status": 409,
"code": "TRANSACTION_NOT_REJECTABLE",
"message": "Transaction is not rejectable",
"details": {}
}{
"status": 500,
"code": "INTERNAL_ERROR",
"message": "Internal service error",
"details": {}
}Reject incoming transaction.
Reject a pending incoming transaction after it enters receiver review. Provide a receiver-side rejection reason in the request body using the current uppercase BLIPS reason-token format.
curl --request POST \
--url https://public-test.blips.network/transactions/{transactionId}/reject \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "KYC_NOT_APPROVED"
}
'import requests
url = "https://public-test.blips.network/transactions/{transactionId}/reject"
payload = { "reason": "KYC_NOT_APPROVED" }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'KYC_NOT_APPROVED'})
};
fetch('https://public-test.blips.network/transactions/{transactionId}/reject', 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://public-test.blips.network/transactions/{transactionId}/reject",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'KYC_NOT_APPROVED'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-test.blips.network/transactions/{transactionId}/reject"
payload := strings.NewReader("{\n \"reason\": \"KYC_NOT_APPROVED\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-test.blips.network/transactions/{transactionId}/reject")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"KYC_NOT_APPROVED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-test.blips.network/transactions/{transactionId}/reject")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"KYC_NOT_APPROVED\"\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "Transaction:019542f5-b3e7-1d02-0000-000000000021",
"type": "INCOMING",
"status": "FAILED",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCustomerId": "dbs_cust_4Er9nYwL2mQ8kR7XcT1pZa",
"createdAt": "2026-04-05T12:00:00Z",
"updatedAt": "2026-04-05T12:02:00Z",
"settledAt": "2026-04-05T12:02:00Z",
"source": {
"accountId": "InternalAccount:a12dcbd6-dced-4ec4-b756-3c3a9ea3d123",
"sourceType": "INTERNAL_ACCOUNT"
},
"destination": {
"destinationType": "PPV_ADDRESS",
"ppvAddress": "alice@dbs.blips.network"
},
"receivedAmount": {
"currencyCode": "SGD",
"amountMinor": "5000"
},
"failureReason": "KYC_NOT_APPROVED"
}{
"status": 400,
"code": "INVALID_REQUEST",
"message": "Invalid reject reason",
"details": {
"reason": "must use uppercase BLIPS reason-token format"
}
}{
"status": 401,
"code": "UNAUTHORIZED",
"message": "Invalid or missing API credentials",
"details": {}
}{
"status": 404,
"code": "TRANSACTION_NOT_FOUND",
"message": "Transaction not found",
"details": {}
}{
"status": 409,
"code": "TRANSACTION_NOT_REJECTABLE",
"message": "Transaction is not rejectable",
"details": {}
}{
"status": 500,
"code": "INTERNAL_ERROR",
"message": "Internal service error",
"details": {}
}Authorizations
Integration-key Basic Auth (clientId:clientSecret) as documented in docs/public/AUTHENTICATION.md.
Path Parameters
Canonical public transaction identifier for transaction-family readback and actions.
Body
Provide the receiver-side rejection reason for the pending incoming transaction. Use the current uppercase BLIPS reason-token format.
Receiver-review rejection payload for a pending incoming transaction.
Receiver-side rejection reason code for the pending incoming transaction. Use the current BLIPS uppercase reason-token format.
Response
Incoming transaction rejected.
Bounded public incoming-review rejection result. The response is transaction-first and intentionally smaller than full transaction detail.
Canonical public transaction identifier for the rejected incoming transaction.
Direction of this rejected transaction.
INCOMING Current transaction lifecycle status after the rejection decision was recorded.
CREATED, PENDING, PROCESSING, COMPLETED, REJECTED, FAILED, REFUNDED, EXPIRED BLIPS customer identifier in Customer:<uuid> format associated with this incoming transaction when available.
Platform-side customer mapping identifier in <platformslug>_cust_<base58uuid> format associated with this incoming transaction when available.
Transaction creation timestamp.
Last update timestamp after the rejection decision was recorded.
Settlement timestamp when the rejected incoming transaction reached its terminal failed state.
Bounded source detail for the rejected incoming transaction.
Show child attributes
Show child attributes
Bounded destination detail for the rejected incoming transaction.
Show child attributes
Show child attributes
Main received amount for the rejected incoming transaction.
Show child attributes
Show child attributes
Receiver-side rejection reason token recorded for this incoming-review decision.