---
title: Result models
description: Every object the SDK returns, with its Pydantic definition and a link to the source. Generated from the shipped package, so it cannot drift.
section: API Reference
order: 99
---
Every result the SDK returns, generated from `pictograph 1.69.67`.
Definitions are collapsed - open one for its fields and a link to the source at [`v1.69.67`](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67).

## What each call returns

| Call | Returns |
|---|---|
| `client.annotation_comments.create()` | `AnnotationComment` [AnnotationComment](#annotationcomment) |
| `client.annotation_comments.delete()` | `None` |
| `client.annotation_comments.list()` | `Sequence[AnnotationComment]` [AnnotationComment](#annotationcomment) |
| `client.annotation_comments.resolve()` | `AnnotationComment` [AnnotationComment](#annotationcomment) |
| `client.annotation_comments.update()` | `AnnotationComment` [AnnotationComment](#annotationcomment) |
| `client.annotations.bulk_save()` | `BulkSaveResult` |
| `client.annotations.delete()` | `DeleteResult` |
| `client.annotations.delete_class()` | `DeleteClassResult` |
| `client.annotations.get()` | `list[Annotation]` |
| `client.annotations.import_coco()` | `AnnotationImportReport` [AnnotationImportReport](#annotationimportreport) |
| `client.annotations.import_pascal_voc()` | `AnnotationImportReport` [AnnotationImportReport](#annotationimportreport) |
| `client.annotations.import_yolo()` | `AnnotationImportReport` [AnnotationImportReport](#annotationimportreport) |
| `client.annotations.merge_class()` | `MergeClassResult` |
| `client.annotations.rename_class()` | `RenameClassResult` |
| `client.annotations.save()` | `SaveResult` |
| `client.api_keys.create()` | `CreatedApiKey` [CreatedApiKey](#createdapikey) |
| `client.api_keys.delete()` | `None` |
| `client.api_keys.get()` | `ApiKey` [ApiKey](#apikey) |
| `client.api_keys.list()` | `list[ApiKey]` [ApiKey](#apikey) |
| `client.api_keys.update()` | `ApiKey` [ApiKey](#apikey) |
| `client.auto_annotate.batch()` | `BatchJob` [BatchJob](#batchjob) |
| `client.auto_annotate.box()` | `PromptResult` [PromptResult](#promptresult) |
| `client.auto_annotate.cancel_batch()` | `BatchJob` [BatchJob](#batchjob) |
| `client.auto_annotate.dataset()` | `AnnotateReport` [AnnotateReport](#annotatereport) |
| `client.auto_annotate.get_batch()` | `BatchJob` [BatchJob](#batchjob) |
| `client.auto_annotate.point()` | `PromptResult` [PromptResult](#promptresult) |
| `client.auto_annotate.quote()` | `BatchQuote` [BatchQuote](#batchquote) |
| `client.auto_annotate.text()` | `PromptResult` [PromptResult](#promptresult) |
| `client.auto_annotate.wait_for_batch()` | `BatchJob` [BatchJob](#batchjob) |
| `client.batch.copy()` | `BatchResult` [BatchResult](#batchresult) |
| `client.batch.delete()` | `BatchResult` [BatchResult](#batchresult) |
| `client.batch.move()` | `BatchResult` [BatchResult](#batchresult) |
| `client.batch.update()` | `BatchResult` [BatchResult](#batchresult) |
| `client.connectors.cancel_import()` | `ImportJob` [ImportJob](#importjob) |
| `client.connectors.check_limits()` | `LimitCheckResult` [LimitCheckResult](#limitcheckresult) |
| `client.connectors.get_import()` | `ImportJob` [ImportJob](#importjob) |
| `client.connectors.import_()` | `ImportJob` [ImportJob](#importjob) |
| `client.connectors.validate()` | `ValidationResult` [ValidationResult](#validationresult) |
| `client.connectors.wait_for_import()` | `ImportJob` [ImportJob](#importjob) |
| `client.credits.balance()` | `CreditBalance` [CreditBalance](#creditbalance) |
| `client.credits.estimate()` | `CreditEstimate` [CreditEstimate](#creditestimate) |
| `client.credits.history()` | `list[CreditLedgerEntry]` |
| `client.credits.iter()` | `OffsetPager[CreditLedgerEntry]` |
| `client.credits.usage_by_operation()` | `UsageByOperation` |
| `client.datasets.archive()` | `Dataset` [Dataset](#dataset) |
| `client.datasets.as_pytorch()` | `PictographTorchDataset` |
| `client.datasets.create()` | `Dataset` [Dataset](#dataset) |
| `client.datasets.delete()` | `dict[str, Any]` |
| `client.datasets.download()` | `DownloadReport` |
| `client.datasets.freeze()` | `DatasetStorageTransition` [DatasetStorageTransition](#datasetstoragetransition) |
| `client.datasets.get()` | `Dataset` [Dataset](#dataset) |
| `client.datasets.insights()` | `DatasetInsights` [DatasetInsights](#datasetinsights) |
| `client.datasets.iter()` | `OffsetPager[Dataset]` [Dataset](#dataset) |
| `client.datasets.list()` | `list[Dataset]` [Dataset](#dataset) |
| `client.datasets.near_duplicates()` | `NearDuplicatesResult` [NearDuplicatesResult](#nearduplicatesresult) |
| `client.datasets.restore()` | `DatasetStorageTransition` [DatasetStorageTransition](#datasetstoragetransition) |
| `client.datasets.storage_status()` | `DatasetStorageStatus` [DatasetStorageStatus](#datasetstoragestatus) |
| `client.datasets.unarchive()` | `Dataset` [Dataset](#dataset) |
| `client.datasets.update()` | `Dataset` [Dataset](#dataset) |
| `client.datasets.wait_for_storage()` | `DatasetStorageStatus` [DatasetStorageStatus](#datasetstoragestatus) |
| `client.deployments.bulk_delete()` | `BulkDeleteResult` [BulkDeleteResult](#bulkdeleteresult) |
| `client.deployments.bulk_pause()` | `BulkActionResult` [BulkActionResult](#bulkactionresult) |
| `client.deployments.bulk_resume()` | `BulkActionResult` [BulkActionResult](#bulkactionresult) |
| `client.deployments.compute_options()` | `Sequence[DeploymentComputeOption]` |
| `client.deployments.connect()` | `DeploymentClient[Any]` |
| `client.deployments.create()` | `CreatedDeployment` [CreatedDeployment](#createddeployment) |
| `client.deployments.delete()` | `None` |
| `client.deployments.get()` | `Deployment` [Deployment](#deployment) |
| `client.deployments.iter()` | `OffsetPager[Deployment]` [Deployment](#deployment) |
| `client.deployments.list()` | `list[Deployment]` [Deployment](#deployment) |
| `client.deployments.pause()` | `Deployment` [Deployment](#deployment) |
| `client.deployments.quote()` | `DeploymentQuote` [DeploymentQuote](#deploymentquote) |
| `client.deployments.resume()` | `Deployment` [Deployment](#deployment) |
| `client.directories.create()` | `Directory` [Directory](#directory) |
| `client.directories.delete()` | `None` |
| `client.directories.list()` | `Sequence[Directory]` [Directory](#directory) |
| `client.directories.rename()` | `Directory` [Directory](#directory) |
| `client.directories.stats()` | `DirectoryStats` [DirectoryStats](#directorystats) |
| `client.directories.tree()` | `Sequence[DirectoryTreeNode]` |
| `client.exports.bulk_delete()` | `BulkDeleteResult` [BulkDeleteResult](#bulkdeleteresult) |
| `client.exports.create()` | `Export` [Export](#export) |
| `client.exports.delete()` | `None` |
| `client.exports.download()` | `Path` |
| `client.exports.download_by_id()` | `Path` |
| `client.exports.get()` | `Export` [Export](#export) |
| `client.exports.get_by_id()` | `Export` [Export](#export) |
| `client.exports.iter()` | `OffsetPager[Export]` [Export](#export) |
| `client.exports.list()` | `list[Export]` [Export](#export) |
| `client.exports.wait_for_completion()` | `Export` [Export](#export) |
| `client.images.assign_splits()` | `dict[str, int]` |
| `client.images.augment()` | `AugmentReport` [AugmentReport](#augmentreport) |
| `client.images.bulk_tag()` | `int` |
| `client.images.bulk_upload()` | `BulkUploadResult` |
| `client.images.delete()` | `None` |
| `client.images.download()` | `Path` |
| `client.images.download_bundle()` | `Path` |
| `client.images.get()` | `Image` [Image](#image) |
| `client.images.iter()` | `OffsetPager[Image]` [Image](#image) |
| `client.images.list()` | `list[Image]` [Image](#image) |
| `client.images.review()` | `ImageStatus` |
| `client.images.set_split()` | `ImageSplit` | `None` |
| `client.images.tile()` | `TileReport` [TileReport](#tilereport) |
| `client.images.upload()` | `Image` [Image](#image) |
| `client.images.upload_from_directory()` | `UploadReport` [UploadReport](#uploadreport) |
| `client.model_evaluations.cancel()` | `ModelEvaluation` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.create()` | `ModelEvaluation` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.evaluate()` | `ModelEvaluation` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.get()` | `ModelEvaluation` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.iter()` | `OffsetPager[ModelEvaluation]` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.list()` | `list[ModelEvaluation]` [ModelEvaluation](#modelevaluation) |
| `client.model_evaluations.wait_for_completion()` | `ModelEvaluation` [ModelEvaluation](#modelevaluation) |
| `client.models.bulk_delete()` | `BulkDeleteResult` [BulkDeleteResult](#bulkdeleteresult) |
| `client.models.delete()` | `None` |
| `client.models.download()` | `Path` |
| `client.models.download_file()` | `Path` |
| `client.models.files()` | `ModelFileManifest` [ModelFileManifest](#modelfilemanifest) |
| `client.models.fork()` | `Model` [Model](#model) |
| `client.models.get()` | `Model` [Model](#model) |
| `client.models.get_by_name()` | `Model` [Model](#model) |
| `client.models.iter()` | `OffsetPager[Model]` [Model](#model) |
| `client.models.list()` | `list[Model]` [Model](#model) |
| `client.models.load()` | `AnyModel` |
| `client.models.predict()` | `ModelPredictResult` [ModelPredictResult](#modelpredictresult) |
| `client.models.set_current_version()` | `ModelVersionsPayload` [ModelVersionsPayload](#modelversionspayload) |
| `client.models.update()` | `Model` [Model](#model) |
| `client.models.versions()` | `ModelVersionsPayload` [ModelVersionsPayload](#modelversionspayload) |
| `client.notifications.delete()` | `None` |
| `client.notifications.list()` | `list[Notification]` |
| `client.notifications.mark_all_read()` | `int` |
| `client.notifications.mark_read()` | `None` |
| `client.notifications.unread_count()` | `int` |
| `client.organizations.invite()` | `OrganizationInvite` [OrganizationInvite](#organizationinvite) |
| `client.organizations.list_invites()` | `list[OrganizationInvite]` [OrganizationInvite](#organizationinvite) |
| `client.organizations.list_members()` | `list[OrganizationMember]` |
| `client.organizations.me()` | `Organization` [Organization](#organization) |
| `client.organizations.remove_member()` | `None` |
| `client.organizations.revoke_invite()` | `None` |
| `client.organizations.update()` | `Organization` [Organization](#organization) |
| `client.organizations.update_member_role()` | `dict[str, Any]` |
| `client.search.by_similarity()` | `list[SimilarImage]` |
| `client.search.by_tag()` | `list[TaggedImage]` |
| `client.tasks.contributions()` | `TaskContributions` [TaskContributions](#taskcontributions) |
| `client.tasks.iter()` | `OffsetPager[Task]` |
| `client.tasks.list()` | `list[Task]` |
| `client.training.bulk_cancel()` | `BulkActionResult` [BulkActionResult](#bulkactionresult) |
| `client.training.cancel()` | `TrainingRun` [TrainingRun](#trainingrun) |
| `client.training.create()` | `TrainingRun` [TrainingRun](#trainingrun) |
| `client.training.get()` | `TrainingRun` [TrainingRun](#trainingrun) |
| `client.training.iter()` | `OffsetPager[TrainingRun]` [TrainingRun](#trainingrun) |
| `client.training.list()` | `list[TrainingRun]` [TrainingRun](#trainingrun) |
| `client.training.wait_for_completion()` | `TrainingRun` [TrainingRun](#trainingrun) |
| `client.video.extract_frames()` | `VideoExtractionJob` [VideoExtractionJob](#videoextractionjob) |
| `client.video.get_extraction()` | `VideoExtractionJob` [VideoExtractionJob](#videoextractionjob) |
| `client.video.probe()` | `VideoMetadata` [VideoMetadata](#videometadata) |
| `client.video.upload()` | `VideoUploadInfo` [VideoUploadInfo](#videouploadinfo) |
| `client.video.wait_for_extraction()` | `VideoExtractionJob` [VideoExtractionJob](#videoextractionjob) |
| `client.webhooks.create()` | `CreatedWebhookEndpoint` [CreatedWebhookEndpoint](#createdwebhookendpoint) |
| `client.webhooks.delete()` | `None` |
| `client.webhooks.deliveries()` | `Sequence[WebhookDelivery]` |
| `client.webhooks.event_types()` | `list[str]` |
| `client.webhooks.get()` | `WebhookEndpoint` [WebhookEndpoint](#webhookendpoint) |
| `client.webhooks.list()` | `Sequence[WebhookEndpoint]` [WebhookEndpoint](#webhookendpoint) |
| `client.webhooks.replay()` | `None` |
| `client.webhooks.rotate_secret()` | `CreatedWebhookEndpoint` [CreatedWebhookEndpoint](#createdwebhookendpoint) |
| `client.webhooks.test()` | `dict[str, Any]` |
| `client.webhooks.update()` | `WebhookEndpoint` [WebhookEndpoint](#webhookendpoint) |
| `client.workflows.bulk_cancel_runs()` | `BulkActionResult` [BulkActionResult](#bulkactionresult) |
| `client.workflows.bulk_delete()` | `BulkDeleteResult` [BulkDeleteResult](#bulkdeleteresult) |
| `client.workflows.cancel_run()` | `None` |
| `client.workflows.create()` | `Workflow` [Workflow](#workflow) |
| `client.workflows.delete()` | `None` |
| `client.workflows.get()` | `Workflow` [Workflow](#workflow) |
| `client.workflows.get_run()` | `WorkflowRun` [WorkflowRun](#workflowrun) |
| `client.workflows.list()` | `Sequence[Workflow]` [Workflow](#workflow) |
| `client.workflows.run()` | `WorkflowRunCreated` [WorkflowRunCreated](#workflowruncreated) |
| `client.workflows.update()` | `Workflow` [Workflow](#workflow) |
| `client.workflows.wait_for_run()` | `WorkflowRun` [WorkflowRun](#workflowrun) |

## Models

<details id="annotatereport">
<summary><code>AnnotateReport</code> &middot; 8 fields &middot; Outcome of an AutoAnnotate.dataset call.</summary>

```python
class AnnotateReport(BaseModel):
    dataset_name: str
    images_attempted: int = 0
    images_processed: int = 0
    images_skipped: int = 0
    images_capped: int = 0
    annotations_added: int = 0
    failures: list[AnnotationFailure] = []
    job_id: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/resources/auto_annotate.py#L83)

</details>

<details id="annotationcomment">
<summary><code>AnnotationComment</code> &middot; 11 fields &middot; One comment on an annotation.</summary>

```python
class AnnotationComment(BaseModel):
    id: str
    annotation_id: str
    body: str
    resolved: bool = False
    created_at: datetime | None = None
    updated_at: datetime | None = None
    user_id: str | None = None
    author_name: str | None = None
    author_username: str | None = None
    author_avatar_url: str | None = None
    is_mine: bool = False
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/annotation_comment.py#L15)

</details>

<details id="annotationimportreport">
<summary><code>AnnotationImportReport</code> &middot; 6 fields &middot; Outcome of an Annotations.import_coco / `import_pascal_voc` / `import_yolo` call.</summary>

```python
class AnnotationImportReport(BaseModel):
    dataset_name: str
    images_matched: int = 0
    images_saved: int = 0
    annotations_saved: int = 0
    unmatched_files: list[str] = []
    failures: list[AnnotationImportFailure] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/resources/annotations.py#L198)

</details>

<details id="apikey">
<summary><code>ApiKey</code> &middot; 10 fields &middot; API key metadata returned by list/get/update endpoints.</summary>

```python
class ApiKey(BaseModel):
    id: str
    organization_id: str
    name: str
    key_prefix: str
    role: Literal['viewer', 'member', 'admin', 'owner']
    rate_limit: int
    is_active: bool
    last_used_at: datetime | None = None
    expires_at: datetime | None = None
    created_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/api_key.py#L14)

</details>

<details id="augmentreport">
<summary><code>AugmentReport</code> &middot; 8 fields &middot; Outcome of an Images.augment run.</summary>

```python
class AugmentReport(BaseModel):
    source: str
    target: str
    source_images: int = 0
    originals_copied: int = 0
    variants_created: int = 0
    annotations_written: int = 0
    skipped_empty: int = 0
    failures: list[AugmentFailure] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/resources/images.py#L218)

</details>

<details id="batchjob">
<summary><code>BatchJob</code> &middot; 10 fields &middot; Snapshot of an auto-annotate batch job's progress.</summary>

```python
class BatchJob(BaseModel):
    job_id: str
    status: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
    progress: int = 0
    total_images: int = 0
    processed_images: int = 0
    total_annotations_added: int = 0
    failed_images: int = 0
    error_message: str | None = None
    estimated_credits: int | None = None
    completed_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/auto_annotate.py#L53)

</details>

<details id="batchquote">
<summary><code>BatchQuote</code> &middot; 8 fields &middot; What a batch job WOULD cost - the same deposit `batch()` would take.</summary>

```python
class BatchQuote(BaseModel):
    total_images: int
    estimated_credits: int
    sahi_tiles: int = 0
    containers: int = 0
    remaining_credits: int = 0
    sufficient: bool = True
    max_images: int = 5000
    exceeds_max_images: bool = False
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/auto_annotate.py#L116)

</details>

<details id="batchresult">
<summary><code>BatchResult</code> &middot; 6 fields &middot; Outcome of a batch operation.</summary>

```python
class BatchResult(BaseModel):
    success: bool
    processed: int
    failed: list[BatchFailure] = []
    affected_directories: list[str] = []
    renamed: int = 0
    operation: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/batch.py#L29)

</details>

<details id="bulkactionresult">
<summary><code>BulkActionResult</code> &middot; 3 fields &middot; Result of a server-side bulk state-change (e.g. pause/resume).</summary>

```python
class BulkActionResult(BaseModel):
    succeeded: list[str] = []
    not_found: list[str] = []
    count: int = 0
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/common.py#L102)

</details>

<details id="bulkdeleteresult">
<summary><code>BulkDeleteResult</code> &middot; 3 fields &middot; Result of a server-side bulk delete (one chunked, org-scoped call).</summary>

```python
class BulkDeleteResult(BaseModel):
    succeeded: list[str] = []
    not_found: list[str] = []
    count: int = 0
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/common.py#L68)

</details>

<details id="createdapikey">
<summary><code>CreatedApiKey</code> &middot; 8 fields &middot; Response from ApiKeys.create - includes the secret one time only.</summary>

```python
class CreatedApiKey(BaseModel):
    api_key: str
    key_id: str
    key_prefix: str
    name: str
    role: Literal['viewer', 'member', 'admin', 'owner']
    rate_limit: int
    expires_at: datetime | None = None
    created_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/api_key.py#L37)

</details>

<details id="createddeployment">
<summary><code>CreatedDeployment</code> &middot; 2 fields &middot; Create response - carries the one-time plaintext bearer token.</summary>

```python
class CreatedDeployment(BaseModel):
    deployment: Deployment
    auth_token: str
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/deployment.py#L46)

</details>

<details id="createdwebhookendpoint">
<summary><code>CreatedWebhookEndpoint</code> &middot; 2 fields &middot; Create / rotate response - carries the one-time signing secret.</summary>

```python
class CreatedWebhookEndpoint(BaseModel):
    endpoint: WebhookEndpoint
    secret: str
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/webhook.py#L42)

</details>

<details id="creditbalance">
<summary><code>CreditBalance</code> &middot; 11 fields &middot; Current compute-credit state for an organization (USD, stored as µUSD).</summary>

```python
class CreditBalance(BaseModel):
    included_allowance_micro_usd: int = 0
    included_remaining_micro_usd: int = 0
    budget_micro_usd: int = 0
    period_spend_micro_usd: int = 0
    period_overage_micro_usd: int = 0
    budget_remaining_micro_usd: int = 0
    period_start: datetime | None = None
    credits_reset_at: datetime | None = None
    credits_remaining: int = 0
    credits_monthly_allowance: int = 0
    recent_history: list[CreditLedgerEntry] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/credit.py#L65)

</details>

<details id="creditestimate">
<summary><code>CreditEstimate</code> &middot; 11 fields &middot; Estimated cost of a planned operation (USD, stored as µUSD), plus an affordability check.</summary>

```python
class CreditEstimate(BaseModel):
    operation: str
    unit: str
    quantity: int
    micro_usd_per_unit: int = 0
    total_micro_usd: int = 0
    remaining_micro_usd: int = 0
    sufficient: bool = False
    credits_per_unit: int = 0
    total_credits: int = 0
    minimum: int = 0
    credits_remaining: int = 0
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/credit.py#L160)

</details>

<details id="dataset">
<summary><code>Dataset</code> &middot; 17 fields &middot; A Pictograph dataset - a group of images sharing an annotation config.</summary>

```python
class Dataset(BaseModel):
    id: str
    organization_id: str | None = None
    name: str
    description: str | None = None
    annotation_types: list[str] = ['bbox']
    classes: list[DatasetClass] = []
    image_count: int = 0
    completed_image_count: int = 0
    archived_image_count: int = 0
    total_size: int = 0
    is_public: bool = False
    is_archived: bool = False
    archived_at: datetime | None = None
    storage_class: str = 'standard'
    images: list[Image] | None = None
    created_at: datetime
    updated_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/dataset.py#L87)

</details>

<details id="datasetinsights">
<summary><code>DatasetInsights</code> &middot; 13 fields &middot; Dataset Health / Insights - headline totals, class balance, and more.</summary>

```python
class DatasetInsights(BaseModel):
    total_images: int = 0
    total_annotations: int = 0
    annotated_images: int = 0
    unannotated_images: int = 0
    avg_annotations_per_image: float = 0.0
    total_bytes: int = 0
    status_counts: InsightsStatusCounts = InsightsStatusCounts(new=0, annotate=0, review=0, complete=0)
    class_annotation_counts: dict[str, int] = {}
    class_image_counts: dict[str, int] = {}
    type_counts: dict[str, int] = {}
    annotation_density: dict[str, int] = {}
    dimensions: InsightsDimensions = InsightsDimensions(min_width=None, max_width=None, avg_width=None, min_height=None, max_height=None, avg_height=None, orientation=InsightsOrientation(landscape=0, portrait=0, square=0), sizes=[], distinct_size_count=0, images_with_dimensions=0, images_missing_dimensions=0)
    model_confidence: ModelConfidence | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/insights.py#L93)

</details>

<details id="datasetstoragestatus">
<summary><code>DatasetStorageStatus</code> &middot; 7 fields &middot; Cold-storage state of a dataset (`GET /developer/datasets/{id}/storage`).</summary>

```python
class DatasetStorageStatus(BaseModel):
    storage_class: str = 'standard'
    storage_state: str = 'idle'
    cold_since: datetime | None = None
    cold_bytes: int = 0
    cold_image_count: int = 0
    storage_job_id: str | None = None
    restore_estimate: DatasetRestoreEstimate | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/dataset.py#L173)

</details>

<details id="datasetstoragetransition">
<summary><code>DatasetStorageTransition</code> &middot; 3 fields &middot; Acknowledgement that a freeze/restore background job started.</summary>

```python
class DatasetStorageTransition(BaseModel):
    job_id: str
    storage_state: str
    quoted_micro_usd: int | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/dataset.py#L194)

</details>

<details id="deployment">
<summary><code>Deployment</code> &middot; 19 fields &middot; A live (or provisioning) model inference deployment.</summary>

```python
class Deployment(BaseModel):
    id: str
    organization_id: str
    model_id: str
    name: str
    status: Literal['provisioning', 'active', 'paused', 'failed', 'terminated']
    compute_type: Literal['cpu', 'gpu']
    gpu_type: Optional[Literal['t4', 'l4', 'a10g', 'a100']] = None
    min_containers: int
    max_containers: int
    scaledown_window: int
    endpoint_url: str | None = None
    auth_token_prefix: str | None = None
    inference_config: dict[str, Any] = {}
    cost_rate_per_min: int = 0
    cost_per_hour: int | None = None
    accrued_cost_credits: int = 0
    uptime_seconds: int = 0
    created_at: datetime | None = None
    started_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/deployment.py#L20)

</details>

<details id="deploymentquote">
<summary><code>DeploymentQuote</code> &middot; 5 fields &middot; Cost quote for a deployment, before creating it. All amounts are already-marked-up micro-USD (1 USD = 1_000_000 µUSD).</summary>

```python
class DeploymentQuote(BaseModel):
    rate_per_min_micro_usd: int
    cost_per_hour_micro_usd: int
    cost_per_day_micro_usd: int
    scale_to_zero: bool
    billing_note: str
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/deployment.py#L57)

</details>

<details id="directory">
<summary><code>Directory</code> &middot; 10 fields &middot; A single virtual directory in a dataset.</summary>

```python
class Directory(BaseModel):
    id: str
    dataset_id: str
    organization_id: str | None = None
    name: str
    parent_directory_id: str | None = None
    full_path: str
    image_count: int = 0
    created_by: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/directory.py#L15)

</details>

<details id="directorystats">
<summary><code>DirectoryStats</code> &middot; 4 fields &middot; Aggregate image statistics for a directory (and, by default, its subdirectories).</summary>

```python
class DirectoryStats(BaseModel):
    total_directories: int
    total_images: int
    total_size_bytes: int
    directories_by_status: dict[str, int] = {}
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/directory.py#L51)

</details>

<details id="export">
<summary><code>Export</code> &middot; 17 fields &middot; A dataset export - produced asynchronously, downloaded as a ZIP.</summary>

```python
class Export(BaseModel):
    id: str
    dataset_id: str
    dataset_name: str
    name: str
    format: Literal['pictograph', 'darwin', 'coco', 'yolo', 'yolo_obb', 'yolo_pose', 'dota', 'pascal_voc', 'cvat', 'datumaro', 'labelme', 'csv']
    include_images: bool = False
    class_filter: list[str] | None = None
    status_filter: str | None = None
    status: Literal['pending', 'processing', 'completed', 'failed']
    error_message: str | None = None
    file_size: int | None = None
    image_count: int | None = None
    annotation_count: int | None = None
    created_at: datetime
    expires_at: datetime | None = None
    download_url: str | None = None
    organization_id: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/export.py#L36)

</details>

<details id="image">
<summary><code>Image</code> &middot; 18 fields &middot; An image within a Pictograph dataset.</summary>

```python
class Image(BaseModel):
    id: str
    dataset_id: str | None = None
    filename: str
    status: Literal['new', 'annotate', 'review', 'complete'] = 'new'
    split: Optional[Literal['train', 'val', 'test']] = None
    annotation_count: int = 0
    min_confidence: float | None = None
    file_size: int = 0
    width: int | None = None
    height: int | None = None
    content_type: str | None = None
    directory_path: str | None = None
    tags: list[str] = []
    is_archived: bool = False
    image_url: str | None = None
    thumbnail_url: str | None = None
    annotation_url: str | None = None
    created_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/image.py#L34)

</details>

<details id="importjob">
<summary><code>ImportJob</code> &middot; 8 fields &middot; Snapshot of an import operation - totals + per-dataset breakdown.</summary>

```python
class ImportJob(BaseModel):
    import_id: str
    status: Literal['processing', 'completed', 'error', 'cancelled']
    progress: float = 0.0
    total_images: int = 0
    imported_images: int = 0
    failed_images: int = 0
    current_dataset: str = ''
    datasets: list[DatasetImportProgress] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/connector.py#L92)

</details>

<details id="limitcheckresult">
<summary><code>LimitCheckResult</code> &middot; 8 fields &middot; Outcome of Connectors.check_limits.</summary>

```python
class LimitCheckResult(BaseModel):
    allowed: bool
    current_images: int
    image_limit: int
    images_after_import: int
    current_storage_bytes: int
    storage_limit_bytes: int
    storage_after_import_bytes: int
    exceeded: Optional[Literal['images', 'storage', 'both']] = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/connector.py#L56)

</details>

<details id="model">
<summary><code>Model</code> &middot; 17 fields &middot; A trained computer vision model.</summary>

```python
class Model(BaseModel):
    id: str
    organization_id: str
    name: str
    description: str | None = None
    model_type: Literal['object_detection', 'semantic_segmentation', 'instance_segmentation', 'classification', 'keypoint_detection']
    architecture: str | None = None
    visibility: Literal['private', 'public']
    status: Literal['training', 'ready', 'failed', 'archived']
    metrics: dict[str, Any] | None = None
    class_mapping: dict[str, Any] | None = None
    training_config: dict[str, Any] | None = None
    version: str = '1.0.0'
    parent_model_id: str | None = None
    forked_from_model_id: str | None = None
    precision: Literal['fp32', 'fp16'] = 'fp32'
    created_at: datetime
    updated_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/model.py#L33)

</details>

<details id="modelevaluation">
<summary><code>ModelEvaluation</code> &middot; 22 fields &middot; A model-evaluation run + its metric summary.</summary>

```python
class ModelEvaluation(BaseModel):
    id: str
    organization_id: str
    model_id: str
    dataset_id: str
    export_id: str | None = None
    status: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
    progress: int = 0
    iou_threshold: float = 0.5
    confidence_threshold: float = 0.5
    total_images: int = 0
    evaluated_images: int = 0
    failed_images: int = 0
    overall_metrics: EvalOverallMetrics | None = None
    per_class_metrics: list[EvalClassMetrics] | None = None
    confusion_matrix: EvalConfusionMatrix | None = None
    worst_images: list[EvalWorstImage] | None = None
    config: dict[str, Any] | None = None
    error_message: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None
    started_at: datetime | None = None
    completed_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/evaluation.py#L87)

</details>

<details id="modelfilemanifest">
<summary><code>ModelFileManifest</code> &middot; 3 fields &middot; A model's complete version + file manifest (`models.files`).</summary>

```python
class ModelFileManifest(BaseModel):
    versions: list[ModelVersionEntry] = []
    files: list[ModelFileEntry] = []
    pinned_version_id: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/model.py#L210)

</details>

<details id="modelpredictresult">
<summary><code>ModelPredictResult</code> &middot; 6 fields &middot; Result of a remote single-image test inference (`models.predict`).</summary>

```python
class ModelPredictResult(BaseModel):
    success: bool = True
    annotations: list[dict[str, Any]] = []
    tags: list[str] = []
    tag_scores: list[float] = []
    model_type: Optional[Literal['object_detection', 'semantic_segmentation', 'instance_segmentation', 'classification', 'keypoint_detection']] = None
    inference_seconds: float = 0.0
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/model.py#L90)

</details>

<details id="modelversionspayload">
<summary><code>ModelVersionsPayload</code> &middot; 4 fields &middot; `models.versions` - the version list plus promote state.</summary>

```python
class ModelVersionsPayload(BaseModel):
    versions: list[ModelVersionEntry] = []
    current_version_id: str | None = None
    pinned_version_id: str | None = None
    latest_version_id: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/model.py#L227)

</details>

<details id="nearduplicatesresult">
<summary><code>NearDuplicatesResult</code> &middot; 11 fields &middot; Near-duplicate clusters for a dataset + headline data-curation counts.</summary>

```python
class NearDuplicatesResult(BaseModel):
    groups: list[DuplicateGroup] = []
    group_count: int = 0
    duplicate_image_count: int = 0
    redundant_count: int = 0
    analyzed: int = 0
    total_images: int = 0
    sample_limit: int = 0
    sample_capped: bool = False
    pairs_capped: bool = False
    threshold: float = 0.0
    directory_path: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/near_duplicates.py#L40)

</details>

<details id="organization">
<summary><code>Organization</code> &middot; 16 fields &middot; Organization metadata + tier limits + credit balance.</summary>

```python
class Organization(BaseModel):
    id: str
    name: str
    slug: str
    description: str | None = None
    is_public: bool | None = None
    subscription_tier: Literal['free', 'core', 'pro', 'team', 'enterprise']
    credits_remaining: int
    credits_monthly_allowance: int
    credits_reset_at: datetime | None = None
    max_users: int
    max_images: int
    max_storage_bytes: int
    member_count: int
    pending_invite_count: int
    created_at: datetime
    updated_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/organization.py#L35)

</details>

<details id="organizationinvite">
<summary><code>OrganizationInvite</code> &middot; 8 fields &middot; A pending / accepted / expired / revoked invite.</summary>

```python
class OrganizationInvite(BaseModel):
    id: str
    organization_id: str
    email: str
    role: Literal['admin', 'member', 'viewer']
    status: Literal['pending', 'accepted', 'expired', 'revoked']
    invited_by: str | None = None
    expires_at: datetime
    created_at: datetime
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/organization.py#L81)

</details>

<details id="promptresult">
<summary><code>PromptResult</code> &middot; 4 fields &middot; Outcome of a single SAM3 prompt (point / box / text).</summary>

```python
class PromptResult(BaseModel):
    status: Literal['success', 'no_detection', 'below_threshold']
    annotations: list[Annotation] = []
    score: float | None = None
    inference_time: float | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/auto_annotate.py#L29)

</details>

<details id="taskcontributions">
<summary><code>TaskContributions</code> &middot; 6 fields &middot; Per-annotator contribution breakdown for a task, with rollup totals.</summary>

```python
class TaskContributions(BaseModel):
    task_id: str
    contributors: list[TaskContribution]
    contributor_count: int
    total_images: int
    images_complete: int
    total_active_seconds: int
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/task.py#L78)

</details>

<details id="tilereport">
<summary><code>TileReport</code> &middot; 7 fields &middot; Outcome of an Images.tile run.</summary>

```python
class TileReport(BaseModel):
    source: str
    target: str
    source_images: int = 0
    tiles_created: int = 0
    empty_tiles: int = 0
    annotations_written: int = 0
    failures: list[TileFailure] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/resources/images.py#L249)

</details>

<details id="trainingrun">
<summary><code>TrainingRun</code> &middot; 21 fields &middot; A single training job.</summary>

```python
class TrainingRun(BaseModel):
    id: str
    organization_id: str
    name: str
    dataset_id: str | None = None
    export_id: str | None = None
    model_id: str | None = None
    pipeline_type: Literal['yolox', 'sm_pytorch', 'classification', 'rfdetr_detection', 'rfdetr_segmentation', 'rfdetr_keypoint']
    gpu_type: Optional[Literal['a10g', 'a100', 'h100', 'auto']] = None
    status: Literal['pending', 'queued', 'running', 'completed', 'failed', 'cancelled']
    progress: int = 0
    current_epoch: int = 0
    total_epochs: int | None = None
    metrics: dict[str, Any] = {}
    config: dict[str, Any] = {}
    eta_seconds: int | None = None
    training_time_seconds: int | None = None
    error_message: str | None = None
    started_at: datetime | None = None
    completed_at: datetime | None = None
    created_at: datetime
    created_by: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/training.py#L47)

</details>

<details id="uploadreport">
<summary><code>UploadReport</code> &middot; 5 fields &middot; Outcome of an Images.upload_from_directory call.</summary>

```python
class UploadReport(BaseModel):
    dataset_name: str
    images_attempted: int = 0
    images_uploaded: int = 0
    images_skipped: int = 0
    failures: list[UploadFailure] = []
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/resources/images.py#L155)

</details>

<details id="validationresult">
<summary><code>ValidationResult</code> &middot; 4 fields &middot; Outcome of Connectors.validate.</summary>

```python
class ValidationResult(BaseModel):
    valid: bool
    workspace: str = ''
    datasets: list[RemoteDataset] = []
    error: str | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/connector.py#L41)

</details>

<details id="videoextractionjob">
<summary><code>VideoExtractionJob</code> &middot; 9 fields &middot; Snapshot of a frame-extraction job.</summary>

```python
class VideoExtractionJob(BaseModel):
    job_id: str
    status: Literal['processing', 'complete', 'failed']
    progress: int = 0
    frames_extracted: int = 0
    total_frames: int = 0
    error: str | None = None
    directory_path: str | None = None
    warning: str | None = None
    image_ids: list[str] | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/video.py#L43)

</details>

<details id="videometadata">
<summary><code>VideoMetadata</code> &middot; 5 fields &middot; Probe result for an uploaded video.</summary>

```python
class VideoMetadata(BaseModel):
    duration_seconds: float
    native_fps: float
    width: int
    height: int
    frame_count: int
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/video.py#L13)

</details>

<details id="videouploadinfo">
<summary><code>VideoUploadInfo</code> &middot; 3 fields &middot; Signed URL + temporary storage path returned by `upload-url`.</summary>

```python
class VideoUploadInfo(BaseModel):
    upload_url: str
    gcs_path: str
    gcs_uri: str
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/video.py#L28)

</details>

<details id="webhookendpoint">
<summary><code>WebhookEndpoint</code> &middot; 13 fields &middot; A registered outbound webhook destination.</summary>

```python
class WebhookEndpoint(BaseModel):
    id: str
    organization_id: str
    url: str
    description: str | None = None
    event_types: list[str] = []
    enabled: bool = True
    secret_version: int = 1
    secret_prefix: str | None = None
    consecutive_failures: int = 0
    disabled_reason: str | None = None
    auth_header_names: list[str] | None = None
    last_delivery_at: datetime | None = None
    created_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/webhook.py#L19)

</details>

<details id="workflow">
<summary><code>Workflow</code> &middot; 10 fields &middot; A saved node-graph workflow.</summary>

```python
class Workflow(BaseModel):
    id: str
    organization_id: str
    name: str
    description: str | None = None
    graph: dict[str, Any] = {}
    template_key: str | None = None
    status: Literal['draft', 'ready', 'archived'] = 'draft'
    last_run_id: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/workflow.py#L19)

</details>

<details id="workflowrun">
<summary><code>WorkflowRun</code> &middot; 16 fields &middot; One execution of a workflow over a source.</summary>

```python
class WorkflowRun(BaseModel):
    id: str
    organization_id: str
    workflow_id: str
    status: Literal['queued', 'processing', 'completed', 'error', 'cancelled']
    progress: float = 0.0
    frames_total: int | None = None
    frames_done: int = 0
    sample_fps: float | None = None
    step_results: dict[str, Any] = {}
    artifacts: list[dict[str, Any]] = []
    warnings: list[str] = []
    deposit_micro_usd: int = 0
    final_micro_usd: int | None = None
    error: str | None = None
    created_at: datetime | None = None
    completed_at: datetime | None = None
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/workflow.py#L36)

</details>

<details id="workflowruncreated">
<summary><code>WorkflowRunCreated</code> &middot; 2 fields &middot; Run response - the new run id + `deposit_micro_usd`, which is the un-charged pre-run ESTIMATE. Workflows bill ONCE, on success, from measured GPU time; a failed or cancelled run is free. The field name is kept for wire-compat.</summary>

```python
class WorkflowRunCreated(BaseModel):
    run_id: str
    deposit_micro_usd: int = 0
```

[Source](https://github.com/pictograph-io/pictograph-sdk/blob/v1.69.67/src/pictograph/models/workflow.py#L61)

</details>