Studio projects API
Base URL: https://YOUR-SERVER/api. Send your API key in x-api-key where authentication is required. A key also needs the listed permission; your account's access rules still apply.
API guide · All endpoints · OpenAPI JSON
GET /photography/galleries/{id}— photographyGalleryPOST /photography/galleries/{id}/approve— photographyApprovePUT /photography/galleries/{id}/choices— photographyChoicesGET /photography/galleries/{id}/logo— photographyLogoPOST /photography/galleries/{id}/orders/{orderId}/accept— photographyAcceptPOST /photography/galleries/{id}/orders/{orderId}/checkout— photographyCheckoutGET /photography/galleries/{id}/photos/{captureId}/outputs/{outputId}— photographyOutputGET /photography/galleries/{id}/photos/{captureId}/outputs/{outputId}/preview— photographyOutputPreviewGET /photography/galleries/{id}/photos/{captureId}/{kind}— photographyFilePOST /photography/galleries/{id}/session— photographySessionPOST /photography/galleries/{id}/submit— photographySubmitPOST /photography/galleries/{id}/zip— photographyZipGET /photography/galleries/{id}/zip/{zipId}— photographyArchivePOST /photography/payments/stripe— photographyCallbackGET /photography/presets— photographyStudioPresetsPOST /photography/presets— photographySaveStudioPresetGET /photography/shoots— Read your private shootsPUT /photography/shoots— Save your shoots using the loaded revisionGET /photography/shoots/branding— Read your private studio brandingPUT /photography/shoots/branding— Save private studio branding with the workspace revisionGET /photography/shoots/branding/logos— List your eligible unlocked studio logo imagesGET /photography/shoots/branding/logos/{id}/thumbnail— View an eligible owned logo thumbnail without original metadataPOST /photography/shoots/branding/preview— Preview a watermark using the production font metrics and rendererGET /photography/shoots/{id}/photos— Read a page of unlocked shoot photosPATCH /photography/shoots/{id}/rating— Rate or reject an owned photo in your shootGET /photography/site— photographySitePUT /photography/site— photographySaveSiteGET /photography/studios/{ownerId}— photographyPublicSiteGET /photography/studios/{ownerId}/logo— photographyPublicLogoGET /photography/studios/{ownerId}/photos/{shootId}/{captureId}— photographyPublicPhotoGET /photography/workflows— photographyListGET /photography/workflows/{id}— photographyGetPOST /photography/workflows/{id}/approvals— photographyApprovalPUT /photography/workflows/{id}/assembly— photographyAssemblyPOST /photography/workflows/{id}/captures/{captureId}/retry-processing— photographyRetryCapturePOST /photography/workflows/{id}/intake— photographyIntakePOST /photography/workflows/{id}/orders— photographyOrderPOST /photography/workflows/{id}/orders/{orderId}/payment— photographyPaymentPOST /photography/workflows/{id}/presets— photographySavePresetPOST /photography/workflows/{id}/presets/{presetId}/apply— photographyApplyPresetPOST /photography/workflows/{id}/publish— photographyPublishPOST /photography/workflows/{id}/recipients— photographyInvitePATCH /photography/workflows/{id}/recipients/{recipientId}— photographyRecipientPOST /photography/workflows/{id}/retry— photographyRetryPOST /photography/workflows/{id}/studio-presets/{presetId}/apply— photographyApplyStudioPresetGET /studio/bundles/exports/{id}/download— Download a Studio bundlePOST /studio/bundles/uploads— Upload a Studio bundleDELETE /studio/bundles/uploads/{id}— Discard an uploaded Studio bundleGET /studio/bundles/uploads/{id}— Get an uploaded Studio bundleGET /studio/exports/{id}/download— Download a Studio export kept with its projectGET /studio/projects— List Studio projectsPOST /studio/projects— Create a Studio projectPOST /studio/projects/trash/empty— Empty the Studio trashDELETE /studio/projects/{id}— Delete a Studio projectGET /studio/projects/{id}— Get a Studio projectPUT /studio/projects/{id}— Update a Studio projectGET /studio/projects/{id}/comments— List Studio review commentsPOST /studio/projects/{id}/comments— Add a Studio review commentDELETE /studio/projects/{id}/comments/{commentId}— Remove a Studio review commentPUT /studio/projects/{id}/comments/{commentId}— Update a Studio review commentPOST /studio/projects/{id}/duplicate— Duplicate a Studio projectGET /studio/projects/{id}/imports— List the files imported into a Studio projectPOST /studio/projects/{id}/imports— Import a file into a Studio projectGET /studio/projects/{id}/imports/{importId}/file— Read a file imported into a Studio projectPOST /studio/projects/{id}/lease— Acquire or renew the write leasePOST /studio/projects/{id}/lease/release— Release the write leasePOST /studio/projects/{id}/restore— Restore a Studio project revisionPOST /studio/projects/{id}/reverse-conform— Queue a Studio clip source reversalPOST /studio/projects/{id}/reverse-conform/apply— Apply a completed Studio clip source reversalGET /studio/projects/{id}/revisions— List Studio project historyPOST /studio/projects/{id}/revisions— Save a Studio project revisionGET /studio/projects/{id}/revisions/{revision}— Get a Studio project revisionGET /studio/projects/{id}/revisions/{revision}/diff— Compare two Studio project revisionsPOST /studio/projects/{id}/trash/restore— Restore a Studio project from the trashGET /studio/restored-versions/{id}— Get a restored version for StudioGET /studio/workspace— Get your Studio workspace layoutPUT /studio/workspace— Save your Studio workspace layout
photographyGallery
GET /api/photography/galleries/{id}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
Field definitions: PhotographyGalleryDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGalleryDto"
}
}
},
"description": ""
}
}photographyApprove
POST /api/photography/galleries/{id}/approve
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyGuestApprovalDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGuestApprovalDto"
}
}
}Responses
Field definitions: PhotographyGalleryDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGalleryDto"
}
}
},
"description": ""
}
}photographyChoices
PUT /api/photography/galleries/{id}/choices
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyChoicesDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyChoicesDto"
}
}
}Responses
Field definitions: PhotographyGalleryDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGalleryDto"
}
}
},
"description": ""
}
}photographyLogo
GET /api/photography/galleries/{id}/logo
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyAccept
POST /api/photography/galleries/{id}/orders/{orderId}/accept
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
orderId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "orderId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyOrderAcceptDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyOrderAcceptDto"
}
}
}Responses
Field definitions: PhotographyGalleryDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGalleryDto"
}
}
},
"description": ""
}
}photographyCheckout
POST /api/photography/galleries/{id}/orders/{orderId}/checkout
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
orderId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "orderId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
Field definitions: PhotographyCheckoutDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyCheckoutDto"
}
}
},
"description": ""
}
}photographyOutput
GET /api/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
captureId | path | Yes | string |
id | path | Yes | string |
outputId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "captureId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "outputId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyOutputPreview
GET /api/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}/preview
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
captureId | path | Yes | string |
id | path | Yes | string |
outputId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "captureId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "outputId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyFile
GET /api/photography/galleries/{id}/photos/{captureId}/{kind}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
captureId | path | Yes | string |
id | path | Yes | string |
kind | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "captureId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "kind",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographySession
POST /api/photography/galleries/{id}/session
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyGallerySessionDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGallerySessionDto"
}
}
}Responses
Field definitions: PhotographyGallerySessionResponseDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGallerySessionResponseDto"
}
}
},
"description": ""
}
}photographySubmit
POST /api/photography/galleries/{id}/submit
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyWorkflowMutationDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
}
}
}Responses
Field definitions: PhotographyGalleryDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyGalleryDto"
}
}
},
"description": ""
}
}photographyZip
POST /api/photography/galleries/{id}/zip
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyZipDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyZipDto"
}
}
}Responses
Field definitions: PhotographyZipResponseDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyZipResponseDto"
}
}
},
"description": ""
}
}photographyArchive
GET /api/photography/galleries/{id}/zip/{zipId}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
X-Photography-Session | header | Yes | string |
id | path | Yes | string |
zipId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "X-Photography-Session",
"in": "header",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "zipId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyCallback
POST /api/photography/payments/stripe
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
Stripe-Signature | header | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "Stripe-Signature",
"in": "header",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
Required.
{
"application/json": {
"schema": {
"additionalProperties": true,
"description": "Signed Stripe event JSON. Signature verification requires its unchanged raw bytes.",
"type": "object"
}
}
}Responses
Field definitions: PhotographyCallbackDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyCallbackDto"
}
}
},
"description": ""
}
}photographyStudioPresets
GET /api/photography/presets
Authentication: API key. Permission: all.
Responses
Field definitions: PhotographyStudioPresetsDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyStudioPresetsDto"
}
}
},
"description": ""
}
}photographySaveStudioPreset
POST /api/photography/presets
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: PhotographyPresetSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPresetSaveDto"
}
}
}Responses
Field definitions: PhotographyStudioPresetsDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyStudioPresetsDto"
}
}
},
"description": ""
}
}Read your private shoots
GET /api/photography/shoots
Authentication: API key. Permission: all.
Responses
Field definitions: PhotographyWorkspaceDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkspaceDto"
}
}
},
"description": ""
}
}Save your shoots using the loaded revision
PUT /api/photography/shoots
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: PhotographyWorkspaceSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkspaceSaveDto"
}
}
}Responses
Field definitions: PhotographyWorkspaceDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkspaceDto"
}
}
},
"description": ""
}
}Read your private studio branding
GET /api/photography/shoots/branding
Authentication: API key. Permission: all.
Responses
Field definitions: PhotographyBrandDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyBrandDto"
}
}
},
"description": ""
}
}Save private studio branding with the workspace revision
PUT /api/photography/shoots/branding
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: PhotographyBrandSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyBrandSaveDto"
}
}
}Responses
Field definitions: PhotographyBrandDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyBrandDto"
}
}
},
"description": ""
}
}List your eligible unlocked studio logo images
GET /api/photography/shoots/branding/logos
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
cursor | query | No | string |
Parameter types, defaults and constraints
[
{
"name": "cursor",
"required": false,
"in": "query",
"schema": {
"minLength": 1,
"maxLength": 500,
"type": "string"
}
}
]Responses
Field definitions: PhotographyLogoCandidatesDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyLogoCandidatesDto"
}
}
},
"description": ""
}
}View an eligible owned logo thumbnail without original metadata
GET /api/photography/shoots/branding/logos/{id}/thumbnail
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
variant | query | No | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "variant",
"required": false,
"in": "query",
"schema": {
"default": "original",
"type": "string",
"enum": [
"original",
"light",
"dark"
]
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}Preview a watermark using the production font metrics and renderer
POST /api/photography/shoots/branding/preview
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: PhotographyRenditionPreviewDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyRenditionPreviewDto"
}
}
}Responses
{
"201": {
"description": ""
}
}Read a page of unlocked shoot photos
GET /api/photography/shoots/{id}/photos
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
cursor | query | No | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "cursor",
"required": false,
"in": "query",
"schema": {
"minLength": 1,
"maxLength": 500,
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: PhotographyPhotosDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPhotosDto"
}
}
},
"description": ""
}
}Rate or reject an owned photo in your shoot
PATCH /api/photography/shoots/{id}/rating
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyRatingDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyRatingDto"
}
}
}Responses
{
"204": {
"description": ""
}
}photographySite
GET /api/photography/site
Authentication: API key. Permission: all.
Responses
Field definitions: PhotographySiteDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographySiteDto"
}
}
},
"description": ""
}
}photographySaveSite
PUT /api/photography/site
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: PhotographySiteSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographySiteSaveDto"
}
}
}Responses
Field definitions: PhotographySiteDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographySiteDto"
}
}
},
"description": ""
}
}photographyPublicSite
GET /api/photography/studios/{ownerId}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
ownerId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "ownerId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
Field definitions: PhotographyPublicSiteDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPublicSiteDto"
}
}
},
"description": ""
}
}photographyPublicLogo
GET /api/photography/studios/{ownerId}/logo
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
ownerId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "ownerId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyPublicPhoto
GET /api/photography/studios/{ownerId}/photos/{shootId}/{captureId}
Authentication: No API key required. Permission: Public.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
captureId | path | Yes | string |
ownerId | path | Yes | string |
shootId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "captureId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "ownerId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "shootId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}photographyList
GET /api/photography/workflows
Authentication: API key. Permission: all.
Responses
Field definitions: PhotographyWorkflowListDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowListDto"
}
}
},
"description": ""
}
}photographyGet
GET /api/photography/workflows/{id}
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Responses
Field definitions: PhotographyWorkflowDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyApproval
POST /api/photography/workflows/{id}/approvals
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyApprovalDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyApprovalDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyAssembly
PUT /api/photography/workflows/{id}/assembly
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyAssemblyDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyAssemblyDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyRetryCapture
POST /api/photography/workflows/{id}/captures/{captureId}/retry-processing
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
captureId | path | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "captureId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyWorkflowMutationDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyIntake
POST /api/photography/workflows/{id}/intake
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyIntakeDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyIntakeDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyOrder
POST /api/photography/workflows/{id}/orders
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyOrderCreateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyOrderCreateDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyPayment
POST /api/photography/workflows/{id}/orders/{orderId}/payment
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
orderId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "orderId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyPaymentDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPaymentDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographySavePreset
POST /api/photography/workflows/{id}/presets
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyPresetSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPresetSaveDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyApplyPreset
POST /api/photography/workflows/{id}/presets/{presetId}/apply
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
presetId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "presetId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyWorkflowMutationDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyPublish
POST /api/photography/workflows/{id}/publish
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyPublicationDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyPublicationDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyInvite
POST /api/photography/workflows/{id}/recipients
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyRecipientCreateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyRecipientCreateDto"
}
}
}Responses
Field definitions: PhotographyInvitationDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyInvitationDto"
}
}
},
"description": ""
}
}photographyRecipient
PATCH /api/photography/workflows/{id}/recipients/{recipientId}
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
recipientId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "recipientId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyRecipientUpdateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyRecipientUpdateDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyRetry
POST /api/photography/workflows/{id}/retry
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyWorkflowMutationDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}photographyApplyStudioPreset
POST /api/photography/workflows/{id}/studio-presets/{presetId}/apply
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
presetId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "presetId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required.
Field definitions: PhotographyStudioPresetApplyDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyStudioPresetApplyDto"
}
}
}Responses
Field definitions: PhotographyWorkflowDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PhotographyWorkflowDto"
}
}
},
"description": ""
}
}Download a Studio bundle
GET /api/studio/bundles/exports/{id}/download
The finished file of one of your own exports. It is reachable by no other route and is deleted when it expires.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}Upload a Studio bundle
POST /api/studio/bundles/uploads
Checks the archive against every bundle limit and verifies its manifest and project document before anything is kept. Returns what the import will relink, keep and report missing.
Authentication: API key. Permission: all.
Request body
Required. A Studio bundle to import
Field definitions: StudioBundleUploadCreateDto
{
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/StudioBundleUploadCreateDto"
}
}
}Responses
Field definitions: StudioBundleUploadDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioBundleUploadDto"
}
}
},
"description": ""
}
}Discard an uploaded Studio bundle
DELETE /api/studio/bundles/uploads/{id}
Deletes the uploaded file now rather than when it expires.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"204": {
"description": ""
}
}Get an uploaded Studio bundle
GET /api/studio/bundles/uploads/{id}
The review of an uploaded bundle, recomputed for your library as it is now.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: StudioBundleUploadDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioBundleUploadDto"
}
}
},
"description": ""
}
}Download a Studio export kept with its project
GET /api/studio/exports/{id}/download
The file of a published export that uses media shared with you. Available only while every source is still available to you; a result in your library is downloaded like any other photo or video.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}List Studio projects
GET /api/studio/projects
One shelf of the project library. The active shelf holds projects you own and projects shared with a space you belong to; the archive and the trash hold your own only.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
query | query | No | Case-insensitive part of the name |
shelf | query | No | Which shelf to list; `active` when omitted |
skip | query | No | integer |
sort | query | No | |
take | query | No | integer |
Parameter types, defaults and constraints
Field definitions: StudioProjectShelf, StudioProjectSort
[
{
"name": "query",
"required": false,
"in": "query",
"description": "Case-insensitive part of the name",
"schema": {
"maxLength": 200,
"type": "string"
}
},
{
"name": "shelf",
"required": false,
"in": "query",
"description": "Which shelf to list; `active` when omitted",
"schema": {
"$ref": "#/components/schemas/StudioProjectShelf"
}
},
{
"name": "skip",
"required": false,
"in": "query",
"schema": {
"minimum": 0,
"maximum": 9007199254740991,
"default": 0,
"type": "integer"
}
},
{
"name": "sort",
"required": false,
"in": "query",
"schema": {
"$ref": "#/components/schemas/StudioProjectSort"
}
},
{
"name": "take",
"required": false,
"in": "query",
"schema": {
"minimum": 1,
"maximum": 200,
"default": 50,
"type": "integer"
}
}
]Responses
Field definitions: StudioProjectListResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectListResponseDto"
}
}
},
"description": ""
}
}Create a Studio project
POST /api/studio/projects
Creates an empty project owned by you and hands the write lease to the given editor instance. An initial document, when given, is saved as revision 1.
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: StudioProjectCreateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectCreateDto"
}
}
}Responses
Field definitions: StudioProjectDetailDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDetailDto"
}
}
},
"description": ""
}
}Empty the Studio trash
POST /api/studio/projects/trash/empty
Deletes every project in your Studio trash for good, with its history and comments. Media in your library is never touched.
Authentication: API key. Permission: all.
Responses
Field definitions: StudioProjectTrashEmptyResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectTrashEmptyResponseDto"
}
}
},
"description": ""
}
}Delete a Studio project
DELETE /api/studio/projects/{id}
Moves the project to the trash, where it can be restored until its retention runs out; with `permanent`, deletes it, its history and its comments now. Owner only. Media in your library is never touched, and finished jobs keep their lineage.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
permanent | query | No | Delete for good instead of moving to the trash. Library media is never touched either way. |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "permanent",
"required": false,
"in": "query",
"description": "Delete for good instead of moving to the trash. Library media is never touched either way.",
"schema": {
"type": "boolean"
}
}
]Responses
{
"204": {
"description": ""
}
}Get a Studio project
GET /api/studio/projects/{id}
The project with its head document. A reviewer receives the document only when every source it references is available to them; otherwise it is withheld.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: StudioProjectDetailDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDetailDto"
}
}
},
"description": ""
}
}Update a Studio project
PUT /api/studio/projects/{id}
Rename the project, set the shared space whose members may review it, archive it or bring it back, or choose a library item as its poster. Owner only.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectUpdateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectUpdateDto"
}
}
}Responses
Field definitions: StudioProjectDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDto"
}
}
},
"description": ""
}
}List Studio review comments
GET /api/studio/projects/{id}/comments
Comments pinned to the timeline, oldest first.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
skip | query | No | integer |
take | query | No | integer |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "skip",
"required": false,
"in": "query",
"schema": {
"minimum": 0,
"maximum": 9007199254740991,
"default": 0,
"type": "integer"
}
},
{
"name": "take",
"required": false,
"in": "query",
"schema": {
"minimum": 1,
"maximum": 200,
"default": 50,
"type": "integer"
}
}
]Responses
Field definitions: StudioCommentListResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioCommentListResponseDto"
}
}
},
"description": ""
}
}Add a Studio review comment
POST /api/studio/projects/{id}/comments
Owner and reviewers may comment. The time is an exact fraction of seconds. No lease is needed.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioCommentCreateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioCommentCreateDto"
}
}
}Responses
Field definitions: StudioCommentDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioCommentDto"
}
}
},
"description": ""
}
}Remove a Studio review comment
DELETE /api/studio/projects/{id}/comments/{commentId}
The author or the project owner may remove a comment.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
commentId | path | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "commentId",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"204": {
"description": ""
}
}Update a Studio review comment
PUT /api/studio/projects/{id}/comments/{commentId}
The author edits the text; the author or the owner resolves or reopens it.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
commentId | path | Yes | string |
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "commentId",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioCommentUpdateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioCommentUpdateDto"
}
}
}Responses
Field definitions: StudioCommentDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioCommentDto"
}
}
},
"description": ""
}
}Duplicate a Studio project
POST /api/studio/projects/{id}/duplicate
Creates a new project of yours whose first version is this project as it is now. The copy is not shared for review. Owner only.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectDuplicateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDuplicateDto"
}
}
}Responses
Field definitions: StudioProjectDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDto"
}
}
},
"description": ""
}
}List the files imported into a Studio project
GET /api/studio/projects/{id}/imports
Every file kept with one of your projects, with its type, size and checksum.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: StudioProjectImportDto
{
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/StudioProjectImportDto"
},
"type": "array"
}
}
},
"description": ""
}
}Import a file into a Studio project
POST /api/studio/projects/{id}/imports
Keeps a recording, sound, image, short video, SVG or Lottie graphic, caption file (.srt or .vtt) or .cube LUT with the project rather than the library. The type is read from the bytes; an SVG with scripts is refused, external subresources of a graphic are counted, and a caption file or LUT must be well formed throughout. The same id and file again answers the stored import.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
]Request body
Required. A file to import into the project
Field definitions: StudioProjectImportCreateDto
{
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/StudioProjectImportCreateDto"
}
}
}Responses
Field definitions: StudioProjectImportDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectImportDto"
}
}
},
"description": ""
}
}Read a file imported into a Studio project
GET /api/studio/projects/{id}/imports/{importId}/file
The bytes of a file kept with one of your projects, for the editor to play or show.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | Project id |
importId | path | Yes | Import id |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"description": "Project id",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "importId",
"required": true,
"in": "path",
"description": "Import id",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}Acquire or renew the write lease
POST /api/studio/projects/{id}/lease
One editor instance writes at a time. The holder renews with the same call; a free or lapsed lease is taken; a live lease held elsewhere is refused with `409` unless `takeover` is set explicitly.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectLeaseRequestDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
}
}
}Responses
Field definitions: StudioProjectLeaseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectLeaseDto"
}
}
},
"description": ""
}
}Release the write lease
POST /api/studio/projects/{id}/lease/release
Gives the lease back so another editor instance can take it without waiting for it to lapse.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectLeaseRequestDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
}
}
}Responses
{
"204": {
"description": ""
}
}Restore a Studio project revision
POST /api/studio/projects/{id}/restore
Appends a new revision with the content of an earlier one. History is never rewritten; the restore is itself a revision.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectRestoreDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectRestoreDto"
}
}
}Responses
Field definitions: StudioProjectSaveResponseDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectSaveResponseDto"
}
}
},
"description": ""
}
}Queue a Studio clip source reversal
POST /api/studio/projects/{id}/reverse-conform
Owner-only local source reversal bound to a stored revision and the requesting editor lease.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioReverseConformEnqueueDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioReverseConformEnqueueDto"
}
}
}Responses
Field definitions: StudioReverseConformQueuedDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioReverseConformQueuedDto"
}
}
},
"description": ""
}
}Apply a completed Studio clip source reversal
POST /api/studio/projects/{id}/reverse-conform/apply
Rechecks ownership, current source access, lease and the original revision before relinking the clip. Newer edits are never overwritten.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioReverseConformApplyDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioReverseConformApplyDto"
}
}
}Responses
Field definitions: StudioProjectSaveResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectSaveResponseDto"
}
}
},
"description": ""
}
}List Studio project history
GET /api/studio/projects/{id}/revisions
Revisions newest first, without their documents.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
skip | query | No | integer |
take | query | No | integer |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "skip",
"required": false,
"in": "query",
"schema": {
"minimum": 0,
"maximum": 9007199254740991,
"default": 0,
"type": "integer"
}
},
{
"name": "take",
"required": false,
"in": "query",
"schema": {
"minimum": 1,
"maximum": 200,
"default": 50,
"type": "integer"
}
}
]Responses
Field definitions: StudioProjectHistoryResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectHistoryResponseDto"
}
}
},
"description": ""
}
}Save a Studio project revision
POST /api/studio/projects/{id}/revisions
Autosave. Stores the complete document as the next revision when `expectedRevision` is the head and the caller holds the lease. The same `requestKey` with the same document replays the earlier result; an unchanged document writes nothing.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: StudioProjectSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectSaveDto"
}
}
}Responses
Field definitions: StudioProjectSaveResponseDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectSaveResponseDto"
}
}
},
"description": ""
}
}Get a Studio project revision
GET /api/studio/projects/{id}/revisions/{revision}
One historical revision with its document, under the same review rule as the head.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
revision | path | Yes | integer |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "revision",
"required": true,
"in": "path",
"schema": {
"minimum": 1,
"maximum": 9007199254740991,
"type": "integer"
}
}
]Responses
Field definitions: StudioProjectRevisionDetailDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectRevisionDetailDto"
}
}
},
"description": ""
}
}Compare two Studio project revisions
GET /api/studio/projects/{id}/revisions/{revision}/diff
What changed between `against` and this revision, as graph paths and counts. No graph values are returned.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
against | query | Yes | The earlier revision to compare with |
id | path | Yes | string |
revision | path | Yes | integer |
Parameter types, defaults and constraints
[
{
"name": "against",
"required": true,
"in": "query",
"description": "The earlier revision to compare with",
"schema": {
"minimum": 1,
"maximum": 9007199254740991,
"type": "integer"
}
},
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "revision",
"required": true,
"in": "path",
"schema": {
"minimum": 1,
"maximum": 9007199254740991,
"type": "integer"
}
}
]Responses
Field definitions: StudioProjectDiffDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDiffDto"
}
}
},
"description": ""
}
}Restore a Studio project from the trash
POST /api/studio/projects/{id}/trash/restore
Brings a trashed project back to the shelf it was on. Owner only.
Authentication: API key. Permission: all.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: StudioProjectDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioProjectDto"
}
}
},
"description": ""
}
}Get a restored version for Studio
GET /api/studio/restored-versions/{id}
An accepted restoration of one of your photos or videos as a Studio media bin entry: the media id a clip of it carries, its size and length, and whether it can be placed now. A discarded, expired or Locked one says so; someone else’s is not found.
Authentication: API key. Permission: asset.edit.get.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: StudioRestoredVersionDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioRestoredVersionDto"
}
}
},
"description": ""
}
}Get your Studio workspace layout
GET /api/studio/workspace
The editor layout you last saved, or nulls when you have none. Only ever your own.
Authentication: API key. Permission: all.
Responses
Field definitions: StudioWorkspaceDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioWorkspaceDto"
}
}
},
"description": ""
}
}Save your Studio workspace layout
PUT /api/studio/workspace
Replaces your stored editor layout. The layout is stored as JSON and returned as the same value (key order and spacing are not kept), up to 256 KiB.
Authentication: API key. Permission: all.
Request body
Required.
Field definitions: StudioWorkspaceSaveDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioWorkspaceSaveDto"
}
}
}Responses
Field definitions: StudioWorkspaceDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudioWorkspaceDto"
}
}
},
"description": ""
}
}© 2026 Frameleaf Inc. All rights reserved.
Frameleaf and the Frameleaf logo are Trademarks of Frameleaf Inc.