Revise a draft invoice
Updates draft invoice contents while keeping the same invoice id and URL slug. Each successful update appends an invoice revision entry.
curl --request PUT \
--url https://api-sandbox.paygood.co/invoices/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"merchantId": "mer_01hxy8m1nqk9g3x3y3p0azq2bg",
"currency": "USD",
"lineItems": [
{
"kind": "manual_adjustment",
"description": "Installation labor",
"amount": 2500,
"quantity": 3
}
],
"changeReason": "Labor hours increased"
}
'import requests
url = "https://api-sandbox.paygood.co/invoices/{id}"
payload = {
"merchantId": "mer_01hxy8m1nqk9g3x3y3p0azq2bg",
"currency": "USD",
"lineItems": [
{
"kind": "manual_adjustment",
"description": "Installation labor",
"amount": 2500,
"quantity": 3
}
],
"changeReason": "Labor hours increased"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
merchantId: 'mer_01hxy8m1nqk9g3x3y3p0azq2bg',
currency: 'USD',
lineItems: [
{
kind: 'manual_adjustment',
description: 'Installation labor',
amount: 2500,
quantity: 3
}
],
changeReason: 'Labor hours increased'
})
};
fetch('https://api-sandbox.paygood.co/invoices/{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://api-sandbox.paygood.co/invoices/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'merchantId' => 'mer_01hxy8m1nqk9g3x3y3p0azq2bg',
'currency' => 'USD',
'lineItems' => [
[
'kind' => 'manual_adjustment',
'description' => 'Installation labor',
'amount' => 2500,
'quantity' => 3
]
],
'changeReason' => 'Labor hours increased'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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-sandbox.paygood.co/invoices/{id}"
payload := strings.NewReader("{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.put("https://api-sandbox.paygood.co/invoices/{id}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.paygood.co/invoices/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}"
response = http.request(request)
puts response.read_body{
"invoiceId": "<string>",
"invoiceNumber": "<string>",
"invoiceUrlSlug": "<string>",
"idempotencyKey": "<string>",
"merchantId": "<string>",
"customerId": "<string>",
"currentRevisionNumber": 4503599627370495,
"status": "draft",
"currency": "<string>",
"lineItems": [
{
"kind": "product_charge",
"productId": "<string>",
"description": "<string>",
"quantity": 4503599627370495,
"unitAmount": 4503599627370495,
"lineTotal": 0,
"priceId": "<string>"
}
],
"productTotal": {
"amount": 4503599627370495,
"currency": "<string>"
},
"total": {
"amount": 4503599627370495,
"currency": "<string>"
},
"amountPaid": {
"amount": 4503599627370495,
"currency": "<string>"
},
"amountRemaining": {
"amount": 4503599627370495,
"currency": "<string>"
},
"acceptedPaymentMethods": [
"card"
],
"additionalNotificationEmails": [
"jsmith@example.com"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"dueDate": "2023-11-07T05:31:56Z",
"paidAt": "2023-11-07T05:31:56Z",
"notes": "<string>",
"metadata": {}
}Authorizations
Merchant API key bearer token.
Headers
Client-supplied unique key for safe retries of this mutating request. Scoped per merchant or resource as documented on each endpoint.
"idem-01"
Path Parameters
Invoice TypeID (inv_...) to revise.
"inv_01hxy8m1nqk9g3x3y3p0azq2va"
Body
Revision payload with merchant scope and full replacement line-item snapshot. Supply idempotency via the Idempotency-Key header.
Supported currency code (USD, CAD)
31- Option 1
- Option 2
Show child attributes
Show child attributes
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$2000Show child attributes
Show child attributes
1000Which payment method types checkout may offer for this invoice. Omit to leave unchanged.
1card, bank_account Response
Invoice revised successfully; response includes incremented currentRevisionNumber and unchanged invoiceUrlSlug.
1Secret pay-link token. Anyone holding this value can view and pay the invoice anonymously, so treat it like a credential: safe to send to the customer, never safe to log or expose publicly. Unguessable and unrelated to invoiceId, so it can be rotated without changing the invoice.
110 < x <= 9007199254740991draft, issued, partially_paid, paid, void Supported currency code (USD, CAD)
3- Option 1
- Option 2
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Sum of applied payment allocations, both processed and out-of-band.
Show child attributes
Show child attributes
Computed as total minus amountPaid. Zero when the invoice is fully paid.
Show child attributes
Show child attributes
Which payment method types checkout may offer for this invoice.
card, bank_account ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Show child attributes
Show child attributes
curl --request PUT \
--url https://api-sandbox.paygood.co/invoices/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"merchantId": "mer_01hxy8m1nqk9g3x3y3p0azq2bg",
"currency": "USD",
"lineItems": [
{
"kind": "manual_adjustment",
"description": "Installation labor",
"amount": 2500,
"quantity": 3
}
],
"changeReason": "Labor hours increased"
}
'import requests
url = "https://api-sandbox.paygood.co/invoices/{id}"
payload = {
"merchantId": "mer_01hxy8m1nqk9g3x3y3p0azq2bg",
"currency": "USD",
"lineItems": [
{
"kind": "manual_adjustment",
"description": "Installation labor",
"amount": 2500,
"quantity": 3
}
],
"changeReason": "Labor hours increased"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
merchantId: 'mer_01hxy8m1nqk9g3x3y3p0azq2bg',
currency: 'USD',
lineItems: [
{
kind: 'manual_adjustment',
description: 'Installation labor',
amount: 2500,
quantity: 3
}
],
changeReason: 'Labor hours increased'
})
};
fetch('https://api-sandbox.paygood.co/invoices/{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://api-sandbox.paygood.co/invoices/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'merchantId' => 'mer_01hxy8m1nqk9g3x3y3p0azq2bg',
'currency' => 'USD',
'lineItems' => [
[
'kind' => 'manual_adjustment',
'description' => 'Installation labor',
'amount' => 2500,
'quantity' => 3
]
],
'changeReason' => 'Labor hours increased'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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-sandbox.paygood.co/invoices/{id}"
payload := strings.NewReader("{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.put("https://api-sandbox.paygood.co/invoices/{id}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.paygood.co/invoices/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"merchantId\": \"mer_01hxy8m1nqk9g3x3y3p0azq2bg\",\n \"currency\": \"USD\",\n \"lineItems\": [\n {\n \"kind\": \"manual_adjustment\",\n \"description\": \"Installation labor\",\n \"amount\": 2500,\n \"quantity\": 3\n }\n ],\n \"changeReason\": \"Labor hours increased\"\n}"
response = http.request(request)
puts response.read_body{
"invoiceId": "<string>",
"invoiceNumber": "<string>",
"invoiceUrlSlug": "<string>",
"idempotencyKey": "<string>",
"merchantId": "<string>",
"customerId": "<string>",
"currentRevisionNumber": 4503599627370495,
"status": "draft",
"currency": "<string>",
"lineItems": [
{
"kind": "product_charge",
"productId": "<string>",
"description": "<string>",
"quantity": 4503599627370495,
"unitAmount": 4503599627370495,
"lineTotal": 0,
"priceId": "<string>"
}
],
"productTotal": {
"amount": 4503599627370495,
"currency": "<string>"
},
"total": {
"amount": 4503599627370495,
"currency": "<string>"
},
"amountPaid": {
"amount": 4503599627370495,
"currency": "<string>"
},
"amountRemaining": {
"amount": 4503599627370495,
"currency": "<string>"
},
"acceptedPaymentMethods": [
"card"
],
"additionalNotificationEmails": [
"jsmith@example.com"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"dueDate": "2023-11-07T05:31:56Z",
"paidAt": "2023-11-07T05:31:56Z",
"notes": "<string>",
"metadata": {}
}