openapi: 3.0.1 info: title: Kintsugi Tax API description: >- REST API for the Kintsugi AI sales tax compliance and automation platform. Calculate US sales tax, VAT, and GST; sync transactions, products, and customers; validate addresses; manage physical nexus, exemptions, and registrations; and retrieve automated filings. Authentication uses an API key supplied in the x-api-key header together with the x-organization-id header identifying the organization. Endpoints, fields, and schemas in this document reflect Kintsugi's public API reference at docs.trykintsugi.com and are not exhaustive; consult the provider documentation for the authoritative contract. termsOfService: https://www.trykintsugi.com/terms-of-service contact: name: Kintsugi Support url: https://www.trykintsugi.com/support version: '1.0' servers: - url: https://api.trykintsugi.com/v1 description: Kintsugi production API base URL security: - ApiKeyAuth: [] OrganizationId: [] tags: - name: Tax Estimation description: Real-time sales tax, VAT, and GST estimation. - name: Transactions description: Committed sales transactions and credit notes. - name: Customers description: Customer records and their transactions. - name: Products description: Product records and taxability classification. - name: Address Validation description: Address search and suggestions for jurisdiction assignment. - name: Nexus description: Physical and economic nexus tracking. - name: Exemptions description: Customer tax exemptions and certificates. - name: Registrations description: State tax registrations. - name: Filings description: Prepared and submitted sales tax returns. paths: /tax/estimate: post: operationId: estimateTax tags: - Tax Estimation summary: Estimate tax for a transaction. description: >- Calculates sales tax, VAT, or GST for a prospective transaction before payment is collected. Returns a jurisdiction-level breakdown, the taxable amount, the effective tax rate, and whether an active registration exists, without persisting a transaction record. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TransactionEstimateRequest' responses: '200': description: Tax estimate calculated. content: application/json: schema: $ref: '#/components/schemas/TransactionEstimateResponse' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /transactions: post: operationId: createTransaction tags: - Transactions summary: Create a transaction. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TransactionRequest' responses: '201': description: Transaction created. content: application/json: schema: $ref: '#/components/schemas/Transaction' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' get: operationId: getTransactions tags: - Transactions summary: List transactions. parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Size' responses: '200': description: A page of transactions. content: application/json: schema: $ref: '#/components/schemas/TransactionPage' '401': $ref: '#/components/responses/Unauthorized' /transactions/{id}: get: operationId: getTransactionById tags: - Transactions summary: Get a transaction by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested transaction. content: application/json: schema: $ref: '#/components/schemas/Transaction' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateTransaction tags: - Transactions summary: Update a transaction. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TransactionRequest' responses: '200': description: Transaction updated. content: application/json: schema: $ref: '#/components/schemas/Transaction' '404': $ref: '#/components/responses/NotFound' /transactions/external/{external_id}: get: operationId: getTransactionByExternalId tags: - Transactions summary: Get a transaction by external ID. parameters: - $ref: '#/components/parameters/ExternalId' responses: '200': description: The requested transaction. content: application/json: schema: $ref: '#/components/schemas/Transaction' '404': $ref: '#/components/responses/NotFound' /transactions/{id}/credit-notes: post: operationId: createCreditNoteByTransactionId tags: - Transactions summary: Create a credit note for a transaction. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreditNoteRequest' responses: '201': description: Credit note created. content: application/json: schema: $ref: '#/components/schemas/Transaction' patch: operationId: updateCreditNoteByTransactionId tags: - Transactions summary: Update a credit note for a transaction. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreditNoteRequest' responses: '200': description: Credit note updated. content: application/json: schema: $ref: '#/components/schemas/Transaction' /customers: post: operationId: createCustomer tags: - Customers summary: Create a customer. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerRequest' responses: '201': description: Customer created. content: application/json: schema: $ref: '#/components/schemas/Customer' get: operationId: getCustomers tags: - Customers summary: List customers. parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Size' responses: '200': description: A page of customers. content: application/json: schema: $ref: '#/components/schemas/CustomerPage' /customers/{id}: get: operationId: getCustomerById tags: - Customers summary: Get a customer by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateCustomer tags: - Customers summary: Update a customer. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerRequest' responses: '200': description: Customer updated. content: application/json: schema: $ref: '#/components/schemas/Customer' /customers/external/{external_id}: get: operationId: getCustomerByExternalId tags: - Customers summary: Get a customer by external ID. parameters: - $ref: '#/components/parameters/ExternalId' responses: '200': description: The requested customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '404': $ref: '#/components/responses/NotFound' /products: post: operationId: createProduct tags: - Products summary: Create a product. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProductRequest' responses: '201': description: Product created. content: application/json: schema: $ref: '#/components/schemas/Product' get: operationId: getProducts tags: - Products summary: List products. parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Size' responses: '200': description: A page of products. content: application/json: schema: $ref: '#/components/schemas/ProductPage' /products/{id}: get: operationId: getProductById tags: - Products summary: Get a product by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested product. content: application/json: schema: $ref: '#/components/schemas/Product' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateProduct tags: - Products summary: Update a product. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProductRequest' responses: '200': description: Product updated. content: application/json: schema: $ref: '#/components/schemas/Product' /products/categories: get: operationId: getProductCategories tags: - Products summary: List product categories. responses: '200': description: Available product categories used for taxability mapping. content: application/json: schema: type: array items: $ref: '#/components/schemas/ProductCategory' /addresses/search: get: operationId: searchAddress tags: - Address Validation summary: Validate and search an address. parameters: - name: street_1 in: query schema: type: string - name: city in: query schema: type: string - name: state in: query schema: type: string - name: postal_code in: query schema: type: string - name: country in: query schema: type: string responses: '200': description: The validated address. content: application/json: schema: $ref: '#/components/schemas/Address' /addresses/suggestions: get: operationId: getAddressSuggestions tags: - Address Validation summary: Get address suggestions. parameters: - name: query in: query schema: type: string responses: '200': description: Suggested addresses. content: application/json: schema: type: array items: $ref: '#/components/schemas/Address' /nexus: get: operationId: getNexusForOrg tags: - Nexus summary: Get nexus status for the organization. responses: '200': description: Nexus status across jurisdictions. content: application/json: schema: type: array items: $ref: '#/components/schemas/Nexus' /nexus/physical: post: operationId: createPhysicalNexus tags: - Nexus summary: Create a physical nexus. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PhysicalNexusRequest' responses: '201': description: Physical nexus created. content: application/json: schema: $ref: '#/components/schemas/Nexus' get: operationId: getPhysicalNexus tags: - Nexus summary: List physical nexus entries. responses: '200': description: Physical nexus entries. content: application/json: schema: type: array items: $ref: '#/components/schemas/Nexus' /nexus/physical/{id}: patch: operationId: updatePhysicalNexus tags: - Nexus summary: Update a physical nexus. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PhysicalNexusRequest' responses: '200': description: Physical nexus updated. content: application/json: schema: $ref: '#/components/schemas/Nexus' delete: operationId: deletePhysicalNexus tags: - Nexus summary: Delete a physical nexus. parameters: - $ref: '#/components/parameters/Id' responses: '204': description: Physical nexus deleted. /exemptions: post: operationId: createExemption tags: - Exemptions summary: Create an exemption. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ExemptionRequest' responses: '201': description: Exemption created. content: application/json: schema: $ref: '#/components/schemas/Exemption' get: operationId: getExemptions tags: - Exemptions summary: List exemptions. parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Size' responses: '200': description: A page of exemptions. content: application/json: schema: $ref: '#/components/schemas/ExemptionPage' /exemptions/{id}: get: operationId: getExemptionById tags: - Exemptions summary: Get an exemption by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested exemption. content: application/json: schema: $ref: '#/components/schemas/Exemption' '404': $ref: '#/components/responses/NotFound' /exemptions/{id}/certificates: post: operationId: uploadExemptionCertificate tags: - Exemptions summary: Upload an exemption certificate. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: '201': description: Certificate uploaded. /exemptions/{id}/attachments: get: operationId: getAttachmentsForExemption tags: - Exemptions summary: Get attachments for an exemption. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: Exemption attachments. content: application/json: schema: type: array items: $ref: '#/components/schemas/Attachment' /registrations: post: operationId: createRegistration tags: - Registrations summary: Create a registration. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RegistrationRequest' responses: '201': description: Registration created. content: application/json: schema: $ref: '#/components/schemas/Registration' get: operationId: getRegistrations tags: - Registrations summary: List registrations. responses: '200': description: Registrations for the organization. content: application/json: schema: type: array items: $ref: '#/components/schemas/Registration' /registrations/{id}: get: operationId: getRegistrationById tags: - Registrations summary: Get a registration by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested registration. content: application/json: schema: $ref: '#/components/schemas/Registration' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateRegistration tags: - Registrations summary: Update a registration. parameters: - $ref: '#/components/parameters/Id' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RegistrationRequest' responses: '200': description: Registration updated. content: application/json: schema: $ref: '#/components/schemas/Registration' /registrations/{id}/deregister: post: operationId: deregisterRegistration tags: - Registrations summary: Deregister a registration. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: Registration deregistered. content: application/json: schema: $ref: '#/components/schemas/Registration' /filings: get: operationId: getFilings tags: - Filings summary: List filings. parameters: - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Size' responses: '200': description: A page of filings. content: application/json: schema: $ref: '#/components/schemas/FilingPage' /filings/{id}: get: operationId: getFilingById tags: - Filings summary: Get a filing by ID. parameters: - $ref: '#/components/parameters/Id' responses: '200': description: The requested filing. content: application/json: schema: $ref: '#/components/schemas/Filing' '404': $ref: '#/components/responses/NotFound' /filings/{filing_id}/transactions: get: operationId: getTransactionsByFilingId tags: - Filings summary: Get transactions for a filing. parameters: - name: filing_id in: path required: true schema: type: string responses: '200': description: Transactions included in the filing. content: application/json: schema: $ref: '#/components/schemas/TransactionPage' /registrations/{registration_id}/filings: get: operationId: getFilingsByRegistrationId tags: - Filings summary: Get filings for a registration. parameters: - name: registration_id in: path required: true schema: type: string responses: '200': description: Filings for the registration. content: application/json: schema: $ref: '#/components/schemas/FilingPage' components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: API key generated in the Kintsugi dashboard. OrganizationId: type: apiKey in: header name: x-organization-id description: Identifier of the organization the request acts on behalf of. parameters: Id: name: id in: path required: true schema: type: string ExternalId: name: external_id in: path required: true schema: type: string Page: name: page in: query schema: type: integer default: 1 Size: name: size in: query schema: type: integer default: 50 responses: Unauthorized: description: Missing or invalid API key or organization ID. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: Resource not found. content: application/json: schema: $ref: '#/components/schemas/Error' ValidationError: description: Request validation failed. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Address: type: object properties: type: type: string enum: - SHIP_TO - BILL_TO street_1: type: string street_2: type: string city: type: string county: type: string state: type: string postal_code: type: string country: type: string full_address: type: string required: - postal_code - country TransactionItemEstimate: type: object properties: external_id: type: string external_product_id: type: string date: type: string format: date-time amount: type: number quantity: type: number default: 1 product_name: type: string product_category: type: string product_subcategory: type: string exempt: type: boolean default: false required: - amount - date TransactionEstimateRequest: type: object properties: external_id: type: string date: type: string format: date-time currency: type: string example: USD description: type: string marketplace: type: boolean default: false customer: $ref: '#/components/schemas/CustomerRequest' addresses: type: array items: $ref: '#/components/schemas/Address' transaction_items: type: array items: $ref: '#/components/schemas/TransactionItemEstimate' required: - external_id - date - currency - addresses - transaction_items TaxItemEstimate: type: object properties: jurisdiction: type: string jurisdiction_type: type: string tax_rate: type: string tax_amount: type: string TransactionItemEstimateResponse: allOf: - $ref: '#/components/schemas/TransactionItemEstimate' - type: object properties: tax_amount: type: string taxable_amount: type: string tax_rate: type: string exempt_reason: type: string tax_items: type: array items: $ref: '#/components/schemas/TaxItemEstimate' TransactionEstimateResponse: type: object properties: external_id: type: string date: type: string format: date-time currency: type: string total_tax_amount_calculated: type: string taxable_amount: type: string tax_rate_calculated: type: string has_active_registration: type: boolean addresses: type: array items: $ref: '#/components/schemas/Address' transaction_items: type: array items: $ref: '#/components/schemas/TransactionItemEstimateResponse' TransactionRequest: type: object properties: external_id: type: string date: type: string format: date-time currency: type: string status: type: string external_customer_id: type: string addresses: type: array items: $ref: '#/components/schemas/Address' transaction_items: type: array items: $ref: '#/components/schemas/TransactionItemEstimate' required: - external_id - date - currency Transaction: allOf: - $ref: '#/components/schemas/TransactionRequest' - type: object properties: id: type: string total_tax_amount_calculated: type: string taxable_amount: type: string created_at: type: string format: date-time updated_at: type: string format: date-time TransactionPage: $ref: '#/components/schemas/Page' CreditNoteRequest: type: object properties: external_id: type: string date: type: string format: date-time amount: type: number reason: type: string CustomerRequest: type: object properties: external_id: type: string name: type: string email: type: string addresses: type: array items: $ref: '#/components/schemas/Address' Customer: allOf: - $ref: '#/components/schemas/CustomerRequest' - type: object properties: id: type: string created_at: type: string format: date-time CustomerPage: $ref: '#/components/schemas/Page' ProductRequest: type: object properties: external_id: type: string name: type: string description: type: string category: type: string subcategory: type: string tax_code: type: string Product: allOf: - $ref: '#/components/schemas/ProductRequest' - type: object properties: id: type: string ProductPage: $ref: '#/components/schemas/Page' ProductCategory: type: object properties: category: type: string subcategory: type: string tax_code: type: string description: type: string Nexus: type: object properties: id: type: string state: type: string country: type: string nexus_type: type: string enum: - PHYSICAL - ECONOMIC status: type: string registration_id: type: string PhysicalNexusRequest: type: object properties: state: type: string country: type: string start_date: type: string format: date end_date: type: string format: date required: - state Exemption: type: object properties: id: type: string external_customer_id: type: string state: type: string exemption_type: type: string status: type: string valid_from: type: string format: date valid_to: type: string format: date ExemptionRequest: type: object properties: external_customer_id: type: string state: type: string exemption_type: type: string valid_from: type: string format: date valid_to: type: string format: date required: - external_customer_id - state ExemptionPage: $ref: '#/components/schemas/Page' Attachment: type: object properties: id: type: string filename: type: string url: type: string content_type: type: string Registration: type: object properties: id: type: string state: type: string country: type: string registration_number: type: string status: type: string effective_date: type: string format: date filing_frequency: type: string RegistrationRequest: type: object properties: state: type: string country: type: string effective_date: type: string format: date required: - state Filing: type: object properties: id: type: string registration_id: type: string state: type: string period_start: type: string format: date period_end: type: string format: date due_date: type: string format: date status: type: string total_tax_due: type: string filed_at: type: string format: date-time FilingPage: $ref: '#/components/schemas/Page' Page: type: object properties: items: type: array items: type: object total: type: integer page: type: integer size: type: integer pages: type: integer Error: type: object properties: detail: type: string status_code: type: integer