curl --request GET \
--url https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId} \
--header 'x-api-key: <api-key>'import requests
url = "https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}', 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://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "11111111-2222-3333-4444-555555555555",
"status": "CONFIRMED",
"amount": 123,
"currency": "MXN",
"heldAmount": null,
"externalId": "invoice-2025-01-8842",
"heldAt": "2026-08-12T10:00:00.000Z",
"capturedAt": "2023-11-07T05:31:56Z",
"holdReleasedAt": "2023-11-07T05:31:56Z",
"holdExpiresAt": "2026-08-19T05:00:00.000Z",
"holdExpired": true,
"holdDaysRemaining": 7
}Get Charge by ID
curl --request GET \
--url https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId} \
--header 'x-api-key: <api-key>'import requests
url = "https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}', 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://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api-harmony.compago.com/api/payment-method/{id}/payment/{paymentId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "11111111-2222-3333-4444-555555555555",
"status": "CONFIRMED",
"amount": 123,
"currency": "MXN",
"heldAmount": null,
"externalId": "invoice-2025-01-8842",
"heldAt": "2026-08-12T10:00:00.000Z",
"capturedAt": "2023-11-07T05:31:56Z",
"holdReleasedAt": "2023-11-07T05:31:56Z",
"holdExpiresAt": "2026-08-19T05:00:00.000Z",
"holdExpired": true,
"holdDaysRemaining": 7
}Authorizations
Path Parameters
The unique identifier of the payment method
The unique identifier of the payment
Response
Payment details
Detailed payment information
"11111111-2222-3333-4444-555555555555"
NOT_INITIALIZED, PENDING, CONFIRMED, CANCELLED, REFUNDED, HELD, HOLD_RELEASED, HOLD_EXPIRED "CONFIRMED"
The money that moved. On a hold that was captured for only part of its amount, this is the captured amount.
"MXN"
The amount the bank authorized when a hold was placed. Null on any payment that was never held. When it differs from amount, the hold was captured for only part of it: amount is what was captured and this is what had been held.
null
The idempotency key supplied when the payment was created, echoed back so you can map this payment id to your own order reference. Null when none was supplied. Not to be confused with the payment method externalId, which identifies the saved card.
"invoice-2025-01-8842"
When the bank approved the hold. Null on payments that were never held.
"2026-08-12T10:00:00.000Z"
When the hold was captured. This, and not createdAt, is the settlement date of a captured hold. Null on payments that were never held.
When the hold was released, either by the release endpoint or by the automatic expiry. Null otherwise.
When the hold expires: 23:00 America/Mexico_City on the 7th natural day, counting the day of heldAt as day 1. The hold window is counted in NATURAL DAYS, not in elapsed hours. The day the hold is placed counts as day 1 and the time of day it was placed is irrelevant: a hold placed Monday 10:00 and one placed Monday 23:29 both expire at the same instant, at the end of the following Sunday. The bank closes its day at 23:30 America/Mexico_City and Compago closes the hold at 23:00, 30 minutes earlier, so the last minute to capture is 22:59 on the last day. It keeps being reported once the hold has ended, because it is a fact about the payment. Null on payments that were never held.
"2026-08-19T05:00:00.000Z"
Whether the hold window has closed. It flips at 23:00 America/Mexico_City on the last natural day, not 7 times 24 hours after heldAt. False on payments that were never held.
Natural days on which the hold can still be captured, including today when today's 23:00 cutoff has not passed yet: 7 for a hold placed before 23:00 on its placement day, 6 for one placed at or after 23:00 (its placement day is already spent), 1 through the last day, and 0 from 23:00 on the last day. Null unless the payment is currently HELD.
7