Hotdata API
Project description
hotdata
Official Python client for the Hotdata HTTP API: workspaces, connections, datasets, SQL queries, results, secrets, uploads, indexes, jobs, embedding providers, and workspace context.
Requirements
Python 3.9+
Install
pip install hotdata
For an unreleased revision:
pip install "git+https://github.com/hotdata-dev/sdk-python.git"
From a local checkout (editable):
pip install -e .
Authentication
The API uses an API key sent as Authorization: Bearer <key>, plus an X-Workspace-Id header on requests scoped to a workspace.
import hotdata
configuration = hotdata.Configuration(
api_key="YOUR_API_KEY",
workspace_id="YOUR_WORKSPACE_ID",
)
host defaults to https://api.hotdata.dev. Override it if you target another environment.
Usage
import hotdata
from hotdata.rest import ApiException
configuration = hotdata.Configuration(
api_key="YOUR_API_KEY",
workspace_id="YOUR_WORKSPACE_ID",
)
with hotdata.ApiClient(configuration) as api_client:
workspaces = hotdata.WorkspacesApi(api_client)
try:
response = workspaces.list_workspaces()
except ApiException as e:
print(f"API error: {e.status} {e.reason}\n{e.body}")
Each Api class groups endpoints by resource. Construct the client, then call the typed methods you need.
Arrow results
Query results can be fetched as an Apache Arrow IPC stream instead of JSON, which is faster and far more memory-efficient for large result sets. Install the optional extra:
pip install 'hotdata[arrow]'
Use hotdata.arrow.ResultsApi (a drop-in subclass of ResultsApi that adds Arrow methods):
from hotdata import ApiClient, Configuration
from hotdata.arrow import ResultsApi
with ApiClient(Configuration(api_key="...", workspace_id="...")) as client:
results = ResultsApi(client)
# Buffered: returns a pyarrow.Table.
table = results.get_result_arrow(result_id)
# Streaming: yields a pyarrow.RecordBatchStreamReader without
# materializing the full table in memory.
with results.stream_result_arrow(result_id) as reader:
for batch in reader:
...
Both methods accept offset and limit for pagination. They raise hotdata.arrow.ResultNotReadyError if the result is still pending or processing — poll results.get_result(result_id) until status == "ready" first.
File uploads
hotdata.uploads.UploadsApi (also the default hotdata.UploadsApi) adds
upload_file, which uploads a local file directly to object storage and
finalizes it in one call. It opens an upload session, PUTs the bytes straight
to storage — a single PUT for a small file, concurrent part PUTs for a large
one — then finalizes. The bytes never round-trip through the API.
from hotdata import ApiClient, Configuration, UploadsApi
with ApiClient(Configuration(api_key="...", workspace_id="...")) as client:
uploads = UploadsApi(client)
finalized = uploads.upload_file(
"data.parquet",
content_type="application/parquet",
progress=lambda done, total: print(f"{done}/{total} bytes"),
)
# Pass finalized.upload_id to the managed-table load endpoint.
print(finalized.upload_id)
upload_file accepts a path, raw bytes, or a seekable binary file object
(size is inferred for all three; a file object is read from its current
position to the end). The SDK picks single vs. multipart from the size,
auto-scales the part size, and bounds part concurrency to a peak-memory budget
(override with part_size / max_concurrency / part_retry). Storage PUTs go
through a dedicated, header-isolated connection pool, so the SDK's auth and
workspace headers never reach object storage (which would otherwise reject the
upload). Finalize is sent with retries disabled so the exactly-once call is never
accidentally replayed.
Failures surface as a typed hierarchy under hotdata.uploads.UploadError:
StorageError (storage returned a non-2xx), StorageTransportError (the PUT
failed before any response), MissingETagError, MalformedSessionError, and
SizeLimitError. Opening the session or finalizing raises the usual
hotdata.exceptions.ApiException — for example a 501 PRESIGN_UNSUPPORTED,
meaning the backend cannot issue upload URLs.
For that fallback (or to upload from a non-seekable stream), use upload_stream,
which sends the bytes to the legacy POST /v1/files endpoint in one request,
streaming a file object without buffering it in memory:
with open("data.parquet", "rb") as f:
resp = uploads.upload_stream(f, content_type="application/parquet")
print(resp.id)
Note upload_file shadows the generated raw-body upload_file(body=...); that
raw operation is still reachable at
hotdata.api.uploads_api.UploadsApi.upload_file.
API reference
Generated Markdown for every operation and model is in docs/:
- Resource APIs:
docs/*Api.md(for exampleQueryApi.md) - Request and response models:
docs/<ModelName>.md
Support
Questions and issues: github.com/hotdata-dev/sdk-python.
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 hotdata-0.5.0.tar.gz.
File metadata
- Download URL: hotdata-0.5.0.tar.gz
- Upload date:
- Size: 170.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d0240e6a3e7333e4290d8b3e75afebba43e518b868e1c3e3818fd719a6ab994
|
|
| MD5 |
8a4b21f991a3b2cc6033a2124ad91a8f
|
|
| BLAKE2b-256 |
f2d879f4906f4a39aacd7a94c7991af63064cecb95015d4fbe4d50757b21c940
|
Provenance
The following attestation bundles were made for hotdata-0.5.0.tar.gz:
Publisher:
publish.yml on hotdata-dev/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hotdata-0.5.0.tar.gz -
Subject digest:
3d0240e6a3e7333e4290d8b3e75afebba43e518b868e1c3e3818fd719a6ab994 - Sigstore transparency entry: 1997066520
- Sigstore integration time:
-
Permalink:
hotdata-dev/sdk-python@c71e2c0fafcab8a2c5d97fc8b7c4aa8d0b8723ee -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/hotdata-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c71e2c0fafcab8a2c5d97fc8b7c4aa8d0b8723ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file hotdata-0.5.0-py3-none-any.whl.
File metadata
- Download URL: hotdata-0.5.0-py3-none-any.whl
- Upload date:
- Size: 286.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7c4f5f8af6a7b370810fb599e5a166fc4bb569f6f41c506698c4bebfb500fcc
|
|
| MD5 |
7c33b246399dba71a5542ff12a4514f9
|
|
| BLAKE2b-256 |
aa0e026a2e03647e3d3c26027b690ea24ef036fbeb314b85517db3d606aab4da
|
Provenance
The following attestation bundles were made for hotdata-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on hotdata-dev/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hotdata-0.5.0-py3-none-any.whl -
Subject digest:
e7c4f5f8af6a7b370810fb599e5a166fc4bb569f6f41c506698c4bebfb500fcc - Sigstore transparency entry: 1997066584
- Sigstore integration time:
-
Permalink:
hotdata-dev/sdk-python@c71e2c0fafcab8a2c5d97fc8b7c4aa8d0b8723ee -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/hotdata-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c71e2c0fafcab8a2c5d97fc8b7c4aa8d0b8723ee -
Trigger Event:
push
-
Statement type: