Skip to main content

Etsy API Client Library for Python

Project description

Etsy API Client Library for Python

PyPI version license last-commit repo-top-language

etsy-api-badge


Table of Contents


Overview

A comprehensive Python client library for the Etsy API v3, providing a modern, type-safe interface for interacting with the Etsy marketplace. This SDK simplifies OAuth 2.0 authentication, automatic token refresh, and provides complete coverage of Etsy's API endpoints.

Features

โœจ Complete API Coverage - Full support for Etsy API v3 endpoints including:

  • Listings management (create, update, delete, search)
  • Shop operations (sections, policies, production partners)
  • Receipt and transaction handling
  • Shipping profiles and destinations
  • Product taxonomy and attributes
  • File, image, and video uploads
  • Reviews and payment processing

๐Ÿ” Robust Authentication - OAuth 2.0 with PKCE support:

  • Secure authorization code flow
  • Automatic token refresh before expiry
  • Custom token synchronization callbacks
  • Session management with timezone-aware expiry handling

๐Ÿ—๏ธ Developer-Friendly Architecture:

  • Type-safe request/response models using dataclasses
  • Comprehensive enum definitions for API parameters
  • Consistent error handling with detailed exceptions
  • Rate limiting information in responses
  • Clean separation of concerns with resource-based structure

โšก Production Ready:

  • Built-in retry logic for failed requests
  • Configurable environments (production/staging)
  • Extensive error handling and validation
  • Support for file uploads and multipart requests

Requirements

Installation

Install from PyPI

pip install etsy-python

Install from Source

git clone https://github.com/amitray007/etsy-python-sdk.git
cd etsy-python-sdk
pip install -e .

Dependencies

The SDK requires:

  • requests>=2.32.2 - HTTP client library
  • requests-oauthlib>=1.3.1 - OAuth 2.0 support

Quick Start

1. Authentication Setup

from etsy_python.v3.auth.OAuth import EtsyOAuth

# Initialize OAuth client
oauth = EtsyOAuth(
    keystring="your_api_key",
    redirect_uri="http://localhost:8000/callback",
    scopes=["listings_r", "listings_w", "shops_r", "shops_w"]
)

# Get authorization URL
auth_url, state = oauth.get_auth_code()
print(f"Visit this URL to authorize: {auth_url}")

# After user authorizes, set the authorization code
oauth.set_authorisation_code(code="auth_code_from_callback", state=state)

# Get access token
token_data = oauth.get_access_token()

2. Initialize Client Session

from datetime import datetime
from etsy_python.v3.resources.Session import EtsyClient

# Create client with tokens
client = EtsyClient(
    keystring="your_api_key",
    access_token=token_data["access_token"],
    refresh_token=token_data["refresh_token"],
    expiry=datetime.utcnow() + timedelta(seconds=token_data["expires_in"])
)

3. Make API Calls

from etsy_python.v3.resources.Listing import ListingResource
from etsy_python.v3.enums.Listing import State, SortOn, SortOrder

# Initialize resource
listing_resource = ListingResource(session=client)

# Get active listings for a shop
response = listing_resource.get_listings_by_shop(
    shop_id=12345,
    state=State.ACTIVE,
    limit=25,
    sort_on=SortOn.CREATED,
    sort_order=SortOrder.DESC
)

print(f"Found {len(response.message['results'])} listings")

Usage Examples

Managing Listings

from etsy_python.v3.models.Listing import CreateDraftListingRequest
from etsy_python.v3.enums.Listing import WhoMade, WhenMade

# Create a draft listing
draft_listing = CreateDraftListingRequest(
    title="Handmade Ceramic Mug",
    description="Beautiful handcrafted ceramic mug",
    price=25.00,
    quantity=10,
    who_made=WhoMade.I_DID,
    when_made=WhenMade.MADE_TO_ORDER,
    taxonomy_id=1234,
    tags=["ceramic", "mug", "handmade"]
)

response = listing_resource.create_draft_listing(
    shop_id=12345,
    listing=draft_listing
)

Working with Receipts

from etsy_python.v3.resources.Receipt import ReceiptResource
from etsy_python.v3.models.Receipt import CreateReceiptShipmentRequest

receipt_resource = ReceiptResource(session=client)

# Get shop receipts
receipts = receipt_resource.get_shop_receipts(
    shop_id=12345,
    limit=50
)

# Create shipment for a receipt
shipment_request = CreateReceiptShipmentRequest(
    tracking_number="1Z999AA10123456784",
    carrier_name="USPS",
    notification_sent=True
)

