curl --request POST \
--url https://api.stigg.io/api/v1/contracts/{id}/billing/items \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"lineItems": [
{
"name": "<string>",
"externalId": "<string>",
"itemName": "<string>",
"pricingModelId": "<string>",
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
],
"billingCycleUnit": "<string>",
"billingCycleCount": 123,
"discount": 123,
"tax": 123,
"netTerms": 123,
"separateInvoice": true
}
],
"currency": "<string>",
"legalEntityId": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.stigg.io/api/v1/contracts/{id}/billing/items"
payload = {
"lineItems": [
{
"name": "<string>",
"externalId": "<string>",
"itemName": "<string>",
"pricingModelId": "<string>",
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
],
"billingCycleUnit": "<string>",
"billingCycleCount": 123,
"discount": 123,
"tax": 123,
"netTerms": 123,
"separateInvoice": True
}
],
"currency": "<string>",
"legalEntityId": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
lineItems: [
{
name: '<string>',
externalId: '<string>',
itemName: '<string>',
pricingModelId: '<string>',
rows: [{quantity: 123, price: 123, from: 123, to: 123, packageSize: 123}],
billingCycleUnit: '<string>',
billingCycleCount: 123,
discount: 123,
tax: 123,
netTerms: 123,
separateInvoice: true
}
],
currency: '<string>',
legalEntityId: '<string>',
activationStartDate: '2023-11-07T05:31:56Z',
activationEndDate: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.stigg.io/api/v1/contracts/{id}/billing/items', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'lineItems' => [
[
'name' => '<string>',
'externalId' => '<string>',
'itemName' => '<string>',
'pricingModelId' => '<string>',
'rows' => [
[
'quantity' => 123,
'price' => 123,
'from' => 123,
'to' => 123,
'packageSize' => 123
]
],
'billingCycleUnit' => '<string>',
'billingCycleCount' => 123,
'discount' => 123,
'tax' => 123,
'netTerms' => 123,
'separateInvoice' => true
]
],
'currency' => '<string>',
'legalEntityId' => '<string>',
'activationStartDate' => '2023-11-07T05:31:56Z',
'activationEndDate' => '2023-11-07T05:31:56Z'
]),
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"
payload := strings.NewReader("{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.stigg.io/api/v1/contracts/{id}/billing/items")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stigg.io/api/v1/contracts/{id}/billing/items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\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"
}Add contract line items
Appends priced line items to the contract’s billing. Each item is priced by one of the environment’s pricing models, supplying only the row inputs that model exposes — quantity, price, tier bounds, package size. Additive: items already on the contract are left untouched. Requires a contract that has billing set up.
curl --request POST \
--url https://api.stigg.io/api/v1/contracts/{id}/billing/items \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"lineItems": [
{
"name": "<string>",
"externalId": "<string>",
"itemName": "<string>",
"pricingModelId": "<string>",
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
],
"billingCycleUnit": "<string>",
"billingCycleCount": 123,
"discount": 123,
"tax": 123,
"netTerms": 123,
"separateInvoice": true
}
],
"currency": "<string>",
"legalEntityId": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.stigg.io/api/v1/contracts/{id}/billing/items"
payload = {
"lineItems": [
{
"name": "<string>",
"externalId": "<string>",
"itemName": "<string>",
"pricingModelId": "<string>",
"rows": [
{
"quantity": 123,
"price": 123,
"from": 123,
"to": 123,
"packageSize": 123
}
],
"billingCycleUnit": "<string>",
"billingCycleCount": 123,
"discount": 123,
"tax": 123,
"netTerms": 123,
"separateInvoice": True
}
],
"currency": "<string>",
"legalEntityId": "<string>",
"activationStartDate": "2023-11-07T05:31:56Z",
"activationEndDate": "2023-11-07T05:31:56Z"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
lineItems: [
{
name: '<string>',
externalId: '<string>',
itemName: '<string>',
pricingModelId: '<string>',
rows: [{quantity: 123, price: 123, from: 123, to: 123, packageSize: 123}],
billingCycleUnit: '<string>',
billingCycleCount: 123,
discount: 123,
tax: 123,
netTerms: 123,
separateInvoice: true
}
],
currency: '<string>',
legalEntityId: '<string>',
activationStartDate: '2023-11-07T05:31:56Z',
activationEndDate: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.stigg.io/api/v1/contracts/{id}/billing/items', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'lineItems' => [
[
'name' => '<string>',
'externalId' => '<string>',
'itemName' => '<string>',
'pricingModelId' => '<string>',
'rows' => [
[
'quantity' => 123,
'price' => 123,
'from' => 123,
'to' => 123,
'packageSize' => 123
]
],
'billingCycleUnit' => '<string>',
'billingCycleCount' => 123,
'discount' => 123,
'tax' => 123,
'netTerms' => 123,
'separateInvoice' => true
]
],
'currency' => '<string>',
'legalEntityId' => '<string>',
'activationStartDate' => '2023-11-07T05:31:56Z',
'activationEndDate' => '2023-11-07T05:31:56Z'
]),
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"
payload := strings.NewReader("{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.stigg.io/api/v1/contracts/{id}/billing/items")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stigg.io/api/v1/contracts/{id}/billing/items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"lineItems\": [\n {\n \"name\": \"<string>\",\n \"externalId\": \"<string>\",\n \"itemName\": \"<string>\",\n \"pricingModelId\": \"<string>\",\n \"rows\": [\n {\n \"quantity\": 123,\n \"price\": 123,\n \"from\": 123,\n \"to\": 123,\n \"packageSize\": 123\n }\n ],\n \"billingCycleUnit\": \"<string>\",\n \"billingCycleCount\": 123,\n \"discount\": 123,\n \"tax\": 123,\n \"netTerms\": 123,\n \"separateInvoice\": true\n }\n ],\n \"currency\": \"<string>\",\n \"legalEntityId\": \"<string>\",\n \"activationStartDate\": \"2023-11-07T05:31:56Z\",\n \"activationEndDate\": \"2023-11-07T05:31:56Z\"\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 - 255Body
Input for appending priced line items to a contract. Additive — items already on the contract are left untouched.
1Show child attributes
Show child attributes
Currency for the added items. Defaults to the contract currency
255Legal entity the added items invoice from
255Activation period start for the added items. Defaults to the contract's existing period
Activation period end for the added items. Defaults as above
Response
The contract's recomputed totals, including total contract value.
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
