Skip to content

Payment Notification SNAP

Information

This API is used by iFortePay to send payment notifications to the Merchant. The notification contains transaction details and the latest payment status, which the Merchant can use to update their system accordingly.

  • For Dynamic QRIS, payment notifications will be delivered to the callback URL specified during the QR generation request.
  • For Static QRIS, merchants must provide a Payment Notification URL to the Integration Support Team, which will then configure it in the system.
Path/v1.0/qr/qr-mpm-notify
HTTP MethodPOST
Service Code52
Type FormatJSON

Request

Details
ParameterData TypeMandatoryLengthDescription
responseCodeStringM7Response code
responseMessageStringM150Response description
originalReferenceNoStringC64Original transaction identifier on service provider system. Must be filled upon successful transaction
originalPartnerReferenceNoStringM64Original transaction identifier on service consumer system
serviceCodeStringM2Transaction type indicator (service code of the original transaction request)
latestTransactionStatusStringM200 - Success
01 - Initiated
04 - Refunded
05 - Canceled
07 - Not found
Expire payment is mapped to Not found
transactionStatusDescStringM50Description status transaction
paidTimeyyyyMMddHHmmssC255Transaction date (ISO-8601)
amountObjectMAmount object
amount.valueStringM16,2Transaction amount (IDR includes 2 decimals, e.g. 10000.00)
amount.currencyString (ISO4217)M3Currency
terminalIdStringO16Terminal Identification
additionalInfoObjectOAdditional information
additionalInfo.merchantIdStringMMerchant identifier
additionalInfo.merchantAccountNumberStringOMerchant PAN
additionalInfo.paymentChannelStringOAcquirer payment channel
additionalInfo.issuerStringCReturned for successful payment
additionalInfo.retrievalReferenceNoStringC64Reference number generated by Issuer
additionalInfo.invoiceNoStringCReference number if payment is successful
additionalInfo.customerNameStringOCustomer name from Issuer
additionalInfo.customerNumberStringOCustomer PAN from Issuer
additionalInfo.paymentDetailObjectMPayment detail
additionalInfo.paymentDetail.totalAmountObjectMTotal amount
additionalInfo.paymentDetail.totalAmount.valueStringM16,2Total transaction amount
additionalInfo.paymentDetail.totalAmount.currencyStringM3Currency
additionalInfo.createdTimeISO-8601MCreated time
additionalInfo.validityPeriodISO-8601MValid payment time
additionalInfo.cancelTimeStringC25Cancel time (ISO-8601), required if canceled
additionalInfo.totalRefundedAmountObjectCReturned for refunded payment
additionalInfo.totalRefundedAmount.valueStringM16,2Total refunded amount
additionalInfo.totalRefundedAmount.currencyStringM3Currency
additionalInfo.refundHistoryArray of ObjectCRefund history
additionalInfo.refundHistory.refundAmountObjectMRefund amount
additionalInfo.refundHistory.refundAmount.valueStringM16,2Refund amount value
additionalInfo.refundHistory.refundAmount.currencyStringM3Currency
additionalInfo.refundHistory.refundTimeStringMISO-8601
additionalInfo.callbackUrlTextMMerchant payment notification URL
additionalIfo.customerDetailObjectOCustomer detail
additionalIfo.customerDetail.emailStringO255Valid email format
additionalIfo.customerDetail.phoneStringO30Numbers only
additionalIfo.customerDetail.fullNameStringO100Customer full name
additionalIfo.itemDetailsArray of ObjectsOPurchased items
additionalIfo.itemDetails.itemIdString(25)C25Mandatory if item details exist
additionalIfo.itemDetails.nameString(50)C100Product name
additionalIfo.itemDetails.amountObjectCPrice per unit
additionalIfo.itemDetails.amount.valueStringCMandatory if item details exist
additionalIfo.itemDetails.amount.currencyStringC16,2Mandatory if item details exist
additionalIfo.itemDetails.qtyInt(10)C8Quantity (max 99,999,999)
additionalIfo.itemDetails.descriptionString(255)O255Product description
additionalIfo.payerNameStringO100Payer Name get from channel nobu only
additionalIfo.payerNumberStringO50Payer Number get from channel nobu only

Example Request