receipt_resource.create_receipt_shipment(
    shop_id=12345,
    receipt_id=67890,
    shipment=shipment_request
)

Uploading Images

from etsy_python.v3.resources.ListingImage import ListingImageResource
from etsy_python.v3.models.Listing import UploadListingImageRequest

image_resource = ListingImageResource(session=client)

# Upload image to listing
with open("product_photo.jpg", "rb") as image_file:
    upload_request = UploadListingImageRequest(
        image=image_file,
        alt_text="Front view of ceramic mug"
    )

    response = image_resource.upload_listing_image(
        shop_id=12345,
        listing_id=67890,
        image=upload_request
    )

Handling Shipping Profiles

from etsy_python.v3.resources.ShippingProfile import ShippingProfileResource
from etsy_python.v3.models.ShippingProfile import CreateShopShippingProfileRequest
from etsy_python.v3.enums.ShippingProfile import ProcessingTimeUnit

shipping_resource = ShippingProfileResource(session=client)

# Create shipping profile
profile_request = CreateShopShippingProfileRequest(
    title="Standard Shipping",
    processing_time_value=3,
    processing_time_unit=ProcessingTimeUnit.BUSINESS_DAYS,
    origin_country_iso="US",
    primary_cost=5.00,
    secondary_cost=2.00
)

response = shipping_resource.create_shop_shipping_profile(
    shop_id=12345,
    profile=profile_request
)

Token Management with Callback

def save_tokens_to_database(access_token, refresh_token, expiry):
    """Custom function to persist tokens"""
    # Your database logic here
    pass

# Initialize client with token sync callback
client = EtsyClient(
    keystring="your_api_key",
    access_token=access_token,
    refresh_token=refresh_token,
    expiry=expiry,
    sync_refresh=save_tokens_to_database
)

# Tokens will be automatically refreshed and saved when expired

API Resources

The SDK provides comprehensive coverage of Etsy API v3 resources:

Core Resources

  • Listing - Create, read, update, delete listings
  • Shop - Manage shop information and settings
  • Receipt - Handle orders and transactions
  • ReceiptTransactions - Individual transaction details
  • User - User profiles and addresses
  • UserAddress - User address management
  • ShippingProfile - Configure shipping options and destinations

Media Resources

  • ListingImage - Upload and manage listing images
  • ListingVideo - Upload and manage listing videos
  • ListingFile - Digital file management
  • ListingVariationImages - Variation-specific images

Commerce Resources

  • ListingInventory - Stock and SKU management
  • ListingOffering - Product offering details
  • ListingProduct - Product variant management
  • Payment - Payment processing
  • PaymentLedgerEntry - Payment ledger entries
  • Review - Customer reviews management

Shop Management

  • ShopSection - Organize listings into sections
  • ShopReturnPolicy - Define return policies
  • ShopProductionPartner - Manage production partners
  • HolidayPreferences - Shop holiday schedule
  • ProcessingProfile - Processing time profiles

Taxonomy & Translation

  • BuyerTaxonomy / SellerTaxonomy - Product categories and attributes
  • ListingTranslation - Listing localization
  • Miscellaneous - Ping and other utility endpoints

Error Handling

The SDK provides detailed error information through custom exceptions:

from etsy_python.v3.exceptions.RequestException import RequestException

try:
    response = listing_resource.get_listing(listing_id=12345)
except RequestException as e:
    print(f"Error Code: {e.code}")
    print(f"Error Message: {e.error}")
    print(f"Error Description: {e.type}")

    # Rate limit information (if available)
    if e.rate_limits:
        print(f"Daily Limit: {e.rate_limits.limit_per_day}")
        print(f"Remaining Today: {e.rate_limits.remaining_today}")

Environment Configuration

Configure the SDK environment using environment variables:

# Set environment (defaults to PROD)
export ETSY_ENV=PROD

Project Structure

