curl --request POST \
--url https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"claimNonReceiptDetails": {
"additionalInfo": "<string>"
}
}
'import requests
url = "https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations"
payload = { "claimNonReceiptDetails": { "additionalInfo": "<string>" } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({claimNonReceiptDetails: {additionalInfo: '<string>'}})
};
fetch('https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations', 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.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations",
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([
'claimNonReceiptDetails' => [
'additionalInfo' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations"
payload := strings.NewReader("{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations")
.header("Idempotency-Key", "<idempotency-key>")
.header("Content-Type", "application/json")
.body("{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"direction": "OUTBOUND",
"id": 123,
"messageId": "<string>",
"schema": "SEPA",
"status": "PENDING",
"type": "CLAIM_NON_RECEIPT",
"claimNonReceiptDetails": {
"caseId": "<string>",
"reminders": [
{
"createdAt": "2023-11-07T05:31:56Z",
"direction": "OUTBOUND",
"id": 123,
"messageId": "<string>",
"status": "PENDING",
"delivery": {
"status": "<string>",
"statusReason": "<string>"
},
"sentAt": "2023-11-07T05:31:56Z"
}
],
"additionalInfo": "<string>"
},
"delivery": {
"status": "<string>",
"statusReason": "<string>"
},
"referencedTransactionId": 123,
"reminderEligibility": {
"eligible": true,
"availableFrom": "2023-12-25",
"reason": "NOT_APPLICABLE"
},
"resolution": {
"confirmationCode": "ACNR",
"messageId": "<string>",
"rejectionReasonCode": "<string>",
"settlementDate": "2023-12-25"
},
"statusHistory": [
{
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"statusTo": "PENDING",
"changeReason": "<string>",
"statusFrom": "PENDING"
}
],
"transactionDetails": {
"amount": 123,
"currencyCode": "<string>",
"endToEndId": "<string>",
"method": "SEPA",
"settlementDate": "2023-12-25",
"creditorBic": "<string>",
"creditorIban": "<string>",
"creditorName": "<string>",
"debtorBic": "<string>",
"debtorIban": "<string>",
"debtorName": "<string>",
"remittanceInfo": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}Create investigation
Creates an investigation for a payment. Supports Claim Non-Receipt (camt.027) for outbound SEPA CT payments and Payment Status Request (pacs.028) for outbound SEPA INST payments.
curl --request POST \
--url https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"claimNonReceiptDetails": {
"additionalInfo": "<string>"
}
}
'import requests
url = "https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations"
payload = { "claimNonReceiptDetails": { "additionalInfo": "<string>" } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({claimNonReceiptDetails: {additionalInfo: '<string>'}})
};
fetch('https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations', 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.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations",
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([
'claimNonReceiptDetails' => [
'additionalInfo' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations"
payload := strings.NewReader("{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations")
.header("Idempotency-Key", "<idempotency-key>")
.header("Content-Type", "application/json")
.body("{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pgw-sandbox.finventi.com/v3/payments/{transactionId}/investigations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"claimNonReceiptDetails\": {\n \"additionalInfo\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"direction": "OUTBOUND",
"id": 123,
"messageId": "<string>",
"schema": "SEPA",
"status": "PENDING",
"type": "CLAIM_NON_RECEIPT",
"claimNonReceiptDetails": {
"caseId": "<string>",
"reminders": [
{
"createdAt": "2023-11-07T05:31:56Z",
"direction": "OUTBOUND",
"id": 123,
"messageId": "<string>",
"status": "PENDING",
"delivery": {
"status": "<string>",
"statusReason": "<string>"
},
"sentAt": "2023-11-07T05:31:56Z"
}
],
"additionalInfo": "<string>"
},
"delivery": {
"status": "<string>",
"statusReason": "<string>"
},
"referencedTransactionId": 123,
"reminderEligibility": {
"eligible": true,
"availableFrom": "2023-12-25",
"reason": "NOT_APPLICABLE"
},
"resolution": {
"confirmationCode": "ACNR",
"messageId": "<string>",
"rejectionReasonCode": "<string>",
"settlementDate": "2023-12-25"
},
"statusHistory": [
{
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"statusTo": "PENDING",
"changeReason": "<string>",
"statusFrom": "PENDING"
}
],
"transactionDetails": {
"amount": 123,
"currencyCode": "<string>",
"endToEndId": "<string>",
"method": "SEPA",
"settlementDate": "2023-12-25",
"creditorBic": "<string>",
"creditorIban": "<string>",
"creditorName": "<string>",
"debtorBic": "<string>",
"debtorIban": "<string>",
"debtorName": "<string>",
"remittanceInfo": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}{
"code": "<string>",
"data": {
"errors": [
{
"code": "<string>",
"field_name": "<string>",
"message": "<string>",
"value": "<string>"
}
],
"message": "<string>"
},
"message": "<string>"
}Idempotent Endpoint
This endpoint supports idempotency to prevent duplicate investigations.How to Use
- Include an
Idempotency-Keyheader with a unique value (UUID recommended) - The API returns the existing investigation when you reuse the same key
- Retry requests safely without creating duplicates
Investigation Types
Claim Non-Receipt (camt.027)
- For outbound SEPA CT payments in
COMPLETEDstatus - Requires
additionalInfoin the request body
Payment Status Request (pacs.028)
- For outbound SEPA INST payments in
SENT_TO_CLEARstatus additionalInfomust not be provided
type: PAYMENT_STATUS_REQUEST and schema: SEPA is a reminder for a claim non-receipt, created through Send reminder rather than this endpoint.
One Pending Claim per Payment
A payment can have at most one pending outbound claim non-receipt. While an earlier claim is stillPENDING, a second CLAIM_NON_RECEIPT for the same payment is rejected with DUPLICATE_PENDING_INVESTIGATION:
{
"code": "DUPLICATE_PENDING_INVESTIGATION",
"message": "A pending outbound claim non-receipt already exists for transaction 10000101",
"data": {
"errors": [
{
"field_name": "transactionId",
"value": "10000101"
}
]
}
}
PAYMENT_STATUS_REQUEST.
Errors
| Code | Cause |
|---|---|
DUPLICATE_PENDING_INVESTIGATION | The payment already has a pending outbound claim non-receipt. |
INVESTIGATION_MISSING_REQUEST_INFORMATION | additionalInfo is required but missing, or supplied where it is not allowed. |
ILLEGAL_TRANSACTION_METHOD | The payment scheme does not match the investigation type — SEPA CT for CLAIM_NON_RECEIPT, SEPA INST for PAYMENT_STATUS_REQUEST. |
ILLEGAL_TRANSACTION_STATUS | The payment is not in the status the investigation type requires. |
ILLEGAL_TRANSACTION_TYPE | The referenced transaction is not a payment. |
ILLEGAL_TRANSACTION_DIRECTION | The payment is inbound. |
TRANSACTION_NOT_FOUND | No payment with that ID (404). |
Headers
Unique identifier to ensure idempotent investigation creation
Path Parameters
Payment transaction ID
Body
Response
Investigation created
Timestamp when the investigation was created
User or system that created the investigation
Investigation direction (INBOUND or OUTBOUND)
OUTBOUND, INBOUND Investigation ID
Investigation message ID
Message schema identifier
SEPA, INST Current investigation status
PENDING, RESOLVED, REJECTED Investigation type
CLAIM_NON_RECEIPT, PAYMENT_STATUS_REQUEST Claim non-receipt investigation details, present for CLAIM_NON_RECEIPT type
Show child attributes
Show child attributes
Investigation message delivery status information from CSM
Show child attributes
Show child attributes
Referenced transaction ID
Whether a pacs.028 reminder can be sent for this claim right now, and if not, why
Show child attributes
Show child attributes
Resolution details, present when the investigation has been resolved
Show child attributes
Show child attributes
Investigation status change history, included when retrieving a single investigation
Show child attributes
Show child attributes
Original transaction details referenced by the investigation
Show child attributes
Show child attributes
Timestamp when the investigation was last updated