curl --request PUT \
--url https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"Customer PO": "PO-98765",
"Expected Delivery": "2024-12-25",
"Priority Level": "High",
"Item Count": 42,
"Sales Channels": [
"Retail",
"Wholesale"
]
}
'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields"
payload = {
"Customer PO": "PO-98765",
"Expected Delivery": "2024-12-25",
"Priority Level": "High",
"Item Count": 42,
"Sales Channels": ["Retail", "Wholesale"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
'Customer PO': 'PO-98765',
'Expected Delivery': '2024-12-25',
'Priority Level': 'High',
'Item Count': 42,
'Sales Channels': ['Retail', 'Wholesale']
})
};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields', 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://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields",
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([
'Customer PO' => 'PO-98765',
'Expected Delivery' => '2024-12-25',
'Priority Level' => 'High',
'Item Count' => 42,
'Sales Channels' => [
'Retail',
'Wholesale'
]
]),
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://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields"
payload := strings.NewReader("{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Custom fields updated successfully"
}{
"message": "<string>"
}{
"message": "<string>"
}Update custom field values
Update custom field values for a specific record.
Supported record types: sales-orders,sales-order-items,invoices,products,purchase-orders,purchase-order-shipments
Values must match the field type (string, number, date, dropdown, or multi_dropdown).
For a multi_dropdown field, pass an array of values (each must be one of the
field’s defined choices).
Custom fields must be set up in Luminous before they can be updated or retrieved. Log into your Luminous account, then via the left navigation select Manage > Custom Fields.
For purchase-orders and purchase-order-shipments, the update is partial and
validated against the custom fields defined for that record type:
- Only the labels sent are changed; other fields keep their values.
- Labels are matched case-insensitively. A label that is not defined for the
record type is rejected with a
422; it is never created automatically. - Sending
null,""or[]for a field clears it. Clearing a required field is rejected with a422. - Each value is checked against its field’s type. If any entry is invalid, nothing
is saved and the
422lists every rejected entry undercustom_fields.{label}. - An empty body is rejected with a
422.
For sales-orders, sales-order-items, invoices and products, each label is
resolved against the custom fields defined for that record type, and the update is
partial (labels not sent keep their values):
- A label that is defined only for a different record type is rejected with a
422naming the label; it is not silently ignored. - A label that is not defined for any record type is still auto-created as a new custom field for this record type, with its type detected from the value. This auto-creation is deprecated; define the field in Manage > Custom Fields first.
- Sending
null,""or[]for a field clears its value (dropdown fields included). Clearing a required field is rejected with a422. An empty value for a label that is not defined is ignored (no field is auto-created). - Each value is checked against its field’s type (a dropdown choice, a string
length, a single value where an array was sent). If any label is rejected, nothing
is saved and the
422lists every rejected label.
curl --request PUT \
--url https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"Customer PO": "PO-98765",
"Expected Delivery": "2024-12-25",
"Priority Level": "High",
"Item Count": 42,
"Sales Channels": [
"Retail",
"Wholesale"
]
}
'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields"
payload = {
"Customer PO": "PO-98765",
"Expected Delivery": "2024-12-25",
"Priority Level": "High",
"Item Count": 42,
"Sales Channels": ["Retail", "Wholesale"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
'Customer PO': 'PO-98765',
'Expected Delivery': '2024-12-25',
'Priority Level': 'High',
'Item Count': 42,
'Sales Channels': ['Retail', 'Wholesale']
})
};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields', 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://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields",
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([
'Customer PO' => 'PO-98765',
'Expected Delivery' => '2024-12-25',
'Priority Level' => 'High',
'Item Count' => 42,
'Sales Channels' => [
'Retail',
'Wholesale'
]
]),
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://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields"
payload := strings.NewReader("{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/{recordType}/{recordId}/custom-fields")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Customer PO\": \"PO-98765\",\n \"Expected Delivery\": \"2024-12-25\",\n \"Priority Level\": \"High\",\n \"Item Count\": 42,\n \"Sales Channels\": [\n \"Retail\",\n \"Wholesale\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Custom fields updated successfully"
}{
"message": "<string>"
}{
"message": "<string>"
}Authorizations
Authenticate using a bearer token. To create a token, navigate to /settings/api-tokens and click Create API Token.
Path Parameters
Type of record to update custom fields for
sales-orders, sales-order-items, invoices, products, purchase-orders, purchase-order-shipments ID of the record
Body
Response
Custom fields updated successfully
"Custom fields updated successfully"