Python SDK for the Kanopy infrastructure inspection API
Project description
Kanopy Python SDK
kanopy-ai is the Python client for Kanopy's infrastructure inspection API.
It covers the core integration workflow: create a project, upload footage,
monitor processing, query network inventory, and download results.
License and service boundary
The client library in this repository is licensed under the Apache License, Version 2.0. Copyright 2026 Kanopy AI, Inc.
The license applies to the SDK source code only. It does not grant access to the Kanopy API or rights in Kanopy's hosted service, backend implementation, models, processing systems, customer data, trade names, or trademarks. API access requires credentials issued by Kanopy and remains subject to the applicable customer agreement and service terms.
Applications that merely use the SDK through its interfaces remain separable works under Apache-2.0. Utilities retain their independently developed applications and data; Kanopy retains its SDK, platform, and pre-existing intellectual property.
Install
pip install kanopy-ai
Quick start
from kanopy import Kanopy
with Kanopy(api_key="kpy_live_...") as kanopy:
project = kanopy.create_project(
name="North corridor",
description="Q3 inspection",
)
upload = kanopy.upload(
"flight.mp4",
metadata="flight.srt",
project_id=project["id"],
title="North corridor flight 01",
upload_request_id="north-corridor-flight-01",
)
# Reconstruction is queued automatically when the upload completes.
job = kanopy.wait_for_job(upload["job_id"], timeout=60 * 60)
trees = kanopy.list_project_trees(project["id"], job_id=job["id"])
The default base URL is https://app.kanopy-ai.com/api/v1. For staging or
local development, pass base_url= when constructing Kanopy.
Large video uploads
Use upload_large for production inspection footage. It creates an idempotent
multipart session, uploads parts directly to object storage, retries each
failed part with a fresh presigned URL, and queues reconstruction when all
parts are complete:
def report_progress(sent: int, total: int) -> None:
print(f"{sent / total:.0%}")
upload = kanopy.upload_large(
"large-flight.mp4",
metadata="flight.srt",
project_id=project["id"],
title="North corridor flight 02",
upload_request_id="north-corridor-flight-02",
capture_device="drone",
line_clearance=True,
progress=report_progress,
)
The default uses 64 MiB parts, four parallel workers, and three attempts per
part. part_size, max_workers, and part_retries are configurable. Memory
use is approximately part_size * max_workers while transfers are active.
Pagination
List methods return a Page. Offset pagination is used by default. Pass
cursor="" to start keyset pagination, then use page.next_cursor:
page = kanopy.list_jobs(cursor="", limit=100)
while True:
for job in page.items:
print(job["id"], job["status"])
if not page.next_cursor:
break
page = kanopy.list_jobs(cursor=page.next_cursor, limit=100)
Errors and request IDs
Non-successful API responses raise KanopyError. The exception exposes the
HTTP status, Kanopy error code, detail payload, and support request ID:
from kanopy import KanopyError
try:
kanopy.get_job("missing-id")
except KanopyError as exc:
print(exc.status_code, exc.code, exc.request_id)
Isolated local API smoke test
The smoke harness builds the current backend and runs the installed SDK against
a disposable Docker stack with Postgres, Redis, and MinIO. It uses real bearer
authentication, enables API_KEY_CONTRACT_MODE=block, performs a two-part
presigned upload, and removes all containers and volumes when it finishes.
./scripts/run_local_smoke.sh
The stack uses localhost:18000 for the API and localhost:19100 for MinIO so
it can run alongside the normal development Compose project.
The SDK keeps a reviewed copy of Kanopy's public OpenAPI schema under
tests/fixtures/. From the Kanopy development repository root, refresh that
copy after an intentional public API change with:
./scripts/sync_public_openapi.sh
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 kanopy_ai-0.1.0.tar.gz.
File metadata
- Download URL: kanopy_ai-0.1.0.tar.gz
- Upload date:
- Size: 36.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00e5f068ef3d93e3357077cdcc506b50a2c6249615d1924edb009b2bcf6ab8f7
|
|
| MD5 |
74b0b17c9a48b9d25c70743c02e8abaa
|
|
| BLAKE2b-256 |
34952c373e413cea8d49c880d2a98ae8e767cae88994f15281df9e24f97268c0
|
Provenance
The following attestation bundles were made for kanopy_ai-0.1.0.tar.gz:
Publisher:
release.yml on KanopyAI/kanopy-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kanopy_ai-0.1.0.tar.gz -
Subject digest:
00e5f068ef3d93e3357077cdcc506b50a2c6249615d1924edb009b2bcf6ab8f7 - Sigstore transparency entry: 2306199868
- Sigstore integration time:
-
Permalink:
KanopyAI/kanopy-python@82c2a224f6f31c8413168d392e42158c47a90128 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/KanopyAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@82c2a224f6f31c8413168d392e42158c47a90128 -
Trigger Event:
push
-
Statement type:
File details
Details for the file kanopy_ai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: kanopy_ai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
50b2d3e5a17a513afdcdbef8ec54862a4cd1baad12a2319fc50e33c9a2a947d6
|
|
| MD5 |
833043761a879cbb049b1d6c287a7e33
|
|
| BLAKE2b-256 |
23b6583ab28f448861c3add96d9a6768480ec933f90a767978260a5ab97859aa
|
Provenance
The following attestation bundles were made for kanopy_ai-0.1.0-py3-none-any.whl:
Publisher:
release.yml on KanopyAI/kanopy-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kanopy_ai-0.1.0-py3-none-any.whl -
Subject digest:
50b2d3e5a17a513afdcdbef8ec54862a4cd1baad12a2319fc50e33c9a2a947d6 - Sigstore transparency entry: 2306199958
- Sigstore integration time:
-
Permalink:
KanopyAI/kanopy-python@82c2a224f6f31c8413168d392e42158c47a90128 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/KanopyAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@82c2a224f6f31c8413168d392e42158c47a90128 -
Trigger Event:
push
-
Statement type: