Skip to main content

Python SDK

Official Python SDK - The Kintsugi Python SDK provides a simple, type-safe way to interact with the Kintsugi API from Python applications.

Installation

pip install kintsugi-tax

Quick Start

from kintsugi_tax import KintsugiClient

# Initialize the client
client = KintsugiClient(
    api_key="your-api-key",
    organization_id="your-org-id"
)

# Calculate tax for a transaction
tax_result = client.tax.estimate({
    "line_items": [
        {
            "quantity": 1,
            "price": 100.00,
            "product_tax_code": "A_GEN_TAX"
        }
    ],
    "ship_to": {
        "street_1": "123 Main St",
        "city": "San Francisco",
        "state": "CA",
        "postal_code": "94105",
        "country": "US"
    }
})

print(f"Tax amount: ${tax_result.total_tax}")

Repository

Python SDK Repository

View source code, report issues, and contribute to the Python SDK

Features

  • Type Safety: Full type hints and IntelliSense support
  • Async Support: Built-in async/await support for high-performance applications
  • Error Handling: Comprehensive error handling with detailed error messages
  • Authentication: Simple API key authentication
  • Rate Limiting: Built-in rate limiting and retry logic

Examples

Basic Tax Calculation

from kintsugi_tax import KintsugiClient

client = KintsugiClient(
    api_key=os.getenv("KINTSUGI_API_KEY"),
    organization_id=os.getenv("KINTSUGI_ORG_ID")
)

# Calculate tax
result = client.tax.estimate({
    "line_items": [
        {
            "quantity": 2,
            "price": 50.00,
            "product_tax_code": "A_GEN_TAX"
        }
    ],
    "ship_to": {
        "street_1": "456 Oak Ave",
        "city": "Los Angeles",
        "state": "CA",
        "postal_code": "90210",
        "country": "US"
    }
})

print(f"Total tax: ${result.total_tax}")

Async Usage

import asyncio
from kintsugi_tax import AsyncKintsugiClient

async def calculate_tax_async():
    client = AsyncKintsugiClient(
        api_key="your-api-key",
        organization_id="your-org-id"
    )
    
    result = await client.tax.estimate({
        "line_items": [{"quantity": 1, "price": 100.00}],
        "ship_to": {"state": "CA", "country": "US"}
    })
    
    return result

# Run async function
result = asyncio.run(calculate_tax_async())

Error Handling

from kintsugi_tax import KintsugiClient, KintsugiError

try:
    result = client.tax.estimate(transaction_data)
except KintsugiError as e:
    if e.status_code == 429:  # Rate limited
        print("Rate limited, retrying...")
        time.sleep(60)
        result = client.tax.estimate(transaction_data)
    elif e.status_code == 400:  # Bad request
        print(f"Invalid request: {e.message}")
    else:
        print(f"API error: {e.message}")

Configuration

Environment Variables

export KINTSUGI_API_KEY="your-api-key"
export KINTSUGI_ORGANIZATION_ID="your-org-id"

Custom Configuration

from kintsugi_tax import KintsugiClient

client = KintsugiClient(
    api_key="your-api-key",
    organization_id="your-org-id",
    base_url="https://api.trykintsugi.com",  # Optional: custom base URL
    timeout=30,  # Optional: request timeout
    retries=3    # Optional: number of retries
)

Testing

import unittest
from unittest.mock import Mock, patch
from kintsugi_tax import KintsugiClient

class TestTaxCalculation(unittest.TestCase):
    def setUp(self):
        self.client = KintsugiClient("test-key", "test-org")
    
    @patch('kintsugi_tax.KintsugiClient.tax.estimate')
    def test_tax_calculation(self, mock_estimate):
        mock_estimate.return_value = {
            "total_tax": 8.25,
            "tax_breakdown": [{"jurisdiction": "CA", "tax": 8.25}]
        }
        
        result = self.client.tax.estimate({
            "line_items": [{"quantity": 1, "price": 100}],
            "ship_to": {"state": "CA", "country": "US"}
        })
        
        self.assertEqual(result["total_tax"], 8.25)

Support