curl --request POST \
--url https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "Industry",
"type": "dropdown",
"options": {
"choices": [
"Retail",
"Wholesale",
"DTC"
],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"object_types": [
"companies",
"products"
]
}
'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields"
payload = {
"label": "Industry",
"type": "dropdown",
"options": {
"choices": ["Retail", "Wholesale", "DTC"],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"object_types": ["companies", "products"]
}
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({
label: 'Industry',
type: 'dropdown',
options: {
choices: ['Retail', 'Wholesale', 'DTC'],
minLength: 0,
maxLength: 255,
helpText: 'Choose the primary sales channel'
},
object_types: ['companies', 'products']
})
};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/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/custom-fields",
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([
'label' => 'Industry',
'type' => 'dropdown',
'options' => [
'choices' => [
'Retail',
'Wholesale',
'DTC'
],
'minLength' => 0,
'maxLength' => 255,
'helpText' => 'Choose the primary sales channel'
],
'object_types' => [
'companies',
'products'
]
]),
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/custom-fields"
payload := strings.NewReader("{\n \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\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://{companyName}.api.joinluminous.com/external/api/v1/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields")
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 \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"label": "Industry",
"type": "dropdown",
"object_types": [
"companies",
"products"
],
"options": {
"choices": [
"Retail",
"Wholesale",
"DTC"
],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"created_at": "2026-04-20T14:30:00Z",
"updated_at": "2026-04-20T14:30:00Z"
}
}{
"error": "Unauthorized",
"message": "Authentication credentials are missing or invalid",
"status_code": 401
}{
"error": "Forbidden",
"message": "You do not have permission to access this resource",
"status_code": 403
}{
"message": "<string>",
"errors": {}
}Create a custom field definition
Create a new custom field definition.
Dropdown fields (type: dropdown) require a non-empty options.choices
array.
curl --request POST \
--url https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "Industry",
"type": "dropdown",
"options": {
"choices": [
"Retail",
"Wholesale",
"DTC"
],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"object_types": [
"companies",
"products"
]
}
'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields"
payload = {
"label": "Industry",
"type": "dropdown",
"options": {
"choices": ["Retail", "Wholesale", "DTC"],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"object_types": ["companies", "products"]
}
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({
label: 'Industry',
type: 'dropdown',
options: {
choices: ['Retail', 'Wholesale', 'DTC'],
minLength: 0,
maxLength: 255,
helpText: 'Choose the primary sales channel'
},
object_types: ['companies', 'products']
})
};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/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/custom-fields",
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([
'label' => 'Industry',
'type' => 'dropdown',
'options' => [
'choices' => [
'Retail',
'Wholesale',
'DTC'
],
'minLength' => 0,
'maxLength' => 255,
'helpText' => 'Choose the primary sales channel'
],
'object_types' => [
'companies',
'products'
]
]),
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/custom-fields"
payload := strings.NewReader("{\n \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\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://{companyName}.api.joinluminous.com/external/api/v1/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/custom-fields")
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 \"label\": \"Industry\",\n \"type\": \"dropdown\",\n \"options\": {\n \"choices\": [\n \"Retail\",\n \"Wholesale\",\n \"DTC\"\n ],\n \"minLength\": 0,\n \"maxLength\": 255,\n \"helpText\": \"Choose the primary sales channel\"\n },\n \"object_types\": [\n \"companies\",\n \"products\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"label": "Industry",
"type": "dropdown",
"object_types": [
"companies",
"products"
],
"options": {
"choices": [
"Retail",
"Wholesale",
"DTC"
],
"minLength": 0,
"maxLength": 255,
"helpText": "Choose the primary sales channel"
},
"created_at": "2026-04-20T14:30:00Z",
"updated_at": "2026-04-20T14:30:00Z"
}
}{
"error": "Unauthorized",
"message": "Authentication credentials are missing or invalid",
"status_code": 401
}{
"error": "Forbidden",
"message": "You do not have permission to access this resource",
"status_code": 403
}{
"message": "<string>",
"errors": {}
}Authorizations
Authenticate using a bearer token. To create a token, navigate to /settings/api-tokens and click Create API Token.
Body
Display label for the custom field. Must be unique across definitions.
255"Industry"
Data type of the custom field
number, date, string, dropdown "dropdown"
Optional configuration for the field. Required when type is dropdown
(must include a non-empty choices array).
Show child attributes
Show child attributes
Entity types this custom field applies to. On update this field is
required — pass an empty array to unlink all entity types.
Accepted values include logical names like sales-orders, sales-order-items,
invoices, products, companies, purchase-orders, etc. (matches the set
accepted by the internal morph-type resolver).
["companies", "products"]
Response
Custom field definition successfully created
Show child attributes
Show child attributes