Official Python client for Supermetrics
Project description
Supermetrics client for Python.
Official Python client for Supermetrics
- PyPI package: https://pypi.org/project/supermetrics/
- Free software: Apache License v2
Features
- Type-safe Python client generated from OpenAPI specification
- Dual sync/async support via separate Client classes
- Pydantic v2 models for request/response validation
- Comprehensive API coverage: login links, logins, accounts, queries, DWH backfills
- Custom exception hierarchy with HTTP status code mapping
- Resource-based API organization
Quick Start
Installation
pip install supermetrics
Basic Usage
from supermetrics import SupermetricsClient
# Initialize client
client = SupermetricsClient(api_key="your_api_key")
# Create login link for data source authentication
link = client.login_links.create(
ds_id="GAWA",
description="My Analytics Authentication"
)
# Get login details after user authenticates
login = client.logins.get(login_id=link.login_id)
# List available accounts
accounts = client.accounts.list(
ds_id="GAWA",
login_usernames=login.username
)
# Execute query
result = client.queries.execute(
ds_id="GAWA",
ds_accounts=[accounts[0].account_id],
fields=["Date", "Sessions", "Users"],
start_date="2024-01-01",
end_date="2024-01-07"
)
print(f"Retrieved {len(result.data)} rows")
Data Warehouse Backfills
from supermetrics import SupermetricsClient
# Initialize client
client = SupermetricsClient(api_key="your_api_key")
# Create a backfill for historical data
backfill = client.backfills.create(
team_id=12345,
transfer_id=456789,
range_start="2024-01-01",
range_end="2024-01-31"
)
print(f"Backfill created: {backfill.transfer_backfill_id}")
print(f"Status: {backfill.status}")
# Get the latest backfill for a transfer
latest = client.backfills.get_latest(team_id=12345, transfer_id=456789)
print(f"Latest backfill status: {latest.status}")
print(f"Progress: {latest.transfer_runs_completed}/{latest.transfer_runs_total}")
# List all incomplete backfills for a team
backfills = client.backfills.list_incomplete(team_id=12345)
for bf in backfills:
print(f"Backfill {bf.transfer_backfill_id}: {bf.status}")
# Cancel a backfill
cancelled = client.backfills.cancel(team_id=12345, backfill_id=67890)
print(f"Backfill cancelled: {cancelled.status}")
Examples
See the examples/ directory for complete working examples:
complete_flow.py- Full sync workflow from authentication to query executionasync_flow.py- Async version of complete workflow
See examples/README.md for setup and running instructions.
Error Handling
The SDK provides specific exception types for different error scenarios:
from supermetrics import (
SupermetricsClient,
AuthenticationError,
ValidationError,
APIError,
NetworkError,
)
client = SupermetricsClient(api_key="your_key")
try:
link = client.login_links.create(ds_id="GAWA", description="Test")
except AuthenticationError as e:
print(f"Invalid API key: {e.message}")
except ValidationError as e:
print(f"Invalid parameters: {e.message}")
except APIError as e:
print(f"API error: {e.message}")
except NetworkError as e:
print(f"Network error: {e.message}")
Documentation
OpenAPI Client Regeneration
The SDK client is auto-generated from the Supermetrics OpenAPI specification.
Source Specifications
- Location:
openapi-specs/directory (containsopenapi-data.yamlandopenapi-management.yaml) - Merged Spec:
openapi-spec.yaml(project root) - filtered, patched, and merged from source specs - Configuration:
scripts/references/sdk-endpoint-filters.yaml- controls which endpoints are included and applies patches/customizations - Documentation: See scripts/README.md for detailed patch system documentation
SDK Endpoint Filtering and Customization
The SDK uses a configuration-driven process to create a focused, customizable client from multiple OpenAPI specifications.
scripts/references/sdk-endpoint-filters.yaml - Endpoint Configuration
This YAML file defines which API endpoints to include in the SDK and allows you to apply patches/customizations to both endpoints and shared components.
Key Features:
- Endpoint Filtering: Include only the endpoints your application needs
- Endpoint Patches: Customize individual endpoint definitions (descriptions, parameters, responses, etc.)
- Component Patches: Apply surgical modifications to shared schemas, responses, and other components
- Merge & Replace Strategies: Deep merge or complete replacement of OpenAPI sections
Basic Example:
endpoints:
- method: GET
path: /ds/logins
- method: GET
path: /query/data/json
component_patches:
schemas:
DataResponse:
merge:
properties:
meta:
properties:
result:
properties:
cache_time:
nullable: true
For detailed documentation on the configuration format, patch strategies, and comprehensive examples, see scripts/README.md.
scripts/filter_openapi_spec.py - Specification Filter, Patcher, and Merger
This Python script processes multiple OpenAPI specifications, applies customizations, and creates a single openapi-spec.yaml file.
What it does:
- Reads configuration from
scripts/references/sdk-endpoint-filters.yaml - Scans and loads all
.yaml/.ymlfiles fromopenapi-specs/directory - Filters endpoints based on configuration
- Applies endpoint patches (merge/replace operations)
- Collects all referenced components via
$reftraversal (dependency resolution) - Resolves external file references
- Applies component patches to shared schemas, responses, etc.
- Detects and fails on duplicate
METHOD|PATHacross specs - Merges everything into single specification
- Validates all requested endpoints were found
Usage:
python scripts/filter_openapi_spec.py
Configuration:
- Input:
openapi-specs/*.yamlandscripts/references/sdk-endpoint-filters.yaml - Output:
openapi-spec.yaml
Exit codes:
0- Success1- Error (missing files, duplicates, or validation failure)
For detailed documentation on patch strategies, troubleshooting, and examples, see scripts/README.md.
How to Regenerate
Full Regeneration (recommended):
# 1. Update source specs in openapi-specs/ if needed
# 2. Update scripts/references/sdk-endpoint-filters.yaml to add/remove endpoints or apply patches
# 3. Run filter script to regenerate merged spec
python scripts/filter_openapi_spec.py
# 4. Regenerate SDK from merged spec
./scripts/regenerate_client.sh
Quick Regeneration (if openapi-spec.yaml unchanged):
./scripts/regenerate_client.sh
When to Regenerate
- Monthly (or when Supermetrics API changes)
- After updating source specs in
openapi-specs/ - After modifying
scripts/references/sdk-endpoint-filters.yaml(adding/removing endpoints or changing patches)
Adding/Removing Endpoints or Applying Patches
- Edit
scripts/references/sdk-endpoint-filters.yaml:- Add/remove endpoints in the
endpointslist - Add/modify patches in
component_patchesor endpoint-levelpatches
- Add/remove endpoints in the
- Run
python scripts/filter_openapi_spec.pyto regenerate the merged spec - Run
./scripts/regenerate_client.shto regenerate the SDK client
See scripts/README.md for detailed documentation on:
- Configuration file format
- Endpoint and component patch strategies
- Comprehensive examples
- Troubleshooting guide
Note: The adapter pattern (implemented in Story 1.3+) protects users from breaking changes during regeneration
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines on how to contribute, run tests, and deploy releases.
Credits
This package was created with Cookiecutter and the audreyfeldroy/cookiecutter-pypackage project template.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file supermetrics-0.2.0b0.tar.gz.
File metadata
- Download URL: supermetrics-0.2.0b0.tar.gz
- Upload date:
- Size: 842.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5af22587150f2c241a84c09c32291a857edc5ee9885c86226aedfda7bbc113b6
|
|
| MD5 |
7e83ec5c6074b816d55999a84343ca09
|
|
| BLAKE2b-256 |
09258edc0d7446039958b3a673df6c75e70d89b665571793725f5df158ea9442
|
File details
Details for the file supermetrics-0.2.0b0-py3-none-any.whl.
File metadata
- Download URL: supermetrics-0.2.0b0-py3-none-any.whl
- Upload date:
- Size: 179.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d36f56690ebd3669494dc1bbe565f6442a98315a308c136391d9309829154720
|
|
| MD5 |
5922e33469cde429751f620f223bb4f4
|
|
| BLAKE2b-256 |
0fa0e7b4f085d01a993ede72f30e51a32df6c6415bfe75b0c36608a9f7c50bd7
|