curl --request PATCH \
--url https://tapipay-facade.homo.tapila.cloud/payment-links/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-authorization-token: <api-key>' \
--data '
{
"description": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"metadata": {}
}
'import requests
url = "https://tapipay-facade.homo.tapila.cloud/payment-links/{id}"
payload = {
"description": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"metadata": {}
}
headers = {
"x-api-key": "<api-key>",
"x-authorization-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'x-api-key': '<api-key>',
'x-authorization-token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({description: '<string>', expiresAt: '2023-11-07T05:31:56Z', metadata: {}})
};
fetch('https://tapipay-facade.homo.tapila.cloud/payment-links/{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://tapipay-facade.homo.tapila.cloud/payment-links/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => '<string>',
'expiresAt' => '2023-11-07T05:31:56Z',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-authorization-token: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tapipay-facade.homo.tapila.cloud/payment-links/{id}"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-authorization-token", "<api-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.patch("https://tapipay-facade.homo.tapila.cloud/payment-links/{id}")
.header("x-api-key", "<api-key>")
.header("x-authorization-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tapipay-facade.homo.tapila.cloud/payment-links/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["x-authorization-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"paymentLinkId": "plk_61a837f5-3c67-423a-ade7-94b78e0007cb",
"status": "ACTIVE",
"amount": 4500,
"currency": "MXN",
"description": "Factura única #777",
"singleUse": true,
"paymentUrl": "https://app.tapipay.la/s/acme-corp/portal/McXmbnKaju/debts/payment-methods?externalRequestId=pl-debt-FAC-777",
"createdAt": "2026-06-03T19:20:00.000Z",
"debtId": "debt_pl-debt-FAC-777",
"externalPaymentLinkId": "FAC-777",
"expiresAt": "2026-06-30T23:59:59.000Z",
"successUrl": null,
"metadata": null,
"identifierValue": "acm-x3kM9pQr",
"contact": null,
"product": null
},
"requestId": "<string>"
}Actualizar link de pago
Modifica la descripción, la fecha de expiración y la metadata. Solo se aceptan description, expiresAt y metadata: body vacío o cualquier otro campo devuelve 400. companyCode en el body se toma como contexto y no como campo a modificar. El estado del link se valida antes que el body. expiresAt actualiza también el vencimiento de la deuda asociada; si esa deuda ya fue cancelada, solo se actualiza el link.
curl --request PATCH \
--url https://tapipay-facade.homo.tapila.cloud/payment-links/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-authorization-token: <api-key>' \
--data '
{
"description": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"metadata": {}
}
'import requests
url = "https://tapipay-facade.homo.tapila.cloud/payment-links/{id}"
payload = {
"description": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"metadata": {}
}
headers = {
"x-api-key": "<api-key>",
"x-authorization-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'x-api-key': '<api-key>',
'x-authorization-token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({description: '<string>', expiresAt: '2023-11-07T05:31:56Z', metadata: {}})
};
fetch('https://tapipay-facade.homo.tapila.cloud/payment-links/{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://tapipay-facade.homo.tapila.cloud/payment-links/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => '<string>',
'expiresAt' => '2023-11-07T05:31:56Z',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-authorization-token: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tapipay-facade.homo.tapila.cloud/payment-links/{id}"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-authorization-token", "<api-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.patch("https://tapipay-facade.homo.tapila.cloud/payment-links/{id}")
.header("x-api-key", "<api-key>")
.header("x-authorization-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tapipay-facade.homo.tapila.cloud/payment-links/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["x-authorization-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"expiresAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"paymentLinkId": "plk_61a837f5-3c67-423a-ade7-94b78e0007cb",
"status": "ACTIVE",
"amount": 4500,
"currency": "MXN",
"description": "Factura única #777",
"singleUse": true,
"paymentUrl": "https://app.tapipay.la/s/acme-corp/portal/McXmbnKaju/debts/payment-methods?externalRequestId=pl-debt-FAC-777",
"createdAt": "2026-06-03T19:20:00.000Z",
"debtId": "debt_pl-debt-FAC-777",
"externalPaymentLinkId": "FAC-777",
"expiresAt": "2026-06-30T23:59:59.000Z",
"successUrl": null,
"metadata": null,
"identifierValue": "acm-x3kM9pQr",
"contact": null,
"product": null
},
"requestId": "<string>"
}Autorizaciones
API key del API Gateway de Tapi. Requerida en todas las operaciones. Distinta por ambiente (desarrollo, homologación, producción).
Token TAPI JWT. Requerido en todas las operaciones. Se envía sin prefijo "Bearer". Ej: x-authorization-token: eyJhbGci...
Parámetros de ruta
ID público con prefijo plk_ o el mismo valor sin prefijo.
"plk_61a837f5-3c67-423a-ade7-94b78e0007cb"
Cuerpo
Nueva descripción (string no vacío; vacía devuelve 400)
1Nueva fecha de expiración, date-time RFC 3339 en el futuro. null devuelve 400: no se permiten links sin vencimiento. Se guarda en UTC con Z y actualiza también el vencimiento de la deuda asociada a la fecha UTC de expiresAt (ej. 2027-02-10T23:30:00-06:00 hace que la deuda venza el 2027-02-11). Si la deuda asociada ya fue cancelada, solo se actualiza el link.
Nuevos metadatos, objeto plano (reemplaza completamente los existentes). null o un valor que no es objeto devuelve 400.
Respuesta
Link de pago actualizado
externalPaymentLinkId, expiresAt, successUrl, metadata, identifierValue, contact y product siempre vienen, con null cuando no hay valor.
Show child attributes
Show child attributes
{
"paymentLinkId": "plk_61a837f5-3c67-423a-ade7-94b78e0007cb",
"status": "ACTIVE",
"amount": 4500,
"currency": "MXN",
"description": "Factura única #777",
"singleUse": true,
"paymentUrl": "https://app.tapipay.la/s/acme-corp/portal/McXmbnKaju/debts/payment-methods?externalRequestId=pl-debt-FAC-777",
"createdAt": "2026-06-03T19:20:00.000Z",
"debtId": "debt_pl-debt-FAC-777",
"externalPaymentLinkId": "FAC-777",
"expiresAt": "2026-06-30T23:59:59.000Z",
"successUrl": null,
"metadata": null,
"identifierValue": "acm-x3kM9pQr",
"contact": null,
"product": null
}