etsy-python-sdk/
โ”œโ”€โ”€ etsy_python/
โ”‚   โ”œโ”€โ”€ _version.py            # Single source of truth for version
โ”‚   โ””โ”€โ”€ v3/
โ”‚       โ”œโ”€โ”€ auth/              # OAuth 2.0 PKCE authentication
โ”‚       โ”œโ”€โ”€ common/            # Shared utilities and HTTP constants
โ”‚       โ”œโ”€โ”€ enums/             # Type-safe API parameter constants
โ”‚       โ”œโ”€โ”€ exceptions/        # Custom exceptions with rate limit info
โ”‚       โ”œโ”€โ”€ models/            # Request data models with validation
โ”‚       โ””โ”€โ”€ resources/         # ~28 API endpoint resource classes
โ”œโ”€โ”€ tests/                     # pytest test suite
โ”‚   โ””โ”€โ”€ fixtures/              # Shared test fixtures and mock responses
โ”œโ”€โ”€ scripts/                   # Maintenance and release scripts
โ”œโ”€โ”€ specs/                     # OAS spec files and audit reports
โ”œโ”€โ”€ .github/
โ”‚   โ”œโ”€โ”€ workflows/             # CI/CD and PR automation
โ”‚   โ””โ”€โ”€ CODEOWNERS             # Required reviewers for sensitive files
โ”œโ”€โ”€ setup.py                   # Package configuration
โ”œโ”€โ”€ requirements-dev.txt       # Development/testing dependencies
โ””โ”€โ”€ README.md                  # Documentation

Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

Automatic Versioning

This project uses automatic semantic versioning based on commit messages:

  • Commits with breaking: or BREAKING CHANGE โ†’ Major version bump (1.0.0 โ†’ 2.0.0)
  • Commits with feat: or containing feature โ†’ Minor version bump (1.0.0 โ†’ 1.1.0)
  • All other commits โ†’ Patch version bump (1.0.0 โ†’ 1.0.1)

The version is automatically bumped when changes are pushed to the master branch, and the package is automatically published to PyPI.

Skipping CI/CD

To skip the automatic versioning and publishing workflow, include one of these phrases in your commit message:

  • [skip ci]
  • [ci skip]
  • skip ci
  • [no ci]

Example:

git commit -m "docs: update README [skip ci]"

Manual Release (for maintainers)

For local testing or manual releases:

# Install development dependencies
pip install -e .

# Create a patch release
python scripts/release.py patch

# Create a minor release
python scripts/release.py minor

# Create a major release
python scripts/release.py major

# Dry run (local only, no push)
python scripts/release.py patch --no-push

Development Setup

  1. Fork the repository
  2. Clone your fork:
    git clone https://github.com/yourusername/etsy-python-sdk.git
    cd etsy-python-sdk
    
  3. Create a virtual environment:
    python -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  4. Install dependencies:
    pip install -r etsy_python/requirements.txt
    pip install -r requirements-dev.txt
    
  5. Run the test suite:
    pytest -v
    pytest --cov=etsy_python --cov-report=term-missing
    
  6. Create a feature branch:
    git checkout -b feature/your-feature-name
    
  7. Make your changes and commit:
    git commit -m "feat: add your feature"
    
  8. Push and create a pull request

CI on Pull Requests

Pull requests automatically trigger:

  • pr-tests.yml โ€” Runs the full test suite with coverage reporting (posts/updates a comment on the PR)
  • pr-coverage.yml โ€” SDK coverage audit against the Etsy OAS spec (triggered by the sdk-check label)

Support

License

This project is licensed under the MIT License - see the LICENSE file for details.

Changelog

See Releases for full changelog.


Made with โค๏ธ for the Etsy developer community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

etsy_python-1.1.6.tar.gz (33.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

etsy_python-1.1.6-py3-none-any.whl (47.7 kB view details)

Uploaded Python 3

File details

Details for the file etsy_python-1.1.6.tar.gz.

File metadata

  • Download URL: etsy_python-1.1.6.tar.gz
  • Upload date:
  • Size: 33.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for etsy_python-1.1.6.tar.gz
Algorithm Hash digest
SHA256 545951d128e75a2d04d5013de2c76c4325c10684981e4b0a1f4db6723d68c6b8
MD5 e28268e4389ce54fac107abf83b5652c
BLAKE2b-256 4908defb6b13adad94ac2bbc3b1416925181045e3f11830c142b9aac8fc2c811

See more details on using hashes here.

Provenance

The following attestation bundles were made for etsy_python-1.1.6.tar.gz:

Publisher: python-publish.yml on amitray007/etsy-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etsy_python-1.1.6-py3-none-any.whl.

File metadata

  • Download URL: etsy_python-1.1.6-py3-none-any.whl
  • Upload date:
  • Size: 47.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for etsy_python-1.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 2b1ae42fd911632bf93f94fcf0b56e1b8ab03dcec5d5b1118981860c833d3fa3
MD5 c25fc62d28b4015c804e0c85b2ffdca3
BLAKE2b-256 158bdf6d2c8878ff5ef6dce8871b8f5f359ef2860c4d1a32adf78fa544a0597e

See more details on using hashes here.

Provenance

The following attestation bundles were made for etsy_python-1.1.6-py3-none-any.whl:

Publisher: python-publish.yml on amitray007/etsy-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page