Skip to content

Product Ingest Endpoints

Product Ingest API endpoints.


Overview

Method Endpoint Description
POST /api/v1/product-ingest/capture-sessions Create Capture Session
GET /api/v1/product-ingest/capture-sessions/{session_id} Get Capture Session
POST /api/v1/product-ingest/capture-sessions/{session_id}/claim Claim Capture Session
POST /api/v1/product-ingest/capture-sessions/{session_id}/close Close Capture Session
POST /api/v1/product-ingest/drafts Upsert Product Draft
GET /api/v1/product-ingest/drafts List Product Drafts
PUT /api/v1/product-ingest/drafts/{draft_id} Update Product Draft
DELETE /api/v1/product-ingest/drafts/{draft_id} Discard Product Draft
POST /api/v1/product-ingest/drafts/{draft_id}/confirm Confirm Product Draft
POST /api/v1/product-ingest/drafts/{draft_id}/split Split Product Draft

API Reference

Sartiq Backend Server - Product Ingest 0.1.0

product-ingest


POST /api/v1/product-ingest/drafts

Upsert Product Draft

Description

Agent proposal, upserted idempotently on (job_id, group_key).

Publishes product_draft.created to the job's organization.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No

Request body

{
    "group_key": "string",
    "payload": {},
    "media": [
        {
            "object_key": "string",
            "role": "front",
            "confidence": null
        }
    ],
    "rationale": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "group_key": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "title": "Group Key"
        },
        "payload": {
            "additionalProperties": true,
            "type": "object",
            "title": "Payload"
        },
        "media": {
            "items": {
                "$ref": "#/components/schemas/DraftMediaItem"
            },
            "type": "array",
            "minItems": 1,
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string",
                    "maxLength": 4000
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        }
    },
    "type": "object",
    "required": [
        "group_key",
        "media"
    ],
    "title": "ProductDraftUpsert",
    "description": "Agent proposal, upserted on ``(job_id, group_key)``."
}

Responses

{
    "id": "ab17177a-6ed7-4c5e-acc8-d57886a5ab51",
    "organization_id": "ce2bbed5-7b2c-45bb-b0e3-efe12a9bb431",
    "job_id": "4d772a03-6298-4d0e-8bb8-aa9b42ead964",
    "group_key": "string",
    "payload": {},
    "media": [
        {
            "object_key": "string",
            "role": "front",
            "confidence": null
        }
    ],
    "rationale": null,
    "status": "PROPOSED",
    "discard_reason": null,
    "created_by": "6933e3ed-143f-4485-b9e2-fc0536d9fde5",
    "requested_by": "91a3559a-eb9d-4a1d-a1bb-49a83f0a585b",
    "product_id": null,
    "created_at": "2022-04-13T15:42:05.901Z",
    "updated_at": "2022-04-13T15:42:05.901Z"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "organization_id": {
            "type": "string",
            "format": "uuid",
            "title": "Organization Id"
        },
        "job_id": {
            "type": "string",
            "format": "uuid",
            "title": "Job Id"
        },
        "group_key": {
            "type": "string",
            "title": "Group Key"
        },
        "payload": {
            "additionalProperties": true,
            "type": "object",
            "title": "Payload"
        },
        "media": {
            "items": {
                "$ref": "#/components/schemas/DraftMediaItem"
            },
            "type": "array",
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        },
        "status": {
            "$ref": "#/components/schemas/ProductDraftStatus"
        },
        "discard_reason": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Discard Reason"
        },
        "created_by": {
            "type": "string",
            "format": "uuid",
            "title": "Created By"
        },
        "requested_by": {
            "type": "string",
            "format": "uuid",
            "title": "Requested By"
        },
        "product_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Product Id"
        },
        "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
        },
        "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
        }
    },
    "type": "object",
    "required": [
        "id",
        "organization_id",
        "job_id",
        "group_key",
        "payload",
        "media",
        "status",
        "created_by",
        "requested_by",
        "created_at",
        "updated_at"
    ],
    "title": "ProductDraftPublic"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

GET /api/v1/product-ingest/drafts

List Product Drafts

Description

Operator browse of proposed drafts.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
job_id query No
limit query integer 100 No
organization_id query No
skip query integer 0 No
status query No

Responses

