Photos are the core asset in Shootbin. The photos API covers the full lifecycle: uploading originals, listing albums with cursor-based pagination, fetching individual photo details, and toggling approval state. Uploads follow the same storage and web-variant generation pipeline as the Shootbin web app, including optional watermarking.Documentation Index
Fetch the complete documentation index at: https://docs.shootbin.com/llms.txt
Use this file to discover all available pages before exploring further.
Uploading photos and updating approval state both require specific token scopes. Read operations (list, get) are available to any token that is a project member.
List photos in an album
Returns photos in an album using cursor-based pagination, ordered newest first.Path parameters
The project ID.
The album ID.
Query parameters
Number of photos to return per page. Default is
50. Maximum is 100.Opaque cursor value from the
next_cursor field of a previous response. Omit on the first request.Example request
next_cursor value from the previous response:
Example response
The
photos key is a backward-compatible alias for data. New integrations should read from data. Both keys contain the same array.Response fields
Array of photo objects for the current page.
Encoded cursor for the next page. Pass this as the
cursor query parameter on your next request. null when there are no more pages.true if there are additional pages of results.The
per_page value that was used for this response.Upload a photo
Uploads a new photo to an album. The file goes through the same storage pipeline as the web UI, including web variant generation and watermarking if configured on the project owner’s account.Path parameters
The project ID.
The album ID.
Request body
Send asmultipart/form-data:
The image file to upload. Must be a valid image. Maximum size: 10 MB.
A display title for the photo. If omitted, the original filename (without extension) is used.
An optional description.
Override the filename stored as
original_filename. Useful when your HTTP client changes the filename during upload (e.g. temporary file paths). When omitted, the filename reported by the upload is used.Example request
Example response
201 Created
Get a single photo
Returns the full payload for one photo, including its annotations and revision history.Path parameters
The project ID.
The album ID.
The photo ID.
Example request
Example response
Response fields
The photo’s unique ID.
The original filename of the uploaded file as it was named on disk. For example
IMG_4821.CR3. This is preserved from upload and also tracked on each archived revision.ISO 8601 timestamp of when the photo was approved.
null if not yet approved.The URL of the web-optimized variant served by the Shootbin delivery layer. This URL is protected and may be time-limited depending on your storage configuration.
Previously uploaded versions of this photo, archived when a new revision was pushed.
Active annotations on the current version of the photo. Annotations from previous revisions are archived in
revisions[].archived_annotations_count.Update a photo
Updates mutable properties of a photo. The most common use case is setting the approval state.Path parameters
The project ID.
The album ID.
The photo ID.
Request body
Set to
true to approve the photo, false to remove approval.Update the photo title. Owner only.
Update the photo description. Owner only. Pass
null to clear.Replace the photo’s tag list with a new array of strings. Owner only. Each tag is a string up to 100 characters.
Example: approve a photo
Example: unapprove a photo
Errors
| Status | Reason |
|---|---|
403 | Token lacks update scope, or non-owner attempting to edit title/description/tags |
422 | Approval rejected because the project’s photo selection limit has been reached |
If the project has a photo selection package with a photo limit configured, approving a photo that would exceed that limit returns a
422 with an approved field error specifying the limit.