Skip to main content

Python SDK

pip install buildai-sdk
from buildai import Client

client = Client()  # reads BUILDAI_API_KEY from env
# or: client = Client(api_key="build_live_...")

Factories

factories = client.factories.list(page_size=50)
factory = client.factories.get("factory-id")
workers = client.factories.workers("factory-id", page_size=50)

Workers

workers = client.workers.list(page_size=50)
worker = client.workers.get("worker-id")

Clips

# List and filter
clips = client.clips.list(factory_id="...", page_size=25)
clips = client.clips.list(worker_id="...", page_size=25)

# Detail
clip = client.clips.get("clip-id")
print(clip.clip_id, clip.duration_seconds, clip.recorded_at)

# Frames
frames = client.clips.frames("clip-id", page_size=50)
for frame in frames.items:
    print(frame.frame_index, frame.timestamp_seconds, f"{frame.width_pixels}x{frame.height_pixels}")

# Descriptions
desc = client.clips.description("clip-id")

# Signed media URLs (video, audio, IMU)
video = client.clips.video("clip-id")
audio = client.clips.audio("clip-id")
imu = client.clips.imu("clip-id")
print(video.signed_url)  # temporary HTTPS URL
# Text search
results = client.search("someone welding")
for match in results.items:
    print(match.clip_id, match.similarity_score, match.match_summary)

# With filters
results = client.search.query(
    query_text="assembly line",
    factory_ids=["..."],
    worker_ids=["..."],
    created_after="2025-01-01",
    created_before="2025-06-01",
    collection_id="...",
    page_size=20,
)

# Image search
results = client.search.query(query_image_base64="BASE64_STRING")

# Find similar to a clip or frame
similar = client.search.similar(reference_clip_id="...")
similar = client.search.similar(reference_frame_id="...")
similar = client.search.similar(reference_image_base64="...")

Embeddings

# Single clip vector
embedding = client.embeddings.get_clip_embedding("clip-id")
print(embedding.vector_dimensions, len(embedding.vector))

# Batch fetch
batch = client.embeddings.batch(
    entity_ids=["id1", "id2", "id3"],
    entity_type="clip",
    include_vector=True,
)

# Query by text
results = client.embeddings.query(query_text="soldering")

# Find similar
similar = client.embeddings.similar(entity_id="...", entity_type="clip")

Datasets

# List released datasets
datasets = client.datasets.list()
for ds in datasets.items:
    print(ds.name, ds.clip_count)

# Get detail
dataset = client.datasets.get("egocentric-100k")

# WebDataset shard URLs (for training pipelines)
urls = client.datasets.webdataset_urls("egocentric-100k")
print(f"{len(urls)} shards")

# List individual shard artifacts
shards = client.datasets.list_webdataset_artifacts("egocentric-100k", page_size=10)
for shard in shards.items:
    print(shard.shard_path, shard.clip_count, shard.size_bytes)

Analyze

# Novelty — how novel is an image vs existing data
report = client.analyze.novelty(image_url="https://...")
print(report.aggregate_score)

# Diversity metrics
diversity = client.analyze.diversity()

# Service health
status = client.analyze.status()
print(status.service, status.status)

Pagination

All list methods return a Page with cursor-based pagination:
page = client.clips.list(page_size=50)

for clip in page.items:
    print(clip.clip_id)

# Next page
if page.pagination.has_more:
    next_page = client.clips.list(page_size=50, cursor=page.pagination.cursor)

Authentication

The client reads BUILDAI_API_KEY from the environment by default. You can also pass it directly:
client = Client(api_key="build_live_...")
Both X-API-Key header and Authorization: Bearer are supported by the API. The SDK uses Bearer.