{
    "data": [
        {
            "id": "5fb20730-aa63-4d94-ade0-391475947f3c",
            "organization_id": "ad2f1e7e-628e-40b5-a8bc-43ebff183bba",
            "job_id": "686e08bb-6ed9-4d69-9dff-715a4a1f76c3",
            "group_key": "string",
            "payload": {},
            "media": [
                {
                    "object_key": "string",
                    "role": "front",
                    "confidence": null
                }
            ],
            "rationale": null,
            "status": "PROPOSED",
            "discard_reason": null,
            "created_by": "2da25f78-3d41-4031-b5be-5692f5ec5f83",
            "requested_by": "1b9cb666-cfd2-412f-9afa-98bec78cab87",
            "product_id": null,
            "created_at": "2022-04-13T15:42:05.901Z",
            "updated_at": "2022-04-13T15:42:05.901Z"
        }
    ],
    "count": 0
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "data": {
            "items": {
                "$ref": "#/components/schemas/ProductDraftPublic"
            },
            "type": "array",
            "title": "Data"
        },
        "count": {
            "type": "integer",
            "title": "Count"
        }
    },
    "type": "object",
    "required": [
        "data",
        "count"
    ],
    "title": "ProductDraftsPublic"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

PUT /api/v1/product-ingest/drafts/{draft_id}

Update Product Draft

Description

Operator edit of payload/media before confirm.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
draft_id path string No

Request body

{
    "payload": null,
    "media": null,
    "rationale": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "payload": {
            "anyOf": [
                {
                    "additionalProperties": true,
                    "type": "object"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Payload"
        },
        "media": {
            "anyOf": [
                {
                    "items": {
                        "$ref": "#/components/schemas/DraftMediaItem"
                    },
                    "type": "array"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string",
                    "maxLength": 4000
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        }
    },
    "type": "object",
    "title": "ProductDraftUpdate",
    "description": "Operator edit before confirm (payload/media/rationale only)."
}

Responses

{
    "id": "c91d27ae-4451-42fb-b1df-654de6678d28",
    "organization_id": "c08304b3-c6e3-41a0-8f79-a65917c203ec",
    "job_id": "f1a3d47d-fad4-472d-b13a-968a8a03b044",
    "group_key": "string",
    "payload": {},
    "media": [
        {
            "object_key": "string",
            "role": "front",
            "confidence": null
        }
    ],
    "rationale": null,
    "status": "PROPOSED",
    "discard_reason": null,
    "created_by": "b8e3ecea-372d-4176-b2dc-d2dfe6bcce22",
    "requested_by": "8d74aee1-196d-41d3-9f8a-945345bde766",
    "product_id": null,
    "created_at": "2022-04-13T15:42:05.901Z",
    "updated_at": "2022-04-13T15:42:05.901Z"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "organization_id": {
            "type": "string",
            "format": "uuid",
            "title": "Organization Id"
        },
        "job_id": {
            "type": "string",
            "format": "uuid",
            "title": "Job Id"
        },
        "group_key": {
            "type": "string",
            "title": "Group Key"
        },
        "payload": {
            "additionalProperties": true,
            "type": "object",
            "title": "Payload"
        },
        "media": {
            "items": {
                "$ref": "#/components/schemas/DraftMediaItem"
            },
            "type": "array",
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        },
        "status": {
            "$ref": "#/components/schemas/ProductDraftStatus"
        },
        "discard_reason": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Discard Reason"
        },
        "created_by": {
            "type": "string",
            "format": "uuid",
            "title": "Created By"
        },
        "requested_by": {
            "type": "string",
            "format": "uuid",
            "title": "Requested By"
        },
        "product_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Product Id"
        },
        "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
        },
        "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
        }
    },
    "type": "object",
    "required": [
        "id",
        "organization_id",
        "job_id",
        "group_key",
        "payload",
        "media",
        "status",
        "created_by",
        "requested_by",
        "created_at",
        "updated_at"
    ],
    "title": "ProductDraftPublic"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

DELETE /api/v1/product-ingest/drafts/{draft_id}

Discard Product Draft

Description

Soft discard with a reason; the draft's photos are safe-deleted from storage (the row survives as the audit trail).

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
draft_id path string No

Request body

