Create or update a product
When productId identifies a product in the company, that product is updated.
Permission
An OAuth access token with this scope. How to get a token
products:createParameters
Not sure what to enter? Here’s where to find IDs.
client_idquery · stringrequiredRequest body
Sent as application/json.
productIdstring or nullfolderNamestringrequiredsubfolderstring or nullsubfolder2string or nullskustring or nullcostvariesFields
Exactly one of these:
Option 1numberOption 2string^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$. internalNamestringrequiredpricevariesrequiredFields
Exactly one of these:
Option 1numberOption 2string^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$. lineItemNamestringrequireddescriptionNotesstring or nulldescriptionNotestring or nullstatusvariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. recipientCanEditQtyvariesFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. receipientCanEditQtyvariesFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. recipientCanEditTermvariesFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. receipientCanEditTermvariesFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. termBasedPricingvariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. termvariesFields
Exactly one of these:
Option 1numberOption 2string^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$. defaultQtyvariesFields
Exactly one of these:
Option 1numberOption 2string^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$. lockPricingLabelvariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. lockPricingValuevariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. lockTermValuevariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. lockPricingNotesvariesrequiredFields
Exactly one of these:
Option 1booleanOption 2number0, 1. Option 3stringtrue, false, 1, 0, yes, no, y, n. imageUrl1string (uri) or nullimageUrl2string (uri) or nullimageUrl3string (uri) or nullimageUrl4string (uri) or nullimageUrl5string (uri) or null^customfield\d+$keys matching · anyNeeds one of recipientCanEditQty, receipientCanEditQty.
Needs one of recipientCanEditTerm, receipientCanEditTerm.
Responses
200Product created or updated.
dataobjectrequiredFields
statusstringrequiredsuccess. messagestringrequiredproductobjectrequiredFields
idstringrequirednamestringrequiredskustringrequiredlineItemNamestringrequireddescriptionNotesstringrequiredpricenumberrequiredcostnumber or nullrequireddefaultQtynumberrequiredtermnumberrequiredtermBasedPricingbooleanstatusbooleanrequiredfolderNamestringimageImportobjectFields
requestedintegerrequireduploadedintegerrequiredfailedintegerrequiredappliedbooleanrequired400Invalid request or validation failure.
dataobjectrequiredFields
statusstringrequirederror. messagestringrequiredcodestringdocumentRefstringassetGenerationIdstringerrorsarray of objectItem fields
fieldstringrequiredmessagestringrequired401Missing or invalid bearer token or client ID.
errorstringrequirederror_descriptionstring403Insufficient scope, missing add-on, usage limit, or permission denial.
Exactly one of these:
OAuthError
errorstringrequirederror_descriptionstringApiErrorEnvelope
dataobjectrequiredFields
statusstringrequirederror. messagestringrequiredcodestringdocumentRefstringassetGenerationIdstringerrorsarray of objectItem fields
fieldstringrequiredmessagestringrequired429Shared company API request quota exceeded. Wait before retrying.
Retry-Afterheader · integerdataobjectrequiredFields
statusstringrequirederror. messagestringrequiredretryAfterSecondsintegerrequiredRate limit
120 requests a minute per company, shared across REST, Zapier and MCP. On a 429, wait for Retry-After.