Replace the card's products
Sets the product list of an existing card.
The list you send replaces the current one entirely, so the body carries the card’s final product list. Sending products: [] removes all products from the card.
Each item points to a product already registered in the catalog, by productId or by sku. The API does not create new products, and a SKU that does not exist returns 404.
unitPrice is optional. Without it, the product’s current catalog price applies. The card’s productsTotal is recalculated automatically, and you do not need to send it.
The change is recorded in the card’s history, with source api.
curl --request PUT \
--url https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"products": [
{
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9
}
]
}
'import requests
url = "https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products"
payload = { "products": [
{
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9
}
] }
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({products: [{sku: 'CAM-PRETA-M', quantity: 2, unitPrice: 149.9}]})
};
fetch('https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products', 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.connectadesk.com/api/v1/crm/cards/{cardId}/products",
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([
'products' => [
[
'sku' => 'CAM-PRETA-M',
'quantity' => 2,
'unitPrice' => 149.9
]
]
]),
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://api.connectadesk.com/api/v1/crm/cards/{cardId}/products"
payload := strings.NewReader("{\n \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\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://api.connectadesk.com/api/v1/crm/cards/{cardId}/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products")
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 \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 4471,
"name": "Pedido #88213",
"description": "Customer asked for a call back on Monday morning.",
"won": false,
"wonDate": null,
"statusReason": null,
"boardId": 7,
"list": {
"id": 31,
"name": "Aguardando envio"
},
"status": {
"id": 2,
"name": "Em negociação",
"color": "#F59E0B"
},
"business": {
"id": 9,
"name": "Varejo"
},
"origin": {
"id": 5,
"name": "Instagram"
},
"assignedTo": {
"id": 3,
"name": "Gabriel Goulart"
},
"contacts": [
{
"id": 1042,
"name": "Marina Alves",
"number": "5511999999999",
"email": "marina@exemplo.com.br",
"code": "CLI-8842",
"cpfCnpj": "12345678909",
"origin": "Site",
"profilePicUrl": "https://cdn.exemplo.com.br/avatar/1042.jpg",
"isGroup": false,
"instagramUsername": "marina.alves",
"sourceUrl": "https://loja.exemplo.com.br/promo",
"sourceId": "23851234567890123",
"headline": "Coleção de inverno",
"utmSource": "instagram",
"utmMedium": "cpc",
"utmCampaign": "inverno-2026",
"utmId": "6543210987",
"tags": [
{
"id": 3,
"name": "Cliente VIP",
"color": "#6941C6"
}
],
"customFields": [
{
"key": "plano",
"value": "Ouro",
"customFieldId": 91,
"name": "Plano",
"type": "select"
}
],
"lastChannel": {
"id": 11,
"name": "Instagram Loja",
"type": "instagram"
},
"createdAt": "2026-07-14T13:22:05.412Z",
"updatedAt": "2026-08-18T09:41:17.883Z"
}
],
"products": [
{
"id": 812,
"productId": 55,
"name": "Camiseta preta M",
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9,
"totalPrice": 299.8
}
],
"productsTotal": 299.8,
"customFields": [
{
"key": "prioridade",
"value": "Alta",
"customFieldId": 77,
"name": "Prioridade",
"type": "select"
}
],
"creationSource": "api",
"due": "2026-09-15T12:00:00.000Z",
"createdAt": "2026-09-08T14:32:10.000Z",
"updatedAt": "2026-09-08T16:02:44.000Z"
}
}{
"error": {
"code": "ERR_PRODUCT_INVALID_PRICE",
"message": "Preço unitário inválido."
}
}{
"error": {
"code": "ERR_API_UNAUTHORIZED",
"message": "Token de API ausente ou inválido."
}
}{
"error": {
"code": "ERR_API_FORBIDDEN_SCOPE",
"message": "O token não tem permissão para este método neste módulo. A mensagem real nomeia os dois."
}
}{
"error": {
"code": "PRODUCT_NOT_FOUND",
"message": "Produto não encontrado: id/sku=CAM-PRETA-XG"
}
}{
"error": {
"code": "ERR_API_VALIDATION",
"message": "O parâmetro `application` é obrigatório e aceita \"contact\" ou \"card\"."
}
}{
"error": {
"code": "ERR_API_RATE_LIMIT",
"message": "Limite de requisições por minuto excedido para esta empresa."
}
}Authorizations
API token in the sk_live_… format.
Path Parameters
Body
Final list of the card's products. It replaces the previous one.
Show child attributes
Show child attributes
Response
OK
A card on a CRM board. The response includes only the fields listed here.
Show child attributes
Show child attributes
{
"id": 4471,
"name": "Pedido #88213",
"description": "Customer asked for a call back on Monday morning.",
"won": false,
"wonDate": null,
"statusReason": null,
"boardId": 7,
"list": { "id": 31, "name": "Aguardando envio" },
"status": {
"id": 2,
"name": "Em negociação",
"color": "#F59E0B"
},
"business": { "id": 9, "name": "Varejo" },
"origin": { "id": 5, "name": "Instagram" },
"assignedTo": { "id": 3, "name": "Gabriel Goulart" },
"contacts": [
{
"id": 1042,
"name": "Marina Alves",
"number": "5511999999999",
"email": "marina@exemplo.com.br",
"code": "CLI-8842",
"cpfCnpj": "12345678909",
"origin": "Site",
"profilePicUrl": "https://cdn.exemplo.com.br/avatar/1042.jpg",
"isGroup": false,
"instagramUsername": "marina.alves",
"sourceUrl": "https://loja.exemplo.com.br/promo",
"sourceId": "23851234567890123",
"headline": "Coleção de inverno",
"utmSource": "instagram",
"utmMedium": "cpc",
"utmCampaign": "inverno-2026",
"utmId": "6543210987",
"tags": [
{
"id": 3,
"name": "Cliente VIP",
"color": "#6941C6"
}
],
"customFields": [
{
"key": "plano",
"value": "Ouro",
"customFieldId": 91,
"name": "Plano",
"type": "select"
}
],
"lastChannel": {
"id": 11,
"name": "Instagram Loja",
"type": "instagram"
},
"createdAt": "2026-07-14T13:22:05.412Z",
"updatedAt": "2026-08-18T09:41:17.883Z"
}
],
"products": [
{
"id": 812,
"productId": 55,
"name": "Camiseta preta M",
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9,
"totalPrice": 299.8
}
],
"productsTotal": 299.8,
"customFields": [
{
"key": "prioridade",
"value": "Alta",
"customFieldId": 77,
"name": "Prioridade",
"type": "select"
}
],
"creationSource": "api",
"due": "2026-09-15T12:00:00.000Z",
"createdAt": "2026-09-08T14:32:10.000Z",
"updatedAt": "2026-09-08T16:02:44.000Z"
}
curl --request PUT \
--url https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"products": [
{
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9
}
]
}
'import requests
url = "https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products"
payload = { "products": [
{
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9
}
] }
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({products: [{sku: 'CAM-PRETA-M', quantity: 2, unitPrice: 149.9}]})
};
fetch('https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products', 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.connectadesk.com/api/v1/crm/cards/{cardId}/products",
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([
'products' => [
[
'sku' => 'CAM-PRETA-M',
'quantity' => 2,
'unitPrice' => 149.9
]
]
]),
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://api.connectadesk.com/api/v1/crm/cards/{cardId}/products"
payload := strings.NewReader("{\n \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\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://api.connectadesk.com/api/v1/crm/cards/{cardId}/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/crm/cards/{cardId}/products")
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 \"products\": [\n {\n \"sku\": \"CAM-PRETA-M\",\n \"quantity\": 2,\n \"unitPrice\": 149.9\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 4471,
"name": "Pedido #88213",
"description": "Customer asked for a call back on Monday morning.",
"won": false,
"wonDate": null,
"statusReason": null,
"boardId": 7,
"list": {
"id": 31,
"name": "Aguardando envio"
},
"status": {
"id": 2,
"name": "Em negociação",
"color": "#F59E0B"
},
"business": {
"id": 9,
"name": "Varejo"
},
"origin": {
"id": 5,
"name": "Instagram"
},
"assignedTo": {
"id": 3,
"name": "Gabriel Goulart"
},
"contacts": [
{
"id": 1042,
"name": "Marina Alves",
"number": "5511999999999",
"email": "marina@exemplo.com.br",
"code": "CLI-8842",
"cpfCnpj": "12345678909",
"origin": "Site",
"profilePicUrl": "https://cdn.exemplo.com.br/avatar/1042.jpg",
"isGroup": false,
"instagramUsername": "marina.alves",
"sourceUrl": "https://loja.exemplo.com.br/promo",
"sourceId": "23851234567890123",
"headline": "Coleção de inverno",
"utmSource": "instagram",
"utmMedium": "cpc",
"utmCampaign": "inverno-2026",
"utmId": "6543210987",
"tags": [
{
"id": 3,
"name": "Cliente VIP",
"color": "#6941C6"
}
],
"customFields": [
{
"key": "plano",
"value": "Ouro",
"customFieldId": 91,
"name": "Plano",
"type": "select"
}
],
"lastChannel": {
"id": 11,
"name": "Instagram Loja",
"type": "instagram"
},
"createdAt": "2026-07-14T13:22:05.412Z",
"updatedAt": "2026-08-18T09:41:17.883Z"
}
],
"products": [
{
"id": 812,
"productId": 55,
"name": "Camiseta preta M",
"sku": "CAM-PRETA-M",
"quantity": 2,
"unitPrice": 149.9,
"totalPrice": 299.8
}
],
"productsTotal": 299.8,
"customFields": [
{
"key": "prioridade",
"value": "Alta",
"customFieldId": 77,
"name": "Prioridade",
"type": "select"
}
],
"creationSource": "api",
"due": "2026-09-15T12:00:00.000Z",
"createdAt": "2026-09-08T14:32:10.000Z",
"updatedAt": "2026-09-08T16:02:44.000Z"
}
}{
"error": {
"code": "ERR_PRODUCT_INVALID_PRICE",
"message": "Preço unitário inválido."
}
}{
"error": {
"code": "ERR_API_UNAUTHORIZED",
"message": "Token de API ausente ou inválido."
}
}{
"error": {
"code": "ERR_API_FORBIDDEN_SCOPE",
"message": "O token não tem permissão para este método neste módulo. A mensagem real nomeia os dois."
}
}{
"error": {
"code": "PRODUCT_NOT_FOUND",
"message": "Produto não encontrado: id/sku=CAM-PRETA-XG"
}
}{
"error": {
"code": "ERR_API_VALIDATION",
"message": "O parâmetro `application` é obrigatório e aceita \"contact\" ou \"card\"."
}
}{
"error": {
"code": "ERR_API_RATE_LIMIT",
"message": "Limite de requisições por minuto excedido para esta empresa."
}
}