{
    "reason": "string"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "reason": {
            "type": "string",
            "maxLength": 2000,
            "title": "Reason",
            "default": ""
        }
    },
    "type": "object",
    "title": "ProductDraftDiscardRequest"
}

Responses

{
    "id": "79fddc2b-4895-4980-8ce9-8dbcb0c28cd2",
    "organization_id": "030234f1-c2ff-43f0-86d3-1a8ce3011cef",
    "job_id": "5457f91f-a073-4ef7-aa43-a4bc18510613",
    "group_key": "string",
    "payload": {},
    "media": [
        {
            "object_key": "string",
            "role": "front",
            "confidence": null
        }
    ],
    "rationale": null,
    "status": "PROPOSED",
    "discard_reason": null,
    "created_by": "54a735a5-3846-4360-a735-4c5969747142",
    "requested_by": "52c4e721-6293-437c-a477-8ce2f9221d99",
    "product_id": null,
    "created_at": "2022-04-13T15:42:05.901Z",
    "updated_at": "2022-04-13T15:42:05.901Z"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "organization_id": {
            "type": "string",
            "format": "uuid",
            "title": "Organization Id"
        },
        "job_id": {
            "type": "string",
            "format": "uuid",
            "title": "Job Id"
        },
        "group_key": {
            "type": "string",
            "title": "Group Key"
        },
        "payload": {
            "additionalProperties": true,
            "type": "object",
            "title": "Payload"
        },
        "media": {
            "items": {
                "$ref": "#/components/schemas/DraftMediaItem"
            },
            "type": "array",
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        },
        "status": {
            "$ref": "#/components/schemas/ProductDraftStatus"
        },
        "discard_reason": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Discard Reason"
        },
        "created_by": {
            "type": "string",
            "format": "uuid",
            "title": "Created By"
        },
        "requested_by": {
            "type": "string",
            "format": "uuid",
            "title": "Requested By"
        },
        "product_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Product Id"
        },
        "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
        },
        "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
        }
    },
    "type": "object",
    "required": [
        "id",
        "organization_id",
        "job_id",
        "group_key",
        "payload",
        "media",
        "status",
        "created_by",
        "requested_by",
        "created_at",
        "updated_at"
    ],
    "title": "ProductDraftPublic"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /api/v1/product-ingest/drafts/{draft_id}/split

Split Product Draft

Description

Carve photos out of a draft into their own new product (operator only).

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
draft_id path string No

Request body

{
    "object_keys": [
        "string"
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "object_keys": {
            "items": {
                "type": "string"
            },
            "type": "array",
            "maxItems": 50,
            "minItems": 1,
            "title": "Object Keys"
        }
    },
    "type": "object",
    "required": [
        "object_keys"
    ],
    "title": "ProductDraftSplitRequest",
    "description": "Carve the given photos out of a draft into their own new sibling draft."
}

Responses

{
    "source": {
        "id": "c900c40f-74c2-4e68-ba1f-0100fe2b1ca7",
        "organization_id": "7b058cb2-1b83-4469-96e4-601f5c38f9a6",
        "job_id": "cb960798-b0e6-4e2f-8b07-ab2ad8b5c439",
        "group_key": "string",
        "payload": {},
        "media": [
            {
                "object_key": "string",
                "role": "front",
                "confidence": null
            }
        ],
        "rationale": null,
        "status": "PROPOSED",
        "discard_reason": null,
        "created_by": "6cb3bd98-946a-46b3-9407-ad8221b4e48d",
        "requested_by": "34c945b0-f5d5-4e3f-ab79-829bfca36978",
        "product_id": null,
        "created_at": "2022-04-13T15:42:05.901Z",
        "updated_at": "2022-04-13T15:42:05.901Z"
    },
    "created": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "source": {
            "$ref": "#/components/schemas/ProductDraftPublic"
        },
        "created": {
            "$ref": "#/components/schemas/ProductDraftPublic"
        }
    },
    "type": "object",
    "required": [
        "source",
        "created"
    ],
    "title": "ProductDraftSplitResult",
    "description": "The trimmed source draft plus the newly-created split-off draft."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /api/v1/product-ingest/drafts/{draft_id}/confirm

Confirm Product Draft

Description

Create the REAL product from a draft (operator only, atomic with media).

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
draft_id path string No

