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
}
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"
}
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"
}
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
}
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
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"
}
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"
}
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
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"
}
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"
}
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
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
}
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."
}
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"
}
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"
}
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
Schema of the request body
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"
}
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."
}
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
}
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``."
}
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
}
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``."
}
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
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
}
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``."
}
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 |