curl --request PUT \
--url https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId} \
--header 'Content-Type: application/json' \
--data '
{
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"skuCode": "CONS-LOG-001",
"type": "SERVICE",
"status": "DEACTIVATED"
}
'import requests
url = "https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}"
payload = {
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"skuCode": "CONS-LOG-001",
"type": "SERVICE",
"status": "DEACTIVATED"
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Consultoria em logística',
description: 'Hora técnica de consultoria em logística e roteirização.',
value: 15000,
skuCode: 'CONS-LOG-001',
type: 'SERVICE',
status: 'DEACTIVATED'
})
};
fetch('https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}', 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.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}",
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([
'name' => 'Consultoria em logística',
'description' => 'Hora técnica de consultoria em logística e roteirização.',
'value' => 15000,
'skuCode' => 'CONS-LOG-001',
'type' => 'SERVICE',
'status' => 'DEACTIVATED'
]),
CURLOPT_HTTPHEADER => [
"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.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}"
payload := strings.NewReader("{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b2f6c1e-3d4a-4f7b-8e21-5a6c7d8e9f01",
"realmId": "f495ff0c-ab54-4f99-8e92-ca8682e4de9b",
"organizationId": "c4bd3f21-dfbd-44e8-8055-68ba15bed410",
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"type": "SERVICE",
"status": "ACTIVE",
"skuCode": "CONS-LOG-001",
"createdAt": "2026-10-02T14:03:11.000Z",
"updatedAt": "2026-10-05T09:30:00.000Z"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "PRODUCT_HAS_ACTIVE_PAYMENT_LINKS",
"origin": "REGISTRY",
"message": "Product has active payment links"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "PRODUCT_NOT_FOUND",
"origin": "REGISTRY",
"message": "Product not found"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "BAD_REQUEST",
"origin": "REGISTRY",
"message": "Bad Request: Your request is invalid or incomplete. Please make sure you are requesting with the right fields.",
"fields": [
{
"field": "name",
"message": "Too big: expected string to have <=56 characters",
"code": "NAME_MAX"
}
]
}Update a product
Updates a product.
curl --request PUT \
--url https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId} \
--header 'Content-Type: application/json' \
--data '
{
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"skuCode": "CONS-LOG-001",
"type": "SERVICE",
"status": "DEACTIVATED"
}
'import requests
url = "https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}"
payload = {
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"skuCode": "CONS-LOG-001",
"type": "SERVICE",
"status": "DEACTIVATED"
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Consultoria em logística',
description: 'Hora técnica de consultoria em logística e roteirização.',
value: 15000,
skuCode: 'CONS-LOG-001',
type: 'SERVICE',
status: 'DEACTIVATED'
})
};
fetch('https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}', 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.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}",
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([
'name' => 'Consultoria em logística',
'description' => 'Hora técnica de consultoria em logística e roteirização.',
'value' => 15000,
'skuCode' => 'CONS-LOG-001',
'type' => 'SERVICE',
'status' => 'DEACTIVATED'
]),
CURLOPT_HTTPHEADER => [
"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.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}"
payload := strings.NewReader("{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.registry.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/products/{productId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Consultoria em logística\",\n \"description\": \"Hora técnica de consultoria em logística e roteirização.\",\n \"value\": 15000,\n \"skuCode\": \"CONS-LOG-001\",\n \"type\": \"SERVICE\",\n \"status\": \"DEACTIVATED\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b2f6c1e-3d4a-4f7b-8e21-5a6c7d8e9f01",
"realmId": "f495ff0c-ab54-4f99-8e92-ca8682e4de9b",
"organizationId": "c4bd3f21-dfbd-44e8-8055-68ba15bed410",
"name": "Consultoria em logística",
"description": "Hora técnica de consultoria em logística e roteirização.",
"value": 15000,
"type": "SERVICE",
"status": "ACTIVE",
"skuCode": "CONS-LOG-001",
"createdAt": "2026-10-02T14:03:11.000Z",
"updatedAt": "2026-10-05T09:30:00.000Z"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "PRODUCT_HAS_ACTIVE_PAYMENT_LINKS",
"origin": "REGISTRY",
"message": "Product has active payment links"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "PRODUCT_NOT_FOUND",
"origin": "REGISTRY",
"message": "Product not found"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "BAD_REQUEST",
"origin": "REGISTRY",
"message": "Bad Request: Your request is invalid or incomplete. Please make sure you are requesting with the right fields.",
"fields": [
{
"field": "name",
"message": "Too big: expected string to have <=56 characters",
"code": "NAME_MAX"
}
]
}value is the price in centavos, so 15000 is R$ 150,00. Answers the product as it is after the change.
status changes the product’s status too: ACTIVE brings a deactivated product back, and DEACTIVATED retires an active one. A product that still has active payment links can’t be deactivated: end those links first. Setting a status the product already has changes nothing.Path Parameters
ID of your realm.
Format: UUID
ID of the organization the product belongs to.
Format: UUID
ID of the product (id in the product list).
Format: UUID
Body
New name, 2 to 56 characters. Omit it to keep the current one.
2 - 56"Consultoria em logística"
New description, up to 250 characters. Omit it to keep the current one; send an empty string to clear it.
250"Hora técnica de consultoria em logística e roteirização."
New price in centavos: 15000 is R$ 150,00. Must be greater than zero. Omit it to keep the current one.
x > 015000
New stock-keeping code. Omit it to keep the current one.
"CONS-LOG-001"
PRODUCT for a physical good or SERVICE for a service. Any other text is stored as sent, and the exports show it as a service. Omit it to keep the current one.
"SERVICE"
ACTIVE or DEACTIVATED. Omit it to keep the current status. Setting DEACTIVATED on an active product is refused while it still has active payment links.
ACTIVE, DEACTIVATED "DEACTIVATED"
Response
Successful response
A product or service of the organization's catalog.
ID of the product.
"9b2f6c1e-3d4a-4f7b-8e21-5a6c7d8e9f01"
ID of the realm the product belongs to.
"f495ff0c-ab54-4f99-8e92-ca8682e4de9b"
ID of the organization the product belongs to.
"c4bd3f21-dfbd-44e8-8055-68ba15bed410"
Name of the product or service.
"Consultoria em logística"
Free-text description. Empty when none was given.
"Hora técnica de consultoria em logística e roteirização."
Price in centavos: 15000 is R$ 150,00.
15000
PRODUCT for a physical good or SERVICE for a service. Any other text a client stored is kept as sent.
"SERVICE"
ACTIVE, or DEACTIVATED once the product was retired.
ACTIVE, DEACTIVATED "ACTIVE"
Your own stock-keeping code. Absent, or null, when none was given.
"CONS-LOG-001"
When the product was created.
"2026-10-02T14:03:11.000Z"
When the product was last changed.
"2026-10-05T09:30:00.000Z"