Products
Update product
Updates an existing product. Changing code to an already existing code returns a 409 conflict error. Requires crm:write scope.
PATCH
/
products
/
{id}
Update Product
curl --request PATCH \
--url https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Annual Enterprise License v2",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "user/year",
"unit_price": 1400,
"custom_fields": {}
}
'import requests
url = "https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}"
payload = {
"name": "Annual Enterprise License v2",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "user/year",
"unit_price": 1400,
"custom_fields": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Annual Enterprise License v2',
code: 'LIC-ENT-001',
category: 'Software Subscriptions',
unit: 'user/year',
unit_price: 1400,
custom_fields: {}
})
};
fetch('https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}', 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://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Annual Enterprise License v2',
'code' => 'LIC-ENT-001',
'category' => 'Software Subscriptions',
'unit' => 'user/year',
'unit_price' => 1400,
'custom_fields' => [
]
]),
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://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}"
payload := strings.NewReader("{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "prod_128bca",
"name": "Annual Enterprise License",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "seat",
"unit_price": 1200,
"custom_fields": {
"tier": "Enterprise",
"tier_level": 1
},
"created_at": "2026-10-26T07:00:00.000Z",
"updated_at": "2026-10-26T07:00:00.000Z"
},
"error": null
}{
"success": false,
"data": null,
"error": {
"message": "Validation failed",
"details": [
{
"message": "Required",
"field": "email",
"code": "invalid_type"
}
]
}
}{
"success": false,
"data": null,
"error": {
"message": "Invalid or missing API key."
}
}{
"success": false,
"data": null,
"error": {
"message": "Forbidden: insufficient permissions for this operation."
}
}{
"success": false,
"data": null,
"error": {
"message": "Resource not found"
}
}{
"success": false,
"data": null,
"error": {
"message": "Conflict: resource with unique identifier already exists."
}
}Updates fields on an existing product record.
Path parameters
id(string, required): The unique identifier of the product to update.
Conflict rules
If you modify the product’scode, it must not conflict with any other existing product code in your workspace.
Required permissions
Requires an API key with thecrm:write scope.Authorizations
Workspace API key header. The key implicitly determines your workspace isolation. Scopes: crm:read for GET/HEAD/OPTIONS, crm:write for POST/PATCH/PUT/DELETE.
Path Parameters
The unique identifier of the product
Body
application/json
⌘I
Update Product
curl --request PATCH \
--url https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Annual Enterprise License v2",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "user/year",
"unit_price": 1400,
"custom_fields": {}
}
'import requests
url = "https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}"
payload = {
"name": "Annual Enterprise License v2",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "user/year",
"unit_price": 1400,
"custom_fields": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Annual Enterprise License v2',
code: 'LIC-ENT-001',
category: 'Software Subscriptions',
unit: 'user/year',
unit_price: 1400,
custom_fields: {}
})
};
fetch('https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}', 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://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Annual Enterprise License v2',
'code' => 'LIC-ENT-001',
'category' => 'Software Subscriptions',
'unit' => 'user/year',
'unit_price' => 1400,
'custom_fields' => [
]
]),
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://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}"
payload := strings.NewReader("{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://crm-api.automatebusiness.com/api/v1/integrations-public/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Annual Enterprise License v2\",\n \"code\": \"LIC-ENT-001\",\n \"category\": \"Software Subscriptions\",\n \"unit\": \"user/year\",\n \"unit_price\": 1400,\n \"custom_fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "prod_128bca",
"name": "Annual Enterprise License",
"code": "LIC-ENT-001",
"category": "Software Subscriptions",
"unit": "seat",
"unit_price": 1200,
"custom_fields": {
"tier": "Enterprise",
"tier_level": 1
},
"created_at": "2026-10-26T07:00:00.000Z",
"updated_at": "2026-10-26T07:00:00.000Z"
},
"error": null
}{
"success": false,
"data": null,
"error": {
"message": "Validation failed",
"details": [
{
"message": "Required",
"field": "email",
"code": "invalid_type"
}
]
}
}{
"success": false,
"data": null,
"error": {
"message": "Invalid or missing API key."
}
}{
"success": false,
"data": null,
"error": {
"message": "Forbidden: insufficient permissions for this operation."
}
}{
"success": false,
"data": null,
"error": {
"message": "Resource not found"
}
}{
"success": false,
"data": null,
"error": {
"message": "Conflict: resource with unique identifier already exists."
}
}