Skip to main content
POST
/
containers
/
{container_id}
/
custom_fields
Create a container custom field
curl --request POST \
  --url https://api.terminal49.com/v2/containers/{container_id}/custom_fields \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "data": {
    "type": "custom_field",
    "attributes": {
      "api_slug": "customer_reference_number",
      "value": "ABC124"
    }
  }
}
'
import requests

url = "https://api.terminal49.com/v2/containers/{container_id}/custom_fields"

payload = { "data": {
"type": "custom_field",
"attributes": {
"api_slug": "customer_reference_number",
"value": "ABC124"
}
} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
type: 'custom_field',
attributes: {api_slug: 'customer_reference_number', value: 'ABC124'}
}
})
};

fetch('https://api.terminal49.com/v2/containers/{container_id}/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://api.terminal49.com/v2/containers/{container_id}/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([
'data' => [
'type' => 'custom_field',
'attributes' => [
'api_slug' => 'customer_reference_number',
'value' => 'ABC124'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.terminal49.com/v2/containers/{container_id}/custom_fields"

payload := strings.NewReader("{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"customer_reference_number\",\n \"value\": \"ABC124\"\n }\n }\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "<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.terminal49.com/v2/containers/{container_id}/custom_fields")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"customer_reference_number\",\n \"value\": \"ABC124\"\n }\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.terminal49.com/v2/containers/{container_id}/custom_fields")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"customer_reference_number\",\n \"value\": \"ABC124\"\n }\n }\n}"

response = http.request(request)
puts response.read_body
{
  "data": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "type": "custom_field",
    "attributes": {
      "api_slug": "<string>",
      "value": "<string>",
      "display_value": "<string>"
    },
    "relationships": {
      "entity": {
        "data": {
          "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
        }
      },
      "definition": {
        "data": {
          "type": "custom_field_definition",
          "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
        }
      }
    }
  },
  "links": {
    "self": "<string>"
  }
}
Creates or updates a custom field on a container. If a custom field with the specified api_slug already exists, it will be updated.

Path parameters

ParameterRequiredDescription
container_idYesThe ID of the container

Request body

ParameterRequiredDescription
data.typeYesMust be custom_field
data.attributes.api_slugYesThe slug of the custom field definition
data.attributes.valueYesThe value to set (type depends on the definition’s data type)
The container is implied by the path, so do not send data.relationships.entity on this endpoint.

Authorization

Requires update permission on the container.

Response

Returns 201 Created with the custom field resource on success.

Behavior

  • Uses find_or_initialize_by internally, so it creates if missing or updates if it exists
  • Values are validated against the definition’s data type
  • For enum fields, values are validated against the definition’s options

Example request

{
  "data": {
    "type": "custom_field",
    "attributes": {
      "api_slug": "customer_reference_number",
      "value": "ABC124"
    }
  }
}

Example response

{
  "data": {
    "id": "YOUR_CUSTOM_FIELD_ID",
    "type": "custom_field",
    "attributes": {
      "api_slug": "customer_reference_number",
      "value": "ABC124",
      "display_value": "ABC124"
    },
    "relationships": {
      "entity": {
        "data": {
          "id": "YOUR_CONTAINER_ID",
          "type": "container"
        }
      },
      "definition": {
        "data": {
          "id": "YOUR_DEFINITION_ID",
          "type": "custom_field_definition"
        }
      }
    }
  }
}

Authorizations

Authorization
string
header
required

Use a Terminal49 API key in the Authorization header with the Token prefix.

Authorization: Token YOUR_API_KEY

Path Parameters

container_id
string
required

Container ID

Body

application/json
data
object

Response

201 - application/json

Created

data
Custom field · object