curl --request POST \
--url https://sandbox.tight.com/v6/invoicing/invoices/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"previewType": "INVOICE",
"lineItems": [
{
"description": "Consulting services",
"quantity": 2,
"rate": 5000,
"expenseId": "btxn_28868401",
"timeId": "tme_28868401"
}
],
"invoiceNumber": "HAR-1",
"date": "2025-07-26",
"term": {
"type": "NET_30",
"dueDate": "2025-07-26"
},
"paymentMethods": [],
"notes": "<string>",
"attachments": [
{
"publicFileUrl": "https://example.com/files/receipt.pdf",
"caption": "Receipt"
}
],
"installments": [
{
"dueDate": "2025-08-26",
"type": "PERCENT",
"value": 5000
}
],
"dimensionValueIds": [
"<string>"
]
}
'import requests
url = "https://sandbox.tight.com/v6/invoicing/invoices/preview"
payload = {
"previewType": "INVOICE",
"lineItems": [
{
"description": "Consulting services",
"quantity": 2,
"rate": 5000,
"expenseId": "btxn_28868401",
"timeId": "tme_28868401"
}
],
"invoiceNumber": "HAR-1",
"date": "2025-07-26",
"term": {
"type": "NET_30",
"dueDate": "2025-07-26"
},
"paymentMethods": [],
"notes": "<string>",
"attachments": [
{
"publicFileUrl": "https://example.com/files/receipt.pdf",
"caption": "Receipt"
}
],
"installments": [
{
"dueDate": "2025-08-26",
"type": "PERCENT",
"value": 5000
}
],
"dimensionValueIds": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
previewType: 'INVOICE',
lineItems: [
{
description: 'Consulting services',
quantity: 2,
rate: 5000,
expenseId: 'btxn_28868401',
timeId: 'tme_28868401'
}
],
invoiceNumber: 'HAR-1',
date: '2025-07-26',
term: {type: 'NET_30', dueDate: '2025-07-26'},
paymentMethods: [],
notes: '<string>',
attachments: [{publicFileUrl: 'https://example.com/files/receipt.pdf', caption: 'Receipt'}],
installments: [{dueDate: '2025-08-26', type: 'PERCENT', value: 5000}],
dimensionValueIds: ['<string>']
})
};
fetch('https://sandbox.tight.com/v6/invoicing/invoices/preview', 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://sandbox.tight.com/v6/invoicing/invoices/preview",
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([
'previewType' => 'INVOICE',
'lineItems' => [
[
'description' => 'Consulting services',
'quantity' => 2,
'rate' => 5000,
'expenseId' => 'btxn_28868401',
'timeId' => 'tme_28868401'
]
],
'invoiceNumber' => 'HAR-1',
'date' => '2025-07-26',
'term' => [
'type' => 'NET_30',
'dueDate' => '2025-07-26'
],
'paymentMethods' => [
],
'notes' => '<string>',
'attachments' => [
[
'publicFileUrl' => 'https://example.com/files/receipt.pdf',
'caption' => 'Receipt'
]
],
'installments' => [
[
'dueDate' => '2025-08-26',
'type' => 'PERCENT',
'value' => 5000
]
],
'dimensionValueIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://sandbox.tight.com/v6/invoicing/invoices/preview"
payload := strings.NewReader("{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://sandbox.tight.com/v6/invoicing/invoices/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.tight.com/v6/invoicing/invoices/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"result": "SUCCESS",
"data": "<string>"
}{
"result": "FAILURE",
"error": [
{
"type": "REQUIRED",
"message": "Amount is required",
"param": "amount"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "INVALID_TOKEN",
"message": "Invalid access token"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "FORBIDDEN",
"message": "Expired access token"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "BAD_REQUEST",
"message": "Resource not found"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "UNKNOWN_ERROR",
"message": "Something went wrong. Please try again later."
}
]
}Preview an invoice
Render an invoice’s PDF or email preview as an HTML string, or its SMS preview as a plain-text string.
curl --request POST \
--url https://sandbox.tight.com/v6/invoicing/invoices/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"previewType": "INVOICE",
"lineItems": [
{
"description": "Consulting services",
"quantity": 2,
"rate": 5000,
"expenseId": "btxn_28868401",
"timeId": "tme_28868401"
}
],
"invoiceNumber": "HAR-1",
"date": "2025-07-26",
"term": {
"type": "NET_30",
"dueDate": "2025-07-26"
},
"paymentMethods": [],
"notes": "<string>",
"attachments": [
{
"publicFileUrl": "https://example.com/files/receipt.pdf",
"caption": "Receipt"
}
],
"installments": [
{
"dueDate": "2025-08-26",
"type": "PERCENT",
"value": 5000
}
],
"dimensionValueIds": [
"<string>"
]
}
'import requests
url = "https://sandbox.tight.com/v6/invoicing/invoices/preview"
payload = {
"previewType": "INVOICE",
"lineItems": [
{
"description": "Consulting services",
"quantity": 2,
"rate": 5000,
"expenseId": "btxn_28868401",
"timeId": "tme_28868401"
}
],
"invoiceNumber": "HAR-1",
"date": "2025-07-26",
"term": {
"type": "NET_30",
"dueDate": "2025-07-26"
},
"paymentMethods": [],
"notes": "<string>",
"attachments": [
{
"publicFileUrl": "https://example.com/files/receipt.pdf",
"caption": "Receipt"
}
],
"installments": [
{
"dueDate": "2025-08-26",
"type": "PERCENT",
"value": 5000
}
],
"dimensionValueIds": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
previewType: 'INVOICE',
lineItems: [
{
description: 'Consulting services',
quantity: 2,
rate: 5000,
expenseId: 'btxn_28868401',
timeId: 'tme_28868401'
}
],
invoiceNumber: 'HAR-1',
date: '2025-07-26',
term: {type: 'NET_30', dueDate: '2025-07-26'},
paymentMethods: [],
notes: '<string>',
attachments: [{publicFileUrl: 'https://example.com/files/receipt.pdf', caption: 'Receipt'}],
installments: [{dueDate: '2025-08-26', type: 'PERCENT', value: 5000}],
dimensionValueIds: ['<string>']
})
};
fetch('https://sandbox.tight.com/v6/invoicing/invoices/preview', 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://sandbox.tight.com/v6/invoicing/invoices/preview",
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([
'previewType' => 'INVOICE',
'lineItems' => [
[
'description' => 'Consulting services',
'quantity' => 2,
'rate' => 5000,
'expenseId' => 'btxn_28868401',
'timeId' => 'tme_28868401'
]
],
'invoiceNumber' => 'HAR-1',
'date' => '2025-07-26',
'term' => [
'type' => 'NET_30',
'dueDate' => '2025-07-26'
],
'paymentMethods' => [
],
'notes' => '<string>',
'attachments' => [
[
'publicFileUrl' => 'https://example.com/files/receipt.pdf',
'caption' => 'Receipt'
]
],
'installments' => [
[
'dueDate' => '2025-08-26',
'type' => 'PERCENT',
'value' => 5000
]
],
'dimensionValueIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://sandbox.tight.com/v6/invoicing/invoices/preview"
payload := strings.NewReader("{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://sandbox.tight.com/v6/invoicing/invoices/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.tight.com/v6/invoicing/invoices/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"previewType\": \"INVOICE\",\n \"lineItems\": [\n {\n \"description\": \"Consulting services\",\n \"quantity\": 2,\n \"rate\": 5000,\n \"expenseId\": \"btxn_28868401\",\n \"timeId\": \"tme_28868401\"\n }\n ],\n \"invoiceNumber\": \"HAR-1\",\n \"date\": \"2025-07-26\",\n \"term\": {\n \"type\": \"NET_30\",\n \"dueDate\": \"2025-07-26\"\n },\n \"paymentMethods\": [],\n \"notes\": \"<string>\",\n \"attachments\": [\n {\n \"publicFileUrl\": \"https://example.com/files/receipt.pdf\",\n \"caption\": \"Receipt\"\n }\n ],\n \"installments\": [\n {\n \"dueDate\": \"2025-08-26\",\n \"type\": \"PERCENT\",\n \"value\": 5000\n }\n ],\n \"dimensionValueIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"result": "SUCCESS",
"data": "<string>"
}{
"result": "FAILURE",
"error": [
{
"type": "REQUIRED",
"message": "Amount is required",
"param": "amount"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "INVALID_TOKEN",
"message": "Invalid access token"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "FORBIDDEN",
"message": "Expired access token"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "BAD_REQUEST",
"message": "Resource not found"
}
]
}{
"result": "FAILURE",
"error": [
{
"type": "UNKNOWN_ERROR",
"message": "Something went wrong. Please try again later."
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, see Authentication for more detail.
Body
Which rendering of the invoice to return
INVOICE, EMAIL, SMS "INVOICE"
The invoice's line items
1Show child attributes
Show child attributes
The invoice number; auto-derived when omitted
"HAR-1"
The invoice date; defaults to today
"2025-07-26"
Payment term for the invoice
Show child attributes
Show child attributes
Discount applied to the invoice
Show child attributes
Show child attributes
Deposit required for the invoice
Show child attributes
Show child attributes
Payment methods accepted for the invoice
Payment methods accepted for the invoice
CREDIT, ACH, DIRECT Notes for the invoice
The customer being billed
Show child attributes
Show child attributes
Attachments included on the invoice
Show child attributes
Show child attributes
Installments for the invoice
Show child attributes
Show child attributes
Dimension values assigned to the invoice
Dimension values assigned to the invoice