Responses

{
    "id": "c70a833b-347c-439c-bec7-696f2bc25ede",
    "organization_id": "ec356867-d5c8-450d-a7d6-68551830e270",
    "job_id": "9bbb30a0-e616-4fdd-8a45-1cc9c8de0be0",
    "group_key": "string",
    "payload": {},
    "media": [
        {
            "object_key": "string",
            "role": "front",
            "confidence": null
        }
    ],
    "rationale": null,
    "status": "PROPOSED",
    "discard_reason": null,
    "created_by": "2752eda6-72c4-46ef-9329-7879596e27af",
    "requested_by": "e0efbdb3-ed1f-49f6-bdcb-74c94e877e1b",
    "product_id": null,
    "created_at": "2022-04-13T15:42:05.901Z",
    "updated_at": "2022-04-13T15:42:05.901Z"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "organization_id": {
            "type": "string",
            "format": "uuid",
            "title": "Organization Id"
        },
        "job_id": {
            "type": "string",
            "format": "uuid",
            "title": "Job Id"
        },
        "group_key": {
            "type": "string",
            "title": "Group Key"
        },
        "payload": {
            "additionalProperties": true,
            "type": "object",
            "title": "Payload"
        },
        "media": {
            "items": {
                "$ref": "#/components/schemas/DraftMediaItem"
            },
            "type": "array",
            "title": "Media"
        },
        "rationale": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Rationale"
        },
        "status": {
            "$ref": "#/components/schemas/ProductDraftStatus"
        },
        "discard_reason": {
            "anyOf": [
                {
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Discard Reason"
        },
        "created_by": {
            "type": "string",
            "format": "uuid",
            "title": "Created By"
        },
        "requested_by": {
            "type": "string",
            "format": "uuid",
            "title": "Requested By"
        },
        "product_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Product Id"
        },
        "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
        },
        "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
        }
    },
    "type": "object",
    "required": [
        "id",
        "organization_id",
        "job_id",
        "group_key",
        "payload",
        "media",
        "status",
        "created_by",
        "requested_by",
        "created_at",
        "updated_at"
    ],
    "title": "ProductDraftPublic"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /api/v1/product-ingest/capture-sessions

Create Capture Session

Description

Operator mints a WAITING session + the QR's upload-only token (24h).

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
organization_id query No

Request body

{
    "station_label": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "station_label": {
            "anyOf": [
                {
                    "type": "string",
                    "maxLength": 255
                },
                {
                    "type": "null"
                }
            ],
            "title": "Station Label"
        }
    },
    "type": "object",
    "title": "CaptureSessionCreate",
    "description": "Operator mint request. ``station_label`` is an optional human label."
}

Responses

{
    "id": "8c9db341-2a67-4752-820b-f5e2ec35394a",
    "drop_id": "2c557808-562b-41f0-89c9-bb389e277eb1",
    "status": "WAITING",
    "shot_count": 0,
    "expires_at": "2022-04-13T15:42:05.901Z",
    "join_token": "string",
    "join_path": "string"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "drop_id": {
            "type": "string",
            "format": "uuid",
            "title": "Drop Id"
        },
        "status": {
            "$ref": "#/components/schemas/CaptureSessionStatus"
        },
        "shot_count": {
            "type": "integer",
            "title": "Shot Count",
            "default": 0
        },
        "expires_at": {
            "type": "string",
            "format": "date-time",
            "title": "Expires At"
        },
        "join_token": {
            "type": "string",
            "title": "Join Token"
        },
        "join_path": {
            "type": "string",
            "title": "Join Path"
        }
    },
    "type": "object",
    "required": [
        "id",
        "drop_id",
        "status",
        "expires_at",
        "join_token",
        "join_path"
    ],
    "title": "CaptureSessionCreatePublic",
    "description": "Mint result: the session plus everything the laptop needs to render a QR.\n\n``join_token`` is the upload-only capture-session token (24h). ``join_path``\nis a HOST-RELATIVE webapp path the operator encodes into the QR; the caller\nprepends its own origin. The token is returned separately too, so a client\nthat builds its own URL never has to parse it back out of the path."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

GET /api/v1/product-ingest/capture-sessions/{session_id}

Get Capture Session

