KintsugiKintsugi

Create a product

POST/products

Create a product in the resolved organization. Idempotent on externalId and source: sending the same values again returns the existing product unchanged and responds 200 instead of creating a duplicate. If the match is a product you previously deleted, it is restored (not duplicated) so its tax history stays attached to it; a restored product re-enters classification and its status returns to PENDING, so it is not used in tax calculation until it is approved again. The product is not otherwise updated by this call; use PATCH /products/{productId} to update. source accepts only the curated public values. status does not accept ARCHIVED; archive an existing product with DELETE /products/{productId}.

Authorization

Api-KeystringRequired

Your secret API key. Include it with every request.

Headers

Api-Versiondate

Release date, as YYYY-MM-DD. Defaults to 2026-07-21.

Organization-Idstring

Target organization id (Organization-Id selector).

Connection-Idstring

Target connection id; resolves to its organization.

Entity-Idstring

Platform entity id; resolves to a connection's organization.

Entity-Sourcestring

Optional source to disambiguate an Entity-Id.

Body

externalIdstringRequired

Your stable identifier for the product. Creating another product with the same externalId and source returns the existing product (200) instead of a duplicate; use PATCH to update it. The same externalId can still appear on products synced from your connections.

namestringRequired

Human-readable product name.

descriptionstring

Optional product description.

statusPublicProductCreateStatusEnum

Approval status of the product's tax classification. ARCHIVED is not accepted here: archive an existing product with DELETE /products/{id}.

Available options:APPROVEDPARTIALLY_APPROVEDPENDING
productCategoryPublicProductCategoryEnumRequired

Top-level tax category for the product.

Available options:DigitalMiscPhysicalServices
productSubcategorystringRequired

Tax subcategory display label within the category (e.g. 'General Clothing', 'B2B SaaS'). Together with productCategory it resolves to a product tax code; an unrecognized pair returns 400.

taxExemptbooleanRequired

Whether the product is treated as tax-exempt by tax calculation. This is the effective exemption flag applied to transactions.

sourcestring

Origin system of the product (e.g. API, SHOPIFY). Defaults to OTHER. Must be a supported public source; unsupported values are rejected.

Available options:ACUMATICAAIRWALLEXAMAZONAPIAPPLE_APP_STOREBESTBUYBIGCOMMERCEBILL_COMBUNNYCAMPFIRECHARGEBEECHECKOUTCHAMPDEELDUALENTRYEBAYECWIDETSYFACEBOOKFAIREFRESHBOOKSGOOGLE_APP_STOREGOOGLE_EXPRESSGROUPONGUSTOHYPERLINEINSTAGRAMINTUIT_ENTERPRISE_SUITEKICKSTARTERKILL_BILLMACYSMAGENTOMAXIOMERCADO_LIBREMICROSOFT_DYNAMICS_365MODALYSTNETSUITENEWEGGNOCNOCNORDSTROMODOOOPENMETERORBORDWAYOTHERPAYPALPINTERESTPLENTYONEQUICKBOOKSRECURLYRILLETRIPPLINGSAGE-INTACCTSALESFORCESHOPIFYSHOPLINESHOPWARESQUARESPACESTRIPETARGETTIKTOKVERTEX_O_SERIESWALMARTWAYFAIRWISHWIXWOOCOMMERCEXEROZENSKARZOHOZUORA
sourceTaxExemptboolean

Raw tax-exempt signal as reported by the source system, stored for auditing. Distinct from taxExempt (the derived, effective flag). Optional on create; always returned on read.

Response

idstringRequired

Kintsugi's unique identifier for the product.

organizationIdstringRequired

Organization the product belongs to. Send it as Organization-Id to scope a request to this product.

organizationNamestring

Display name of the organization the product belongs to. null when the organization has no name set.

externalIdstringRequired

Your stable identifier for the product, as supplied on create.

skustring[]

SKUs associated with the product. An empty list when it has none.

codestringRequired

Derived product tax code display name.

namestringRequired

Human-readable product name.

descriptionstring

Product description; an empty string when the product has none.

statusPublicProductStatusEnumRequired

Approval status of the product's tax classification.

Available options:APPROVEDPARTIALLY_APPROVEDPENDINGARCHIVED
productCategorystringRequired

Derived display category for the product's tax code.

productSubcategorystringRequired

Derived display subcategory for the product's tax code.

taxExemptbooleanRequired

Effective tax-exemption flag applied by tax calculation.

sourceTaxExemptboolean

Raw tax-exempt signal reported by the source system (audit). null when the source system did not report a signal, which is distinct from an explicit false.

sourcestringRequired

Origin system of the product (e.g. API, SHOPIFY). Any origin outside the published values is reported as OTHER.

Available options:ACUMATICAAIRWALLEXAMAZONAPIAPPLE_APP_STOREBESTBUYBIGCOMMERCEBILL_COMBUNNYCAMPFIRECHARGEBEECHECKOUTCHAMPDEELDUALENTRYEBAYECWIDETSYFACEBOOKFAIREFRESHBOOKSGOOGLE_APP_STOREGOOGLE_EXPRESSGROUPONGUSTOHYPERLINEINSTAGRAMINTUIT_ENTERPRISE_SUITEKICKSTARTERKILL_BILLMACYSMAGENTOMAXIOMERCADO_LIBREMICROSOFT_DYNAMICS_365MODALYSTNETSUITENEWEGGNOCNOCNORDSTROMODOOOPENMETERORBORDWAYOTHERPAYPALPINTERESTPLENTYONEQUICKBOOKSRECURLYRILLETRIPPLINGSAGE-INTACCTSALESFORCESHOPIFYSHOPLINESHOPWARESQUARESPACESTRIPETARGETTIKTOKVERTEX_O_SERIESWALMARTWAYFAIRWISHWIXWOOCOMMERCEXEROZENSKARZOHOZUORA
connectionIdstring

Identifier of the connection that produced the product. null when the product was not produced by a connection (e.g. created manually).

storeNamestring

Display name of the connection (store) that produced the product. null when the product has no connection, or the connection has no store name set.

classificationFailedboolean

Whether automated tax classification failed for the product. null when classification has not been attempted.

200

An existing product matched on externalId and source; no new product was created. A live match is returned unchanged. A previously deleted match is revived and re-enters classification (its status returns to PENDING), so it may differ from its pre-deletion state.

201

Successful Response

400

The request was invalid.

401

Authentication failed or was missing.

403

The credential is not permitted for this request.

404

The requested resource was not found.

409

The request conflicts with existing state.

422

The request failed validation.

cURL
POST /products
-H "Api-Key: ***"
-H "Api-Version: 2026-07-21"
{
"externalId": "sku-1001",
"name": "Blue T-Shirt",
"description": "Annual software subscription",
"status": "APPROVED",
"productCategory": "Digital",
"productSubcategory": "General Clothing",
"taxExempt": false,
"source": "API",
"sourceTaxExempt": null
}
Response
{
"id": "prod_2mNpQr7Ls8f3k",
"organizationId": "orgn_2mNpQr7Ls8f3k",
"organizationName": "Acme Corp",
"externalId": "sku-1001",
"sku": [
"sku-1001"
],
"code": "Physical",
"name": "Blue T-Shirt",
"description": "Annual software subscription",
"status": "APPROVED",
"productCategory": "Digital",
"productSubcategory": "General Clothing",
"taxExempt": false,
"sourceTaxExempt": false,
"source": "API",
"connectionId": "conn_2mNpQr7Ls8f3k",
"storeName": "Acme Corp",
"classificationFailed": false
}
Create a product (2026-07-21) | Kintsugi API Reference