curl --request PATCH \
--url https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
]
}
'import requests
url = "https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}"
payload = { "rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
] }
headers = {
"X-API-KEY": "<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>', 'Content-Type': 'application/json'},
body: JSON.stringify({rows: [{quantity: 123, price: 123, from: 123, to: 123, packageSize: 123}]})
};
fetch('https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}', 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.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}",
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([
'rows' => [
[
'quantity' => 123,
'price' => 123,
'from' => 123,
'to' => 123,
'packageSize' => 123
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}"
payload := strings.NewReader("{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<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://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}")
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["Content-Type"] = 'application/json'
request.body = "{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"contractId": "<string>",
"externalId": "<string>",
"subTotal": 123,
"totalDiscount": 123,
"totalTax": 123,
"total": 123,
"items": [
{
"itemId": "<string>",
"name": "<string>",
"subTotal": 123,
"discount": 123,
"tax": 123,
"total": 123
}
],
"currency": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z",
"netTerms": 123,
"legalEntityId": "<string>",
"paymentAccountId": "<string>"
}
}{
"message": "<string>",
"code": "BadUserInput",
"reason": "<string>"
}{
"message": "<string>",
"code": "Unauthenticated"
}{
"message": "<string>",
"code": "IdentityForbidden"
}{
"message": "<string>",
"code": "CustomerNotFound"
}{
"message": "<string>",
"code": "RateLimitExceeded"
}Update a contract
Replaces one line item’s rows, leaving the rest of the contract untouched. Use it to re-price a single item, or to restate its tiers.
curl --request PATCH \
--url https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
]
}
'import requests
url = "https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}"
payload = { "rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
] }
headers = {
"X-API-KEY": "<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>', 'Content-Type': 'application/json'},
body: JSON.stringify({rows: [{quantity: 123, price: 123, from: 123, to: 123, packageSize: 123}]})
};
fetch('https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}', 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.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}",
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([
'rows' => [
[
'quantity' => 123,
'price' => 123,
'from' => 123,
'to' => 123,
'packageSize' => 123
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}"
payload := strings.NewReader("{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<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://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stigg.io/api/v1/contracts/{id}/billing/items/{itemRef}")
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["Content-Type"] = 'application/json'
request.body = "{\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"contractId": "<string>",
"externalId": "<string>",
"subTotal": 123,
"totalDiscount": 123,
"totalTax": 123,
"total": 123,
"items": [
{
"itemId": "<string>",
"name": "<string>",
"subTotal": 123,
"discount": 123,
"tax": 123,
"total": 123
}
],
"currency": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z",
"netTerms": 123,
"legalEntityId": "<string>",
"paymentAccountId": "<string>"
}
}{
"message": "<string>",
"code": "BadUserInput",
"reason": "<string>"
}{
"message": "<string>",
"code": "Unauthenticated"
}{
"message": "<string>",
"code": "IdentityForbidden"
}{
"message": "<string>",
"code": "CustomerNotFound"
}{
"message": "<string>",
"code": "RateLimitExceeded"
}Authorizations
Server API Key
Headers
Account ID — optional when authenticating with a user JWT (Bearer token); falls back to the user's first membership. Ignored for API-key auth.
Environment ID — required when authenticating with a user JWT (Bearer token) on environment-scoped endpoints. Ignored for API-key auth (env is intrinsic to the key).
Path Parameters
The unique identifier of the entity
1 - 255Line item reference on the contract
255Body
Input for replacing one line item's rows. The rest of the contract is left untouched.
Show child attributes
Show child attributes
Response
The contract's recomputed totals.
Response object
A contract's pre-publish totals, with a per line item breakdown — read this before publishing, since after publishing these are the figures the customer is invoiced.
Show child attributes
Show child attributes
Related topics
Update a contractDelete contractScheduled updatesCanceling scheduled updatesGet a list of contracts