Description

Operator polls a session's honest live status (membership-scoped).

status/shot_count/last_shot_at are derived from the drop's real ingest jobs; EXPIRED is computed from expires_at.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
session_id path string No

Responses

{
    "id": "61bb2fd1-832e-4ac0-aa54-7273059faf8c",
    "drop_id": "38d4e698-6fe1-4765-af83-6f0a3cd7b01c",
    "status": "WAITING",
    "shot_count": 0,
    "last_shot_at": null,
    "claimed_at": null,
    "expires_at": "2022-04-13T15:42:05.901Z",
    "job_id": null,
    "job_status": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "drop_id": {
            "type": "string",
            "format": "uuid",
            "title": "Drop Id"
        },
        "status": {
            "$ref": "#/components/schemas/CaptureSessionDerivedStatus"
        },
        "shot_count": {
            "type": "integer",
            "title": "Shot Count"
        },
        "last_shot_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Last Shot At"
        },
        "claimed_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Claimed At"
        },
        "expires_at": {
            "type": "string",
            "format": "date-time",
            "title": "Expires At"
        },
        "job_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Job Id"
        },
        "job_status": {
            "anyOf": [
                {
                    "$ref": "#/components/schemas/AgentJobStatus"
                },
                {
                    "type": "null"
                }
            ]
        }
    },
    "type": "object",
    "required": [
        "id",
        "drop_id",
        "status",
        "shot_count",
        "expires_at"
    ],
    "title": "CaptureSessionStatusPublic",
    "description": "Honest live status of a session, derived from the drop's ingest jobs.\n\n``status`` becomes CONNECTED once the phone claims the session OR the first\nshot lands; EXPIRED is computed when ``now > expires_at``. ``shot_count`` is\nthe total manifest items across the ingest jobs of this session's\n``drop_id``; ``last_shot_at`` is the newest such job's ``created_at``."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /api/v1/product-ingest/capture-sessions/{session_id}/close

Close Capture Session

Description

End the session (CLOSED). Idempotent.

Either the operator (their token, membership-scoped) OR the phone itself (its capture-session token) can end it, so the on-set person can finish from the device in their hand instead of walking back to the laptop.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
session_id path string No

Responses

{
    "id": "971b9842-11a7-41ef-b344-19b76ee1c46f",
    "drop_id": "82fcf2f8-463f-4e20-8086-37d7a0b682be",
    "status": "WAITING",
    "shot_count": 0,
    "last_shot_at": null,
    "claimed_at": null,
    "expires_at": "2022-04-13T15:42:05.901Z",
    "job_id": null,
    "job_status": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "drop_id": {
            "type": "string",
            "format": "uuid",
            "title": "Drop Id"
        },
        "status": {
            "$ref": "#/components/schemas/CaptureSessionDerivedStatus"
        },
        "shot_count": {
            "type": "integer",
            "title": "Shot Count"
        },
        "last_shot_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Last Shot At"
        },
        "claimed_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Claimed At"
        },
        "expires_at": {
            "type": "string",
            "format": "date-time",
            "title": "Expires At"
        },
        "job_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Job Id"
        },
        "job_status": {
            "anyOf": [
                {
                    "$ref": "#/components/schemas/AgentJobStatus"
                },
                {
                    "type": "null"
                }
            ]
        }
    },
    "type": "object",
    "required": [
        "id",
        "drop_id",
        "status",
        "shot_count",
        "expires_at"
    ],
    "title": "CaptureSessionStatusPublic",
    "description": "Honest live status of a session, derived from the drop's ingest jobs.\n\n``status`` becomes CONNECTED once the phone claims the session OR the first\nshot lands; EXPIRED is computed when ``now > expires_at``. ``shot_count`` is\nthe total manifest items across the ingest jobs of this session's\n``drop_id``; ``last_shot_at`` is the newest such job's ``created_at``."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /api/v1/product-ingest/capture-sessions/{session_id}/claim

Claim Capture Session

Description

The phone claims the session (capture-session token). Single-claim.

The token must be scoped to this exact session; a different device claiming an already-claimed session gets a 409, the same device is idempotent.

Input parameters

Parameter In Type Default Nullable Description
OAuth2PasswordBearer header string N/A No
session_id path string No

Request body