Details
sh
curl --location '.../v1.0/qr/qr-mpm-notify' \
--header 'Content-Type: application/json' \
--header 'X-TIMESTAMP: 2020-12-23T08:46:11+07:00' \
--header 'X-SIGNATURE: 85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5' \
--header 'X-PARTNER-ID: MC2025024500' \
--header 'X-EXTERNAL-ID: 41807553358950093184162180797837' \
--header 'CHANNEL-ID: QR004' \
--data '{
  "originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
  "originalPartnerReferenceNo": "69003543869326",
  "latestTransactionStatus": "00",
  "transactionStatusDesc": "Success",
  "amount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "issuer": "BCA",
    "retrievalReferenceNo": "697350261088",
    "paymentChannel": "IFORTEPAY",
    "paymentDetail": {
      "totalAmount": {
        "value": "100000.00",
        "currency": "IDR"
      }
    },
    "createdTime": "2025-05-09T15:44:20+07:00",
    "validityPeriod": "2025-05-09T15:59:20+07:00",
    "paidTime": "2025-05-09T15:44:37+07:00",
    "acquirerIssuerRelation": "off_us",
    "callbackUrl": "https://testcallback.free.beeceptor.com",
    "invoiceNo": "01746780277897819043",
    "merchantId": "MC2025024500",
    "merchantAccountNumber": "9360088802024078316",
    "customerName": "Dummy Name",
    "customerNumber": "9360002319993788396",
    "issuerCode": "93600014",
    "itemDetails": [
      {
        "itemId": "12345",
        "name": "pulsa",
        "amount": {
          "value": "20000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian pulsa"
      },
      {
        "itemId": "jbl789",
        "name": "kuota internet",
        "amount": {
          "value": "80000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian kuota internet"
      }
    ],
    "customerDetail": {
      "email": "[email protected]",
      "fullName": "Customer name",
      "phone": "08888888888"
    }
  }
}'
go
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := ".../v1.0/qr/qr-mpm-notify"
  method := "POST"

  payload := strings.NewReader(`{
  "originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
  "originalPartnerReferenceNo": "69003543869326",
  "latestTransactionStatus": "00",
  "transactionStatusDesc": "Success",
  "amount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "issuer": "BCA",
    "retrievalReferenceNo": "697350261088",
    "paymentChannel": "IFORTEPAY",
    "paymentDetail": {
      "totalAmount": {
        "value": "100000.00",
        "currency": "IDR"
      }
    },
    "createdTime": "2025-05-09T15:44:20+07:00",
    "validityPeriod": "2025-05-09T15:59:20+07:00",
    "paidTime": "2025-05-09T15:44:37+07:00",
    "acquirerIssuerRelation": "off_us",
    "callbackUrl": "https://testcallback.free.beeceptor.com",
    "invoiceNo": "01746780277897819043",
    "merchantId": "MC2025024500",
    "merchantAccountNumber": "9360088802024078316",
    "customerName": "Dummy Name",
    "customerNumber": "9360002319993788396",
    "issuerCode": "93600014",
    "itemDetails": [
      {
        "itemId": "12345",
        "name": "pulsa",
        "amount": {
          "value": "20000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian pulsa"
      },
      {
        "itemId": "6789",
        "name": "kuota internet",
        "amount": {
          "value": "80000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian kuota internet"
      }
    ],
    "customerDetail": {
      "email": "[email protected]",
      "fullName": "Customer name",
      "phone": "08888888888"
    }
  }
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("X-TIMESTAMP", "2020-12-23T08:46:11+07:00")
  req.Header.Add("X-SIGNATURE", "85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5")
  req.Header.Add("X-PARTNER-ID", "IFP2024067944")
  req.Header.Add("X-EXTERNAL-ID", "41807553358950093184162180797837")
  req.Header.Add("CHANNEL-ID", "QR004")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
js
const axios = require('axios');
let data = JSON.stringify({
  "originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
  "originalPartnerReferenceNo": "69003543869326",
  "latestTransactionStatus": "00",
  "transactionStatusDesc": "Success",
  "amount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "issuer": "BCA",
    "retrievalReferenceNo": "697350261088",
    "paymentChannel": "IFORTEPAY",
    "paymentDetail": {
      "totalAmount": {
        "value": "100000.00",
        "currency": "IDR"
      }
    },
    "createdTime": "2025-05-09T15:44:20+07:00",
    "validityPeriod": "2025-05-09T15:59:20+07:00",
    "paidTime": "2025-05-09T15:44:37+07:00",
    "acquirerIssuerRelation": "off_us",
    "callbackUrl": "https://testcallback.free.beeceptor.com",
    "invoiceNo": "01746780277897819043",
    "merchantId": "MC2025024500",
    "merchantAccountNumber": "9360088802024078316",
    "customerName": "Dummy Name",
    "customerNumber": "9360002319993788396",
    "issuerCode": "93600014",
    "itemDetails": [
      {
        "itemId": "12345",
        "name": "pulsa",
        "amount": {
          "value": "20000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian pulsa"
      },
      {
        "itemId": "6789",
        "name": "kuota internet",
        "amount": {
          "value": "80000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian kuota internet"
      }
    ],
    "customerDetail": {
      "email": "[email protected]",
      "fullName": "Customer name",
      "phone": "08888888888"
    }
  }
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: '.../v1.0/qr/qr-mpm-notify',
  headers: { 
    'Content-Type': 'application/json', 
    'X-TIMESTAMP': '2020-12-23T08:46:11+07:00', 
    'X-SIGNATURE': '85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5', 
    'X-PARTNER-ID': 'IFP2024067944', 
    'X-EXTERNAL-ID': '41807553358950093184162180797837', 
    'CHANNEL-ID': 'QR004'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});
rust
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::builder()
        .build()?;

    let mut headers = reqwest::header::HeaderMap::new();
    headers.insert("Content-Type", "application/json".parse()?);
    headers.insert("X-TIMESTAMP", "2020-12-23T08:46:11+07:00".parse()?);
    headers.insert("X-SIGNATURE", "85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5".parse()?);
    headers.insert("X-PARTNER-ID", "IFP2024067944".parse()?);
    headers.insert("X-EXTERNAL-ID", "41807553358950093184162180797837".parse()?);
    headers.insert("CHANNEL-ID", "QR004".parse()?);

    let data = r#"{
  "originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
  "originalPartnerReferenceNo": "69003543869326",
  "latestTransactionStatus": "00",
  "transactionStatusDesc": "Success",
  "amount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "issuer": "BCA",
    "retrievalReferenceNo": "697350261088",
    "paymentChannel": "IFORTEPAY",
    "paymentDetail": {
      "totalAmount": {
        "value": "100000.00",
        "currency": "IDR"
      }
    },
    "createdTime": "2025-05-09T15:44:20+07:00",
    "validityPeriod": "2025-05-09T15:59:20+07:00",
    "paidTime": "2025-05-09T15:44:37+07:00",
    "acquirerIssuerRelation": "off_us",
    "callbackUrl": "https://testcallback.free.beeceptor.com",
    "invoiceNo": "01746780277897819043",
    "merchantId": "MC2025024500",
    "merchantAccountNumber": "9360088802024078316",
    "customerName": "Dummy Name",
    "customerNumber": "9360002319993788396",
    "issuerCode": "93600014",
    "itemDetails": [
      {
        "itemId": "12345",
        "name": "pulsa",
        "amount": {
          "value": "20000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian pulsa"
      },
      {
        "itemId": "6789",
        "name": "kuota internet",
        "amount": {
          "value": "80000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian kuota internet"
      }
    ],
    "customerDetail": {
      "email": "[email protected]",
      "fullName": "Customer name",
      "phone": "08888888888"
    }
  }
}"#;

    let json: serde_json::Value = serde_json::from_str(&data)?;

    let request = client.request(reqwest::Method::POST, ".../v1.0/qr/qr-mpm-notify")
        .headers(headers)
        .json(&json);

    let response = request.send().await?;
    let body = response.text().await?;

    println!("{}", body);

    Ok(())
}
php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '.../v1.0/qr/qr-mpm-notify',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
  "originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
  "originalPartnerReferenceNo": "69003543869326",
  "latestTransactionStatus": "00",
  "transactionStatusDesc": "Success",
  "amount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "issuer": "BCA",
    "retrievalReferenceNo": "697350261088",
    "paymentChannel": "IFORTEPAY",
    "paymentDetail": {
      "totalAmount": {
        "value": "100000.00",
        "currency": "IDR"
      }
    },
    "createdTime": "2025-05-09T15:44:20+07:00",
    "validityPeriod": "2025-05-09T15:59:20+07:00",
    "paidTime": "2025-05-09T15:44:37+07:00",
    "acquirerIssuerRelation": "off_us",
    "callbackUrl": "https://testcallback.free.beeceptor.com",
    "invoiceNo": "01746780277897819043",
    "merchantId": "MC2025024500",
    "merchantAccountNumber": "9360088802024078316",
    "customerName": "Dummy Name",
    "customerNumber": "9360002319993788396",
    "issuerCode": "93600014",
    "itemDetails": [
      {
        "itemId": "12345",
        "name": "pulsa",
        "amount": {
          "value": "20000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian pulsa"
      },
      {
        "itemId": "jbl789",
        "name": "kuota internet",
        "amount": {
          "value": "80000.00",
          "currency": "IDR"
        },
        "qty": 1,
        "description": "pembelian kuota internet"
      }
    ],
    "customerDetail": {
      "email": "[email protected]",
      "fullName": "Customer name",
      "phone": "08888888888"
    }
  }
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'X-TIMESTAMP: 2020-12-23T08:46:11+07:00',
    'X-SIGNATURE: 85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5',
    'X-PARTNER-ID: IFP2024067944',
    'X-EXTERNAL-ID: 41807553358950093184162180797837',
    'CHANNEL-ID: QR004'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

Response

Details
ParameterData TypeMandatoryLengthDescription
responseCodeStringM7Response code
responseMessageStringM150Response description

Example Response

Details
{
   "responseCode":"2005200",
   "responseMessage":"Request has been processed successfully"
}

iFortepay API Documentation