Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.
{
"errors": [
{
"status": "413",
"code": "request_too_large",
"title": "Request Too Large",
"detail": "The request body is 5242881 bytes; this API accepts at most 5242880. Split it into smaller requests."
}
]
}
{
"errors": [
{
"status": "422",
"code": "validation_error",
"title": "Validation Error",
"detail": "List should have at most 1000 items after validation, not 1001",
"source": {
"pointer": "/data/attributes/data"
}
}
]
}
List of products to create or update, up to 1000 products and 5 MB per request. Each product takes the same fields as Create a product, and name is always required. For an existing product, omitted fields keep their current value; send null to clear description or source_category, and [] to clear tax_codes. source_updated_at can't be null: omit it to keep the current value. If the same product appears more than once, every copy fails.
{
"errors": [
{
"status": "413",
"code": "request_too_large",
"title": "Request Too Large",
"detail": "The request body is 5242881 bytes; this API accepts at most 5242880. Split it into smaller requests."
}
]
}
{
"errors": [
{
"status": "422",
"code": "validation_error",
"title": "Validation Error",
"detail": "List should have at most 1000 items after validation, not 1001",
"source": {
"pointer": "/data/attributes/data"
}
}
]
}
{
"errors": [
{
"status": "500",
"code": "system_internal_error",
"title": "Internal Error",
"detail": "An unexpected error occurred. Our team has been notified."
}
]
}
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Taxwire Documentation","colors":{"primary":"#006ad4","light":"#007fff","dark":"#006ad4"},"logo":{"light":"https://mintcdn.com/taxwire/kIqs87W6QVd_NiC-/logo/light.svg?fit=max\u0026auto=format\u0026n=kIqs87W6QVd_NiC-\u0026q=85\u0026s=7bb92701f7b553132429a252a66c75bc","dark":"https://mintcdn.com/taxwire/kIqs87W6QVd_NiC-/logo/dark.svg?fit=max\u0026auto=format\u0026n=kIqs87W6QVd_NiC-\u0026q=85\u0026s=09554c84098823bcca29b587dda40df7"},"favicon":"https://mintcdn.com/taxwire/kIqs87W6QVd_NiC-/favicon.svg?fit=max\u0026auto=format\u0026n=kIqs87W6QVd_NiC-\u0026q=85\u0026s=5dbb639aafc59d9545e12978a7e48bdb","api":{"mdx":{"auth":{"method":"key","name":"x-api-key"},"server":"https://api.taxwire.com"}},"navbar":{"links":[{"href":"mailto:support@taxwire.com","label":"Support"}],"primary":{"type":"button","label":"Taxwire App","href":"https://app.taxwire.com"}},"footer":{"socials":{"x":"https://x.com/taxwire_inc","github":"https://github.com/taxwire","linkedin":"https://linkedin.com/company/taxwire"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"taxwire","hasAudioNarration":false,"actualSubdomain":"taxwire","customDomains":["apidocs.taxwire.com"],"gitSource":{"type":"github","owner":"taxwire","repo":"taxwire-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea230d310e9dc3a81d3809","collectionId":"b91e9a15-f1cd-4dde-bbf7-099be2bbe962","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea230d310e9dc3a81d3809"},"entitlements":{},"buildId":"6aea230d310e9dc3a81d3809","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Guides","count":10},{"language":"default","tag":"Customers","count":6},{"language":"default","tag":"Products","count":6},{"language":"default","tag":"Getting Started","count":4},{"language":"default","tag":"Transactions","count":4},{"language":"default","tag":"API details","count":3},{"language":"default","tag":"Certificates","count":2},{"language":"default","tag":"Product Tax Codes (PTC) \u0026 Attributes","count":2},{"language":"default","tag":"Calculations","count":1},{"language":"default","tag":"Resources","count":1}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/products/batch","slug":"/api-reference/products/batch","pageMetadata":{"title":"Upsert products (batch)","openapi":"POST /products/batch","description":"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check `status` on every result, and `errors` on the ones that `failed`.","href":"/api-reference/products/batch"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check \", _jsx(_components.code, {\n children: \"status\"\n }), \" on every result, and \", _jsx(_components.code, {\n children: \"errors\"\n }), \" on the ones that \", _jsx(_components.code, {\n children: \"failed\"\n }), \".\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Upsert products (batch)","openapi":"POST /products/batch","description":"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check `status` on every result, and `errors` on the ones that `failed`.","href":"/api-reference/products/batch"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Products"],"summary":"Upsert Products","description":"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check `status` on every result, and `errors` on the ones that `failed`.","operationId":"batch_upsert_products_products_batch_post","requestBody":"08b21c7d-e20c-4dad-961c-192b2898815a","responses":{"200":"6ae5c44f-183e-4039-8d02-5602f844b333","413":"57667fa0-b377-491a-9e78-9c5d37615e53","422":"12c87dce-b0b7-4b52-a67b-9c2884372a2b","429":"cd184361-d6bc-47ff-b4dc-c20439136111","500":"3b158f52-b94d-4137-acfd-5a9e29daf267"},"security":["bfbca73f-56a9-496a-96d4-2a7cd156e194","fb8cce2f-0168-4049-bfc8-6eb1ac2dc5a3"],"method":"post","type":"path","servers":[],"path":"/products/batch","baseUrlOptions":["https://api.taxwire.com"],"title":"Upsert Products","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Your identifier for the product in the system it comes from (a SKU, a Stripe product id). Non-blank.","examples":["SKU-123"],"isRequired":true,"uniqueKey":"data.items.[INDEX].source_id","typeLabel":"string"},"name":{"type":"string","title":"Name","description":"The product's name. Non-blank.","examples":["Organic Coffee Beans"],"isRequired":true,"uniqueKey":"data.items.[INDEX].name","typeLabel":"string"},"source":{"type":"string","enum":["business_central","campfire","chargebee","maxio","measure","monetizenow","netsuite","quickbooks","ramp","rillet","salesbricks","shopify","stripe","taxwire","xero"],"description":"The system the product comes from. Defaults to `taxwire`.","default":"TAXWIRE","examples":["taxwire"],"uniqueKey":"data.items.[INDEX].source","typeLabel":"enum\u003cstring>"},"source_account_id":{"type":"string","title":"Source Account Id","description":"The account the product belongs to within `source`. Omit when your org has a single account on that source — it resolves automatically. Sources with no account concept (`taxwire`, MonetizeNow, Maxio) must leave it `__default__`.","default":"__default__","examples":["__default__"],"uniqueKey":"data.items.[INDEX].source_account_id","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","description":"The product's description.","example":"12 oz bag of roasted coffee beans","uniqueKey":"data.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","description":"The product's description.","example":"12 oz bag of roasted coffee beans","uniqueKey":"data.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].description","typeLabel":"string | null"},"source_category":{"oneOf":[{"type":"string","title":"Source Category","description":"The product's category in the source system. Not a tax code and never used in a calculation.","example":"Food \u0026 Beverage > Coffee","uniqueKey":"data.items.[INDEX].source_category.oneOf.0","typeLabel":"string"},{"type":"null","title":"Source Category","description":"The product's category in the source system. Not a tax code and never used in a calculation.","example":"Food \u0026 Beverage > Coffee","uniqueKey":"data.items.[INDEX].source_category.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].source_category","typeLabel":"string | null"},"tax_codes":{"items":{"type":"string","uniqueKey":"data.items.[INDEX].tax_codes.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Tax Codes","description":"The tax codes to assign. Empty means the company default applies.","examples":[["TANGIBLE_PERSONAL_PROPERTY.FOOD"]],"uniqueKey":"data.items.[INDEX].tax_codes","typeLabel":"string[]"},"source_updated_at":{"oneOf":[{"type":"string","title":"Source Updated At","description":"When the product last changed in the source system.","format":"date-time","example":"2026-09-14T19:58:12Z","uniqueKey":"data.items.[INDEX].source_updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Source Updated At","description":"When the product last changed in the source system.","example":"2026-09-14T19:58:12Z","uniqueKey":"data.items.[INDEX].source_updated_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].source_updated_at","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"type":"object","required":["source_id","name"],"title":"CreateProductRequest","description":"The fields to create a product with.","uniqueKey":"data.items.[INDEX]","typeLabel":"CreateProductRequest · object"},"type":"array","maxItems":1000,"title":"Data","description":"List of products to create or update, up to 1000 products and 5 MB per request. Each product takes the same fields as [Create a product](/api-reference/products/create), and `name` is always required. For an existing product, omitted fields keep their current value; send `null` to clear `description` or `source_category`, and `[]` to clear `tax_codes`. `source_updated_at` can't be `null`: omit it to keep the current value. If the same product appears more than once, every copy fails.","isRequired":true,"uniqueKey":"data","typeLabel":"CreateProductRequest · object[]"}},"additionalProperties":false,"type":"object","required":["data"],"title":"BatchUpsertProductsRequest","description":"Upsert products request model.","uniqueKey":"","typeLabel":"BatchUpsertProductsRequest · object"},"examples":{"push":{"title":"push","value":{"data":[{"source_id":"SKU-123","source":"shopify","source_account_id":"acme-us.myshopify.com","name":"Organic Coffee Beans","tax_codes":["TANGIBLE_PERSONAL_PROPERTY.FOOD"],"source_updated_at":"2026-09-15T08:30:00Z"},{"source_id":"SKU-124","source":"shopify","source_account_id":"acme-ca.myshopify.com","name":"Ceramic Mug","description":"12 oz stoneware mug","source_updated_at":"2026-09-15T08:29:41Z"},{"source_id":"SKU-125","source":"shopify","name":"Travel Tumbler"},{"source_id":"SKU-126","source":"shopify","source_account_id":"acme-us.myshopify.com"}]}}},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"6ae5c44f-183e-4039-8d02-5602f844b333":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"summary":{"properties":{"created":{"type":"integer","title":"Created","default":0,"uniqueKey":"summary.created","typeLabel":"integer"},"updated":{"type":"integer","title":"Updated","default":0,"uniqueKey":"summary.updated","typeLabel":"integer"},"stale":{"type":"integer","title":"Stale","default":0,"uniqueKey":"summary.stale","typeLabel":"integer"},"deleted":{"type":"integer","title":"Deleted","default":0,"uniqueKey":"summary.deleted","typeLabel":"integer"},"failed":{"type":"integer","title":"Failed","default":0,"uniqueKey":"summary.failed","typeLabel":"integer"}},"type":"object","title":"BatchSummary","description":"Number of items with each result.","isRequired":true,"uniqueKey":"summary","typeLabel":"BatchSummary · object"},"data":{"items":{"properties":{"index":{"type":"integer","title":"Index","description":"Position of the product in the request, starting at 0.","examples":[0],"isRequired":true,"uniqueKey":"data.items.[INDEX].index","typeLabel":"integer"},"status":{"type":"string","enum":["created","updated","stale","deleted","failed"],"title":"Status","description":"Result for the product: `created`, `updated`, `stale` (ignored because its `source_updated_at` is older than the current one), `deleted` (matched a deleted product, so nothing changed), or `failed` (see `errors`; nothing was changed).","examples":["created"],"isRequired":true,"uniqueKey":"data.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"product":{"oneOf":[{"type":"object","title":"ProductResource","description":"Product as stored after the request. Set for `created`, `updated`, and `stale`.","required":["id","source_id","source","source_account_id","name","resolved_tax_codes","created_at","updated_at"],"properties":{"id":{"type":"string","title":"Id","description":"Taxwire's stable identifier for the product.","examples":["prd_01J9Z8Q4E7K2M3N4P5R6S7T8U9"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.id","typeLabel":"string"},"source_id":{"type":"string","title":"Source Id","description":"Your identifier for the product in the system it came from (a SKU, a Stripe product id).","examples":["SKU-123","prd_2344536"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.source_id","typeLabel":"string"},"source":{"type":"string","enum":["business_central","campfire","chargebee","maxio","measure","monetizenow","netsuite","quickbooks","ramp","rillet","salesbricks","shopify","stripe","taxwire","xero"],"description":"The system the product came from. `taxwire` for products you send directly to this API.","examples":["taxwire","stripe"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.source","typeLabel":"enum\u003cstring>"},"source_account_id":{"type":"string","title":"Source Account Id","description":"The account the product belongs to within `source`, for sources that have more than one. `__default__` when the source has a single account.","examples":["acct_234234"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.source_account_id","typeLabel":"string"},"name":{"type":"string","title":"Name","description":"The product's name.","examples":["Organic Coffee Beans"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.name","typeLabel":"string"},"resolved_tax_codes":{"items":{"type":"string","uniqueKey":"data.items.[INDEX].product.oneOf.0.resolved_tax_codes.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolved Tax Codes","description":"The tax codes actually used for the product during a calculation: `tax_codes` when set, otherwise your organization default. Never empty.","examples":[["TANGIBLE_PERSONAL_PROPERTY"]],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.resolved_tax_codes","typeLabel":"string[]"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When Taxwire first stored the product.","examples":["2026-09-14T20:00:00Z"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the product was last changed in Taxwire. Equals `created_at` until the first change.","examples":["2026-09-14T20:00:00Z"],"isRequired":true,"uniqueKey":"data.items.[INDEX].product.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"description":{"oneOf":[{"type":"string","title":"Description","description":"The product's description, if any.","example":"12 oz bag of roasted coffee beans","uniqueKey":"data.items.[INDEX].product.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","description":"The product's description, if any.","example":"12 oz bag of roasted coffee beans","uniqueKey":"data.items.[INDEX].product.oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].product.oneOf.0.description","typeLabel":"string | null"},"source_category":{"oneOf":[{"type":"string","title":"Source Category","description":"The product's category in the source system, kept for identification. Not a tax code and never used in a calculation.","example":"Food \u0026 Beverage > Coffee","uniqueKey":"data.items.[INDEX].product.oneOf.0.source_category.oneOf.0","typeLabel":"string"},{"type":"null","title":"Source Category","description":"The product's category in the source system, kept for identification. Not a tax code and never used in a calculation.","example":"Food \u0026 Beverage > Coffee","uniqueKey":"data.items.[INDEX].product.oneOf.0.source_category.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].product.oneOf.0.source_category","typeLabel":"string | null"},"tax_codes":{"items":{"type":"string","uniqueKey":"data.items.[INDEX].product.oneOf.0.tax_codes.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Tax Codes","description":"The tax codes you assigned to the product. Empty means no product-level assignment, so the organization default applies.","examples":[["TANGIBLE_PERSONAL_PROPERTY.FOOD"]],"uniqueKey":"data.items.[INDEX].product.oneOf.0.tax_codes","typeLabel":"string[]"},"source_updated_at":{"oneOf":[{"type":"string","title":"Source Updated At","description":"When the product last changed in the source system, as reported by the sender. Null when unknown.","format":"date-time","example":"2026-09-14T19:58:12Z","uniqueKey":"data.items.[INDEX].product.oneOf.0.source_updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Source Updated At","description":"When the product last changed in the source system, as reported by the sender. Null when unknown.","example":"2026-09-14T19:58:12Z","uniqueKey":"data.items.[INDEX].product.oneOf.0.source_updated_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].product.oneOf.0.source_updated_at","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"uniqueKey":"data.items.[INDEX].product.oneOf.0","typeLabel":"ProductResource · object"},{"type":"null","description":"Product as stored after the request. Set for `created`, `updated`, and `stale`.","uniqueKey":"data.items.[INDEX].product.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].product","typeLabel":"ProductResource · object | null"},"errors":{"oneOf":[{"type":"array","items":{"properties":{"status":{"type":"string","title":"Status","isRequired":true,"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].status","typeLabel":"string"},"code":{"type":"string","title":"Code","isRequired":true,"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].code","typeLabel":"string"},"title":{"type":"string","title":"Title","isRequired":true,"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].title","typeLabel":"string"},"detail":{"type":"string","title":"Detail","isRequired":true,"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].detail","typeLabel":"string"},"source":{"oneOf":[{"type":"object","title":"ErrorSource","description":"Identifies the source of the error, e.g., via a JSON Pointer.","properties":{"pointer":{"oneOf":[{"type":"string","title":"Pointer","uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source.oneOf.0.pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source.oneOf.0.pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source.oneOf.0.pointer","typeLabel":"string | null"}},"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source.oneOf.0","typeLabel":"ErrorSource · object"},{"type":"null","uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].source","typeLabel":"ErrorSource · object | null"},"meta":{"oneOf":[{"type":"object","title":"Meta","additionalProperties":true,"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].meta.oneOf.0","typeLabel":"Meta · object"},{"type":"null","title":"Meta","uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX].meta","typeLabel":"Meta · object | null"}},"type":"object","required":["status","code","title","detail"],"title":"Error","description":"Individual JSON:API error object.","uniqueKey":"data.items.[INDEX].errors.oneOf.0.items.[INDEX]","typeLabel":"Error · object"},"title":"Errors","description":"Why the product failed. Set for `failed`. Each error's `source.pointer` names the field to fix, for example `/data/attributes/data/2/name`.","example":null,"uniqueKey":"data.items.[INDEX].errors.oneOf.0","typeLabel":"Error · object[]"},{"type":"null","title":"Errors","description":"Why the product failed. Set for `failed`. Each error's `source.pointer` names the field to fix, for example `/data/attributes/data/2/name`.","example":null,"uniqueKey":"data.items.[INDEX].errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].errors","typeLabel":"Error · object[] | null"}},"type":"object","required":["index","status"],"title":"BatchProductResult","description":"Result for one product in the request.","uniqueKey":"data.items.[INDEX]","typeLabel":"BatchProductResult · object"},"type":"array","title":"Data","description":"Results in the same order as the request.","isRequired":true,"uniqueKey":"data","typeLabel":"BatchProductResult · object[]"},"object":{"type":"string","title":"Object","description":"Always `batch`.","default":"batch","uniqueKey":"object","typeLabel":"string"}},"type":"object","required":["summary","data"],"title":"BatchUpsertProductsResponse","description":"Upsert products response model.","uniqueKey":"","typeLabel":"BatchUpsertProductsResponse · object"},"example":{"object":"batch","summary":{"created":1,"updated":1,"stale":0,"deleted":0,"failed":2},"data":[{"index":0,"status":"updated","product":{"id":"prd_01J9Z8Q4E7K2M3N4P5R6S7T8U9","source_id":"SKU-123","source":"shopify","source_account_id":"acme-us.myshopify.com","name":"Organic Coffee Beans","description":"12 oz bag of roasted coffee beans","tax_codes":["TANGIBLE_PERSONAL_PROPERTY.FOOD"],"resolved_tax_codes":["TANGIBLE_PERSONAL_PROPERTY.FOOD"],"source_updated_at":"2026-09-15T08:30:00Z","created_at":"2026-09-14T20:00:00Z","updated_at":"2026-09-15T08:30:05Z"}},{"index":1,"status":"created","product":{"id":"prd_01J9ZB7V3M8N2K4P6Q1R5S7T9W","source_id":"SKU-124","source":"shopify","source_account_id":"acme-ca.myshopify.com","name":"Ceramic Mug","description":"12 oz stoneware mug","tax_codes":[],"resolved_tax_codes":["TANGIBLE_PERSONAL_PROPERTY"],"source_updated_at":"2026-09-15T08:29:41Z","created_at":"2026-09-15T08:30:05Z","updated_at":"2026-09-15T08:30:05Z"}},{"index":2,"status":"failed","errors":[{"status":"409","code":"conflict","title":"Ambiguous source_account_id","detail":"Your organization has 2 connected shopify accounts; send source_account_id to say which one the product belongs to.","source":{"pointer":"/data/attributes/data/2/source_account_id"},"meta":{"source":"shopify","connected_accounts":["acme-ca.myshopify.com","acme-us.myshopify.com"]}}]},{"index":3,"status":"failed","errors":[{"status":"422","code":"validation_required_field","title":"Missing name","detail":"Please provide a value for the required name field","source":{"pointer":"/data/attributes/data/3/name"}}]}]},"examples":{"Example":{"title":"Example","value":{"object":"batch","summary":{"created":1,"updated":1,"stale":0,"deleted":0,"failed":2},"data":[{"index":0,"status":"updated","product":{"id":"prd_01J9Z8Q4E7K2M3N4P5R6S7T8U9","source_id":"SKU-123","source":"shopify","source_account_id":"acme-us.myshopify.com","name":"Organic Coffee Beans","description":"12 oz bag of roasted coffee beans","tax_codes":["TANGIBLE_PERSONAL_PROPERTY.FOOD"],"resolved_tax_codes":["TANGIBLE_PERSONAL_PROPERTY.FOOD"],"source_updated_at":"2026-09-15T08:30:00Z","created_at":"2026-09-14T20:00:00Z","updated_at":"2026-09-15T08:30:05Z"}},{"index":1,"status":"created","product":{"id":"prd_01J9ZB7V3M8N2K4P6Q1R5S7T9W","source_id":"SKU-124","source":"shopify","source_account_id":"acme-ca.myshopify.com","name":"Ceramic Mug","description":"12 oz stoneware mug","tax_codes":[],"resolved_tax_codes":["TANGIBLE_PERSONAL_PROPERTY"],"source_updated_at":"2026-09-15T08:29:41Z","created_at":"2026-09-15T08:30:05Z","updated_at":"2026-09-15T08:30:05Z"}},{"index":2,"status":"failed","errors":[{"status":"409","code":"conflict","title":"Ambiguous source_account_id","detail":"Your organization has 2 connected shopify accounts; send source_account_id to say which one the product belongs to.","source":{"pointer":"/data/attributes/data/2/source_account_id"},"meta":{"source":"shopify","connected_accounts":["acme-ca.myshopify.com","acme-us.myshopify.com"]}}]},{"index":3,"status":"failed","errors":[{"status":"422","code":"validation_required_field","title":"Missing name","detail":"Please provide a value for the required name field","source":{"pointer":"/data/attributes/data/3/name"}}]}]}}},"exampleType":"examples"}},"exampleType":"examples"},"57667fa0-b377-491a-9e78-9c5d37615e53":{"description":"Request Too Large - The request body is over the size limit.","content":{"application/json":{"schema":{"properties":{"errors":{"items":{"properties":{"status":{"type":"string","title":"Status","isRequired":true,"uniqueKey":"errors.items.[INDEX].status","typeLabel":"string"},"code":{"type":"string","title":"Code","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"title":{"type":"string","title":"Title","isRequired":true,"uniqueKey":"errors.items.[INDEX].title","typeLabel":"string"},"detail":{"type":"string","title":"Detail","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"},"source":{"oneOf":[{"type":"object","title":"ErrorSource","description":"Identifies the source of the error, e.g., via a JSON Pointer.","properties":{"pointer":{"oneOf":[{"type":"string","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer","typeLabel":"string | null"}},"uniqueKey":"errors.items.[INDEX].source.oneOf.0","typeLabel":"ErrorSource · object"},{"type":"null","uniqueKey":"errors.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source","typeLabel":"ErrorSource · object | null"},"meta":{"oneOf":[{"type":"object","title":"Meta","additionalProperties":true,"uniqueKey":"errors.items.[INDEX].meta.oneOf.0","typeLabel":"Meta · object"},{"type":"null","title":"Meta","uniqueKey":"errors.items.[INDEX].meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].meta","typeLabel":"Meta · object | null"}},"type":"object","required":["status","code","title","detail"],"title":"Error","description":"Individual JSON:API error object.","uniqueKey":"errors.items.[INDEX]","typeLabel":"Error · object"},"type":"array","title":"Errors","isRequired":true,"uniqueKey":"errors","typeLabel":"Error · object[]"}},"type":"object","required":["errors"],"title":"ErrorResponse","description":"Standardized JSON:API error response model.","uniqueKey":"","typeLabel":"ErrorResponse · object"},"example":{"errors":[{"status":"413","code":"request_too_large","title":"Request Too Large","detail":"The request body is 5242881 bytes; this API accepts at most 5242880. Split it into smaller requests."}]},"examples":{"Example":{"title":"Example","value":{"errors":[{"status":"413","code":"request_too_large","title":"Request Too Large","detail":"The request body is 5242881 bytes; this API accepts at most 5242880. Split it into smaller requests."}]}}},"exampleType":"examples"}},"exampleType":"examples"},"12c87dce-b0b7-4b52-a67b-9c2884372a2b":{"description":"Validation Error - The request is malformed or has more than 1000 products. An invalid product is reported as `failed` in a 200 response instead.","content":{"application/json":{"schema":{"properties":{"errors":{"items":{"properties":{"status":{"type":"string","title":"Status","isRequired":true,"uniqueKey":"errors.items.[INDEX].status","typeLabel":"string"},"code":{"type":"string","title":"Code","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"title":{"type":"string","title":"Title","isRequired":true,"uniqueKey":"errors.items.[INDEX].title","typeLabel":"string"},"detail":{"type":"string","title":"Detail","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"},"source":{"oneOf":[{"type":"object","title":"ErrorSource","description":"Identifies the source of the error, e.g., via a JSON Pointer.","properties":{"pointer":{"oneOf":[{"type":"string","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer","typeLabel":"string | null"}},"uniqueKey":"errors.items.[INDEX].source.oneOf.0","typeLabel":"ErrorSource · object"},{"type":"null","uniqueKey":"errors.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source","typeLabel":"ErrorSource · object | null"},"meta":{"oneOf":[{"type":"object","title":"Meta","additionalProperties":true,"uniqueKey":"errors.items.[INDEX].meta.oneOf.0","typeLabel":"Meta · object"},{"type":"null","title":"Meta","uniqueKey":"errors.items.[INDEX].meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].meta","typeLabel":"Meta · object | null"}},"type":"object","required":["status","code","title","detail"],"title":"Error","description":"Individual JSON:API error object.","uniqueKey":"errors.items.[INDEX]","typeLabel":"Error · object"},"type":"array","title":"Errors","isRequired":true,"uniqueKey":"errors","typeLabel":"Error · object[]"}},"type":"object","required":["errors"],"title":"ErrorResponse","description":"Standardized JSON:API error response model.","uniqueKey":"","typeLabel":"ErrorResponse · object"},"example":{"errors":[{"status":"422","code":"validation_error","title":"Validation Error","detail":"List should have at most 1000 items after validation, not 1001","source":{"pointer":"/data/attributes/data"}}]},"examples":{"Example":{"title":"Example","value":{"errors":[{"status":"422","code":"validation_error","title":"Validation Error","detail":"List should have at most 1000 items after validation, not 1001","source":{"pointer":"/data/attributes/data"}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"cd184361-d6bc-47ff-b4dc-c20439136111":{"description":"Rate limit exceeded. Try again later.","content":{"application/json":{"schema":{"properties":{"errors":{"items":{"properties":{"status":{"type":"string","title":"Status","isRequired":true,"uniqueKey":"errors.items.[INDEX].status","typeLabel":"string"},"code":{"type":"string","title":"Code","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"title":{"type":"string","title":"Title","isRequired":true,"uniqueKey":"errors.items.[INDEX].title","typeLabel":"string"},"detail":{"type":"string","title":"Detail","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"},"source":{"oneOf":[{"type":"object","title":"ErrorSource","description":"Identifies the source of the error, e.g., via a JSON Pointer.","properties":{"pointer":{"oneOf":[{"type":"string","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer","typeLabel":"string | null"}},"uniqueKey":"errors.items.[INDEX].source.oneOf.0","typeLabel":"ErrorSource · object"},{"type":"null","uniqueKey":"errors.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source","typeLabel":"ErrorSource · object | null"},"meta":{"oneOf":[{"type":"object","title":"Meta","additionalProperties":true,"uniqueKey":"errors.items.[INDEX].meta.oneOf.0","typeLabel":"Meta · object"},{"type":"null","title":"Meta","uniqueKey":"errors.items.[INDEX].meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].meta","typeLabel":"Meta · object | null"}},"type":"object","required":["status","code","title","detail"],"title":"Error","description":"Individual JSON:API error object.","uniqueKey":"errors.items.[INDEX]","typeLabel":"Error · object"},"type":"array","title":"Errors","isRequired":true,"uniqueKey":"errors","typeLabel":"Error · object[]"}},"type":"object","required":["errors"],"title":"ErrorResponse","description":"Standardized JSON:API error response model.","uniqueKey":"","typeLabel":"ErrorResponse · object"},"example":{"errors":[{"status":"429","code":"rate_limit_error","title":"Too Many Requests","detail":"Rate limit exceeded"}]},"examples":{"Example":{"title":"Example","value":{"errors":[{"status":"429","code":"rate_limit_error","title":"Too Many Requests","detail":"Rate limit exceeded"}]}}},"exampleType":"examples"}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Time in seconds until the rate limit resets"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"The rate limit ceiling for the given request"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"The number of requests remaining in the time window"}},"exampleType":"examples"},"3b158f52-b94d-4137-acfd-5a9e29daf267":{"description":"Internal Server Error","content":{"application/json":{"schema":{"properties":{"errors":{"items":{"properties":{"status":{"type":"string","title":"Status","isRequired":true,"uniqueKey":"errors.items.[INDEX].status","typeLabel":"string"},"code":{"type":"string","title":"Code","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"title":{"type":"string","title":"Title","isRequired":true,"uniqueKey":"errors.items.[INDEX].title","typeLabel":"string"},"detail":{"type":"string","title":"Detail","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"},"source":{"oneOf":[{"type":"object","title":"ErrorSource","description":"Identifies the source of the error, e.g., via a JSON Pointer.","properties":{"pointer":{"oneOf":[{"type":"string","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source.oneOf.0.pointer","typeLabel":"string | null"}},"uniqueKey":"errors.items.[INDEX].source.oneOf.0","typeLabel":"ErrorSource · object"},{"type":"null","uniqueKey":"errors.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].source","typeLabel":"ErrorSource · object | null"},"meta":{"oneOf":[{"type":"object","title":"Meta","additionalProperties":true,"uniqueKey":"errors.items.[INDEX].meta.oneOf.0","typeLabel":"Meta · object"},{"type":"null","title":"Meta","uniqueKey":"errors.items.[INDEX].meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors.items.[INDEX].meta","typeLabel":"Meta · object | null"}},"type":"object","required":["status","code","title","detail"],"title":"Error","description":"Individual JSON:API error object.","uniqueKey":"errors.items.[INDEX]","typeLabel":"Error · object"},"type":"array","title":"Errors","isRequired":true,"uniqueKey":"errors","typeLabel":"Error · object[]"}},"type":"object","required":["errors"],"title":"ErrorResponse","description":"Standardized JSON:API error response model.","uniqueKey":"","typeLabel":"ErrorResponse · object"},"example":{"errors":[{"status":"500","code":"system_internal_error","title":"Internal Error","detail":"An unexpected error occurred. Our team has been notified."}]},"examples":{"Example":{"title":"Example","value":{"errors":[{"status":"500","code":"system_internal_error","title":"Internal Error","detail":"An unexpected error occurred. Our team has been notified."}]}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"bfbca73f-56a9-496a-96d4-2a7cd156e194":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"APIKeyHeader"}},"fb8cce2f-0168-4049-bfc8-6eb1ac2dc5a3":{"HTTPBearer":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"HTTPBearer"}}},"servers":{},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"APIKeyHeader"},"schema":{"title":"X-API-Key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"APIKeyHeader","name":"X-API-Key"}],"title":"APIKeyHeader"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"HTTPBearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"HTTPBearer","name":"Authorization"}],"title":"HTTPBearer"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"taxwire","siteName":"Taxwire Documentation","title":"Upsert products (batch) - Taxwire Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-03T18:08:27.126Z","originalFileLocation":"api-reference/products/batch.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Taxwire Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upsert products (batch) - Taxwire Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Taxwire Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://apidocs.taxwire.com/api-reference/products/batch\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://taxwire.mintlify.app/_mintlify/api/og/v2?division=Products\u0026amp;title=Upsert+products+%28batch%29\u0026amp;description=Create+or+update+up+to+1000+products+in+one+request.+Each+product+is+matched+on+its+source%2C+source+account+ID%2C+and+source+ID%2C+so+you+can+safely+send+the+same+re\u0026amp;theme=1175fa362e4c07ba539d0936\u0026amp;signature=5eb154dfccdf9212c975b371c9645cae131325fe7f7679f16d1b8c117701da13\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Upsert products (batch) - Taxwire Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://taxwire.mintlify.app/_mintlify/api/og/v2?division=Products\u0026amp;title=Upsert+products+%28batch%29\u0026amp;description=Create+or+update+up+to+1000+products+in+one+request.+Each+product+is+matched+on+its+source%2C+source+account+ID%2C+and+source+ID%2C+so+you+can+safely+send+the+same+re\u0026amp;theme=1175fa362e4c07ba539d0936\u0026amp;signature=5eb154dfccdf9212c975b371c9645cae131325fe7f7679f16d1b8c117701da13\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/taxwire/4SC2Aj2b89wSz90t/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Taxwire Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#006ad4\">\u003clink data-mint-head rel=\"canonical\" href=\"https://apidocs.taxwire.com/api-reference/products/batch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/products/batch.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://apidocs.taxwire.com/#organization\",\"name\":\"Taxwire Documentation\",\"url\":\"https://apidocs.taxwire.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/taxwire/kIqs87W6QVd_NiC-/logo/light.svg?fit=max\u0026auto=format\u0026n=kIqs87W6QVd_NiC-\u0026q=85\u0026s=7bb92701f7b553132429a252a66c75bc\"}},{\"@type\":\"WebSite\",\"@id\":\"https://apidocs.taxwire.com#website\",\"name\":\"Taxwire Documentation\",\"url\":\"https://apidocs.taxwire.com\",\"publisher\":{\"@id\":\"https://apidocs.taxwire.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://apidocs.taxwire.com/api-reference/products/batch#webpage\",\"url\":\"https://apidocs.taxwire.com/api-reference/products/batch\",\"name\":\"Upsert products (batch)\",\"description\":\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.\",\"dateModified\":\"2026-11-03T18:08:27.126Z\",\"isPartOf\":{\"@id\":\"https://apidocs.taxwire.com#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.taxwire.com/api-reference/products/batch#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.taxwire.com/api-reference/products/batch#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Products\",\"item\":\"https://apidocs.taxwire.com/api-reference/products/list\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Upsert products (batch)\",\"item\":\"https://apidocs.taxwire.com/api-reference/products/batch\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.taxwire.com/api-reference/products/batch#apireference\",\"headline\":\"Upsert products (batch)\",\"name\":\"Upsert products (batch)\",\"description\":\"Create or update up to 1000 products in one request. Each product is matched on its source, source account ID, and source ID, so you can safely send the same request again. Each product succeeds or fails on its own: check status on every result, and errors on the ones that failed.\",\"url\":\"https://apidocs.taxwire.com/api-reference/products/batch\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.taxwire.com/api-reference/products/batch#webpage\"},\"dateModified\":\"2026-11-03T18:08:27.126Z\",\"publisher\":{\"@id\":\"https://apidocs.taxwire.com/#organization\"},\"isPartOf\":{\"@id\":\"https://apidocs.taxwire.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Taxwire Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Taxwire Documentation","nav":{"global":null,"groups":[{"group":"Getting Started","pages":[{"title":"Introduction","icon":"hand-wave","href":"/api-reference/introduction"},{"title":"Quickstart","icon":"bolt","href":"/api-reference/quickstart"},{"title":"Examples","icon":"book","href":"/api-reference/examples"},{"title":"Postman Collection","url":"https://www.postman.com/taxwire/taxwire-public/collection/44544934-51ebc01e-78b1-4157-831d-f4243ac2c7e9?action=share\u0026source=copy-link\u0026creator=29668608\u0026sideView=agentMode","icon":"user-astronaut","href":"/api-reference/postman"}]},{"group":"Guides","pages":[{"title":"Tax calculation in details","icon":"calculator","href":"/api-reference/guides/calculate_taxes"},{"title":"Tax attributes","icon":"tag","href":"/api-reference/guides/tax_attributes"},{"title":"Using the Products APIs","icon":"box","href":"/api-reference/guides/using_products_apis"},{"title":"Using the Customers APIs","icon":"users","href":"/api-reference/guides/using_customers_apis"},{"title":"Tax on a line item","icon":"receipt","href":"/api-reference/guides/sales_tax_lines"},{"title":"Presets","icon":"floppy-disk","href":"/api-reference/guides/presets"},{"title":"Customer exemptions","icon":"certificate","href":"/api-reference/guides/exemptions"},{"title":"Transactions management","icon":"circle-dollar","href":"/api-reference/guides/transactions"},{"title":"VAT Handling","icon":"globe","href":"/api-reference/guides/vat"},{"title":"Discounts","icon":"badge-percent","href":"/api-reference/guides/discounts"}]},{"group":"API details","pages":[{"title":"Authentication","icon":"lock","href":"/api-reference/authentication"},{"title":"Versions","icon":"list-ol","href":"/api-reference/versioning"},{"title":"Errors","icon":"circle-exclamation","href":"/api-reference/errors"}]},{"group":"Calculations","pages":[{"title":"Tax calculations","openapi":"POST /calculations","href":"/api-reference/calculations/create"}]},{"group":"Transactions","icon":"credit-card","pages":[{"title":"Retrieve transaction","openapi":"GET /transactions/{transaction_id}","href":"/api-reference/transactions/retrieve"},{"title":"Retrieve transaction by reference ID","openapi":"GET /transactions/by_reference_id/{reference_id}","href":"/api-reference/transactions/by-reference-id"},{"title":"Create transaction","openapi":"POST /transactions","href":"/api-reference/transactions/create"},{"title":"Update transaction","openapi":"POST /transactions/{transaction_id}","href":"/api-reference/transactions/update"}]},{"group":"Customers","icon":"users","pages":[{"title":"List customers","openapi":"GET /customers","href":"/api-reference/customers/list"},{"title":"Retrieve customer","openapi":"GET /customers/{customer_id}","href":"/api-reference/customers/retrieve"},{"title":"Create customer","openapi":"POST /customers","href":"/api-reference/customers/create"},{"title":"Update customer","openapi":"PATCH /customers/{customer_id}","href":"/api-reference/customers/update"},{"title":"Delete customer","openapi":"DELETE /customers/{customer_id}","href":"/api-reference/customers/delete"},{"title":"Upsert customers (batch)","openapi":"POST /customers/batch","href":"/api-reference/customers/batch"}]},{"group":"Certificates","icon":"certificate","pages":[{"title":"List certificates","openapi":"GET /certificates","href":"/api-reference/certificates/list"},{"title":"Retrieve certificate","openapi":"GET /certificates/{certificate_id}","href":"/api-reference/certificates/retrieve"}]},{"group":"Product Tax Codes (PTC) \u0026 Attributes","icon":"barcode","pages":[{"title":"List Product Tax codes","openapi":"GET /product-tax-codes","href":"/api-reference/product-tax-codes/list"},{"title":"List Product Attributes","openapi":"GET /product-attributes","href":"/api-reference/product-attributes/list"}]},{"group":"Products","icon":"box","pages":[{"title":"List Products","openapi":"GET /products","href":"/api-reference/products/list"},{"title":"Retrieve product","openapi":"GET /products/{product_id}","href":"/api-reference/products/retrieve"},{"title":"Create product","openapi":"POST /products","href":"/api-reference/products/create"},{"title":"Update product","openapi":"PATCH /products/{product_id}","href":"/api-reference/products/update"},{"title":"Delete product","openapi":"DELETE /products/{product_id}","description":"Deletes a product. Returns 204 with no body, including when the product was already deleted, so a retry is safe. A deleted product drops out of this API — GET and list no longer return it — but keeps its `(source_id, source, source_account_id)` key, so creating it again is a 409 with `meta.deleted: true`. Deleting does not rewrite tax history: a past transaction that priced against this product still resolves it. There is no un-delete on this API; the product comes back if the source system syncs it again. Answers 404 for an unknown id or one owned by another account.","href":"/api-reference/products/delete"},{"title":"Upsert products (batch)","openapi":"POST /products/batch","href":"/api-reference/products/batch"}]},{"group":"Resources","pages":[{"title":"Product hierarchy","description":"A description of all product tax codes that Taxwire supports.","mode":"wide","icon":"sitemap","href":"/resources/product-tax-codes/product-hierarchy"}]}]},"basePath":"","title":"Upsert products (batch) - Taxwire Documentation","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-Buji1S4J.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}