Overview
All search and photo endpoints share the unified envelope{ responseType, message, data } documented in Conventions. The endpoint-specific payload always lives inside data — for photo and BIB search this is images[] plus pagination; for face search and video clipping it also includes request_id and the relevant search/job state.
Shared Photo Data Shape
Photo list, BIB search, and face search responses all carry the samedata payload (images[] + pagination). Face search additionally includes request_id and confidence_percentage inside data.
| Field | Type | Description |
|---|---|---|
images | array | List of ImageItem objects. |
pagination | object | PaginationInfo metadata. |
AllPhotosResponse
Returned by All Photos.| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. See Conventions. |
message | string | Human-readable status message. |
data.images | array | List of ImageItem objects. |
data.pagination | object | PaginationInfo metadata. |
BibSearchResponse
Returned by BIB Search.| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message. |
data.images | array | List of ImageItem objects. |
data.pagination | object | PaginationInfo metadata. |
FaceSearchResponse
Returned by Face Search (both POST and GET). Therequest_id and confidence_percentage are nested inside data so the envelope stays uniform across all endpoints.
| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message. |
data.request_id | string | Request UUID associated with the search. See request_id idempotency. |
data.confidence_percentage | number | null | Confidence threshold used to filter face matches. May be null when no threshold is configured. |
data.images | array | List of ImageItem objects. |
data.pagination | object | PaginationInfo metadata. |
TimelineDaysResponse
Returned byGET /timeline/days (see Photo Timeline). Days are ordered ascending by date and hours[] is ordered ascending by hour.
| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message. |
data.days | array | List of TimelineDayItem objects. |
TimelineDayItem
Each entry insidedata.days[] for GET /timeline/days.
| Field | Type | Description |
|---|---|---|
date | string | UTC calendar date in YYYY-MM-DD format. |
total | number | Total photos captured on this date. |
hours | array | List of TimelineHourBucket entries ordered by ascending hour. |
TimelineHourBucket
Each entry insidedata.days[].hours[] for GET /timeline/days.
| Field | Type | Description |
|---|---|---|
hour | number | Hour of the day in UTC (0–23). |
count | number | Number of photos captured in this hour. |
TimelineImagesResponse
Returned byGET /timeline/images (see Photo Timeline). Reuses the shared photo data shape (images[] + pagination) ordered by ascending capture timestamp.
| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message. |
data.images | array | List of ImageItem objects. |
data.pagination | object | PaginationInfo metadata. |
VideoClippingStartResponse
Returned byPOST /video-clipping/search-by-selfie (see Video Clipping Search). The status is always processing on success — use the GET endpoint to wait for the terminal status.
| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message describing what happens next. |
data.status | string | Always "processing" when the request was accepted. |
data.request_id | string | UUID for this video clipping search. Reuse with the GET endpoint and to download the resulting clips. |
VideoClippingResultResponse
Returned byGET /video-clipping/{request_id} (see Video Clipping Search).
| Field | Type | Description |
|---|---|---|
responseType | string | Always "success" for 2xx responses. |
message | string | Human-readable status message. |
data.request_id | string | Request UUID echoed from the original POST. |
data.status | string | One of processing, completed, no_matches, no_segments, clip_failed, failed. |
data.videos | array | List of VideoClipItem objects. Empty until status is completed. |
data.error | string | null | Top-level error message when the job fails before any clips are generated (status failed). |
data.clip_errors | array | List of VideoClipErrorItem. Populated for clip_failed and partially-failed completed results. |
VideoClipItem
Each entry insidedata.videos[] returned by GET /video-clipping/{request_id} when status is completed.
| Field | Type | Description |
|---|---|---|
uuid | string | Unique identifier for the generated video clip. |
video_url | string | Public URL where the clipped MP4 can be downloaded or streamed. |
source_video_key | string | null | Identifier of the configured event video source this clip was extracted from. |
start_time | string | null | Clip start timestamp inside the source video (HH:MM:SS). |
end_time | string | null | Clip end timestamp inside the source video (HH:MM:SS). |
VideoClipErrorItem
Each entry insidedata.clip_errors[] when the clipping service rejected one or more segments.
| Field | Type | Description |
|---|---|---|
video_key | string | null | Identifier of the event video source that failed to be clipped. |
error | string | null | Human-readable error message returned by the clipping service. |
status_code | number | null | HTTP status code returned by the clipping service, if any. |
Used By
| Model | Endpoint |
|---|---|
AllPhotosResponse | All Photos |
BibSearchResponse | BIB Search |
FaceSearchResponse | Face Search (POST and GET) |
TimelineDaysResponse | Photo Timeline — GET /timeline/days |
TimelineDayItem | Inside TimelineDaysResponse.data.days[] |
TimelineHourBucket | Inside TimelineDaysResponse.data.days[].hours[] |
TimelineImagesResponse | Photo Timeline — GET /timeline/images |
VideoClippingStartResponse | Video Clipping Search — POST |
VideoClippingResultResponse | Video Clipping Search — GET |
VideoClipItem | Inside VideoClippingResultResponse.data.videos[] |
VideoClipErrorItem | Inside VideoClippingResultResponse.data.clip_errors[] |

