> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.taxwire.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create product

> Creates a product and returns it with its `resolved_tax_codes`. A product is identified by `(source_id, source, source_account_id)`; if one already exists with that key, the response is 409 — update it instead. `source` defaults to `taxwire` and `source_account_id` to `__default__`.



## OpenAPI

````yaml POST /products
openapi: 3.1.0
info:
  title: Taxwire Public API
  version: 0.1.0
servers: []
security: []
paths:
  /products:
    post:
      tags:
        - Products
      summary: Create a Product
      description: >-
        Creates a product and returns it with its `resolved_tax_codes`. A
        product is identified by `(source_id, source, source_account_id)`; if
        one already exists with that key, the response is 409 — update it
        instead. `source` defaults to `taxwire` and `source_account_id` to
        `__default__`.
      operationId: create_product_products_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProductRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductResource'
        '422':
          description: Validation Error - Invalid input data
          content:
            application/json:
              schema:
                properties:
                  detail:
                    items:
                      properties:
                        type:
                          type: string
                        loc:
                          items:
                            type: string
                          type: array
                        msg:
                          type: string
                        input:
                          oneOf:
                            - type: string
                            - type: number
                            - type: boolean
                            - type: 'null'
                      type: object
                    type: array
                type: object
              example:
                detail:
                  - type: string_type
                    loc:
                      - body
                      - line_items
                      - 0
                      - quantity
                    msg: Input should be a valid string
                    input: 1
        '429':
          description: Rate limit exceeded. Try again later.
          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
          content:
            application/json:
              schema:
                properties:
                  detail:
                    type: string
                    example: Rate limit exceeded
                type: object
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: string
              example: Internal Server Error
      security:
        - APIKeyHeader: []
        - HTTPBearer: []
components:
  schemas:
    CreateProductRequest:
      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
        source:
          type: string
          enum:
            - business_central
            - campfire
            - maxio
            - monetizenow
            - netsuite
            - quickbooks
            - rillet
            - salesbricks
            - shopify
            - stripe
            - taxwire
            - xero
          description: The system the product comes from. Defaults to `taxwire`.
          default: taxwire
          examples:
            - taxwire
        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__
        name:
          type: string
          title: Name
          description: The product's name. Non-blank.
          examples:
            - Organic Coffee Beans
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: The product's description.
          examples:
            - 12 oz bag of roasted coffee beans
        source_category:
          anyOf:
            - type: 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.
          examples:
            - Food & Beverage > Coffee
        tax_codes:
          items:
            type: string
          type: array
          title: Tax Codes
          description: The tax codes to assign. Empty means the company default applies.
          examples:
            - - TANGIBLE_PERSONAL_PROPERTY.FOOD
        source_updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Source Updated At
          description: When the product last changed in the source system.
          examples:
            - '2026-09-14T19:58:12Z'
      additionalProperties: false
      type: object
      required:
        - source_id
        - name
      title: CreateProductRequest
      description: The fields to create a product with.
    ProductResource:
      properties:
        id:
          type: string
          title: Id
          description: Taxwire's stable identifier for the product.
          examples:
            - prd_01J9Z8Q4E7K2M3N4P5R6S7T8U9
        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
        source:
          type: string
          enum:
            - business_central
            - campfire
            - maxio
            - monetizenow
            - netsuite
            - quickbooks
            - 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
        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
        name:
          type: string
          title: Name
          description: The product's name.
          examples:
            - Organic Coffee Beans
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: The product's description, if any.
          examples:
            - 12 oz bag of roasted coffee beans
        source_category:
          anyOf:
            - type: 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.
          examples:
            - Food & Beverage > Coffee
        tax_codes:
          items:
            type: 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
        resolved_tax_codes:
          items:
            type: 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
        source_updated_at:
          anyOf:
            - type: string
              format: date-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.
          examples:
            - '2026-09-14T19:58:12Z'
        created_at:
          type: string
          format: date-time
          title: Created At
          description: When Taxwire first stored the product.
          examples:
            - '2026-09-14T20:00:00Z'
        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'
      additionalProperties: false
      type: object
      required:
        - id
        - source_id
        - source
        - source_account_id
        - name
        - resolved_tax_codes
        - created_at
        - updated_at
      title: ProductResource
      description: A product in your Taxwire catalog and the tax codes assigned to it.
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
    HTTPBearer:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.