{
    "device_id": "string"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the request body
{
    "properties": {
        "device_id": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "title": "Device Id"
        }
    },
    "type": "object",
    "required": [
        "device_id"
    ],
    "title": "CaptureSessionClaimRequest",
    "description": "The phone's claim. ``device_id`` is an opaque per-device id the phone\ngenerates and reuses across retries — the single-claim key (the QR token is\nshared, so two phones would carry the same token)."
}

Responses

{
    "id": "798afb1f-b3a1-4d6f-982a-ca42e3a1b335",
    "drop_id": "07d619be-73f4-47b1-961a-b00f8e4bac4d",
    "status": "WAITING",
    "shot_count": 0,
    "last_shot_at": null,
    "claimed_at": null,
    "expires_at": "2022-04-13T15:42:05.901Z",
    "job_id": null,
    "job_status": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
        },
        "drop_id": {
            "type": "string",
            "format": "uuid",
            "title": "Drop Id"
        },
        "status": {
            "$ref": "#/components/schemas/CaptureSessionDerivedStatus"
        },
        "shot_count": {
            "type": "integer",
            "title": "Shot Count"
        },
        "last_shot_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Last Shot At"
        },
        "claimed_at": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "date-time"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Claimed At"
        },
        "expires_at": {
            "type": "string",
            "format": "date-time",
            "title": "Expires At"
        },
        "job_id": {
            "anyOf": [
                {
                    "type": "string",
                    "format": "uuid"
                },
                {
                    "type": "null"
                }
            ],
            "title": "Job Id"
        },
        "job_status": {
            "anyOf": [
                {
                    "$ref": "#/components/schemas/AgentJobStatus"
                },
                {
                    "type": "null"
                }
            ]
        }
    },
    "type": "object",
    "required": [
        "id",
        "drop_id",
        "status",
        "shot_count",
        "expires_at"
    ],
    "title": "CaptureSessionStatusPublic",
    "description": "Honest live status of a session, derived from the drop's ingest jobs.\n\n``status`` becomes CONNECTED once the phone claims the session OR the first\nshot lands; EXPIRED is computed when ``now > expires_at``. ``shot_count`` is\nthe total manifest items across the ingest jobs of this session's\n``drop_id``; ``last_shot_at`` is the newest such job's ``created_at``."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

Schemas

AgentJobStatus

Type: string

CaptureSessionClaimRequest

Name Type Description
device_id string

CaptureSessionCreate

Name Type Description
station_label

CaptureSessionCreatePublic

Name Type Description
drop_id string(uuid)
expires_at string(date-time)
id string(uuid)
join_path string
join_token string
shot_count integer
status CaptureSessionStatus

CaptureSessionDerivedStatus

Type: string

CaptureSessionStatus

Type: string

CaptureSessionStatusPublic

Name Type Description
claimed_at
drop_id string(uuid)
expires_at string(date-time)
id string(uuid)
job_id
job_status
last_shot_at
shot_count integer
status CaptureSessionDerivedStatus

DraftMediaItem

Name Type Description
confidence
object_key string
role DraftMediaRole

DraftMediaRole

Type: string

HTTPValidationError

Name Type Description
detail Array<ValidationError>

ProductDraftDiscardRequest

Name Type Description
reason string

ProductDraftPublic

Name Type Description
created_at string(date-time)
created_by string(uuid)
discard_reason
group_key string
id string(uuid)
job_id string(uuid)
media Array<DraftMediaItem>
organization_id string(uuid)
payload
product_id
rationale
requested_by string(uuid)
status ProductDraftStatus
updated_at string(date-time)

ProductDraftSplitRequest

Name Type Description
object_keys Array<string>

ProductDraftSplitResult

Name Type Description
created ProductDraftPublic
source ProductDraftPublic

ProductDraftsPublic

Name Type Description
count integer
data Array<ProductDraftPublic>

ProductDraftStatus

Type: string

ProductDraftUpdate

Name Type Description
media
payload
rationale

ProductDraftUpsert

Name Type Description
group_key string
media Array<DraftMediaItem>
payload
rationale

ValidationError

Name Type Description
ctx
input
loc Array<>
msg string
type string

Security schemes

Name Type Scheme Description
OAuth2PasswordBearer oauth2