# Studio projects API

Source: https://frameleaf.app/docs/api/reference/studio-projects/

Use your own server and its scoped API keys.

## photographyGallery

GET /api/photography/galleries/{id}



```json
{
  "operationId": "photographyGallery",
  "parameters": [
    {
      "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/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGalleryDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyApprove

POST /api/photography/galleries/{id}/approve



```json
{
  "operationId": "photographyApprove",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyGuestApprovalDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGalleryDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyChoices

PUT /api/photography/galleries/{id}/choices



```json
{
  "operationId": "photographyChoices",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyChoicesDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGalleryDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyLogo

GET /api/photography/galleries/{id}/logo



```json
{
  "operationId": "photographyLogo",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyAccept

POST /api/photography/galleries/{id}/orders/{orderId}/accept



```json
{
  "operationId": "photographyAccept",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyOrderAcceptDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGalleryDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyCheckout

POST /api/photography/galleries/{id}/orders/{orderId}/checkout



```json
{
  "operationId": "photographyCheckout",
  "parameters": [
    {
      "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": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyCheckoutDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyOutput

GET /api/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}



```json
{
  "operationId": "photographyOutput",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyOutputPreview

GET /api/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}/preview



```json
{
  "operationId": "photographyOutputPreview",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyFile

GET /api/photography/galleries/{id}/photos/{captureId}/{kind}



```json
{
  "operationId": "photographyFile",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographySession

POST /api/photography/galleries/{id}/session



```json
{
  "operationId": "photographySession",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyGallerySessionDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGallerySessionResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographySubmit

POST /api/photography/galleries/{id}/submit



```json
{
  "operationId": "photographySubmit",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyGalleryDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyZip

POST /api/photography/galleries/{id}/zip



```json
{
  "operationId": "photographyZip",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyZipDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyZipResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyArchive

GET /api/photography/galleries/{id}/zip/{zipId}



```json
{
  "operationId": "photographyArchive",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyCallback

POST /api/photography/payments/stripe



```json
{
  "operationId": "photographyCallback",
  "parameters": [
    {
      "name": "Stripe-Signature",
      "in": "header",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "additionalProperties": true,
          "description": "Signed Stripe event JSON. Signature verification requires its unchanged raw bytes.",
          "type": "object"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyCallbackDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyStudioPresets

GET /api/photography/presets



```json
{
  "operationId": "photographyStudioPresets",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyStudioPresetsDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographySaveStudioPreset

POST /api/photography/presets



```json
{
  "operationId": "photographySaveStudioPreset",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyPresetSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyStudioPresetsDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Read your private shoots

GET /api/photography/shoots



```json
{
  "operationId": "getPhotographyWorkspace",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkspaceDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Read your private shoots",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Save your shoots using the loaded revision

PUT /api/photography/shoots



```json
{
  "operationId": "savePhotographyWorkspace",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyWorkspaceSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkspaceDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Save your shoots using the loaded revision",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Read your private studio branding

GET /api/photography/shoots/branding



```json
{
  "operationId": "getPhotographyBrand",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyBrandDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Read your private studio branding",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Save private studio branding with the workspace revision

PUT /api/photography/shoots/branding



```json
{
  "operationId": "savePhotographyBrand",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyBrandSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyBrandDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Save private studio branding with the workspace revision",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## List your eligible unlocked studio logo images

GET /api/photography/shoots/branding/logos



```json
{
  "operationId": "getPhotographyLogos",
  "parameters": [
    {
      "name": "cursor",
      "required": false,
      "in": "query",
      "schema": {
        "minLength": 1,
        "maxLength": 500,
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyLogoCandidatesDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "List your eligible unlocked studio logo images",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## View an eligible owned logo thumbnail without original metadata

GET /api/photography/shoots/branding/logos/{id}/thumbnail



```json
{
  "operationId": "getPhotographyLogoThumbnail",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "View an eligible owned logo thumbnail without original metadata",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Preview a watermark using the production font metrics and renderer

POST /api/photography/shoots/branding/preview



```json
{
  "operationId": "previewPhotographyWatermark",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyRenditionPreviewDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Preview a watermark using the production font metrics and renderer",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Read a page of unlocked shoot photos

GET /api/photography/shoots/{id}/photos



```json
{
  "operationId": "getPhotographyPhotos",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyPhotosDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Read a page of unlocked shoot photos",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Rate or reject an owned photo in your shoot

PATCH /api/photography/shoots/{id}/rating



```json
{
  "operationId": "ratePhotographyPhoto",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyRatingDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "204": {
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Rate or reject an owned photo in your shoot",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographySite

GET /api/photography/site



```json
{
  "operationId": "photographySite",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographySiteDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographySaveSite

PUT /api/photography/site



```json
{
  "operationId": "photographySaveSite",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographySiteSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographySiteDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyPublicSite

GET /api/photography/studios/{ownerId}



```json
{
  "operationId": "photographyPublicSite",
  "parameters": [
    {
      "name": "ownerId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyPublicSiteDto"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyPublicLogo

GET /api/photography/studios/{ownerId}/logo



```json
{
  "operationId": "photographyPublicLogo",
  "parameters": [
    {
      "name": "ownerId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/octet-stream": {
          "schema": {
            "format": "binary",
            "type": "string"
          }
        }
      },
      "description": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyPublicPhoto

GET /api/photography/studios/{ownerId}/photos/{shootId}/{captureId}



```json
{
  "operationId": "photographyPublicPhoto",
  "parameters": [
    {
      "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": ""
    }
  },
  "tags": [
    "Studio projects"
  ],
  "security": []
}
```

## photographyList

GET /api/photography/workflows



```json
{
  "operationId": "photographyList",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowListDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyGet

GET /api/photography/workflows/{id}



```json
{
  "operationId": "photographyGet",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyApproval

POST /api/photography/workflows/{id}/approvals



```json
{
  "operationId": "photographyApproval",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyApprovalDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyAssembly

PUT /api/photography/workflows/{id}/assembly



```json
{
  "operationId": "photographyAssembly",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyAssemblyDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyRetryCapture

POST /api/photography/workflows/{id}/captures/{captureId}/retry-processing



```json
{
  "operationId": "photographyRetryCapture",
  "parameters": [
    {
      "name": "captureId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyIntake

POST /api/photography/workflows/{id}/intake



```json
{
  "operationId": "photographyIntake",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyIntakeDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyOrder

POST /api/photography/workflows/{id}/orders



```json
{
  "operationId": "photographyOrder",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyOrderCreateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyPayment

POST /api/photography/workflows/{id}/orders/{orderId}/payment



```json
{
  "operationId": "photographyPayment",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "orderId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyPaymentDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographySavePreset

POST /api/photography/workflows/{id}/presets



```json
{
  "operationId": "photographySavePreset",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyPresetSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyApplyPreset

POST /api/photography/workflows/{id}/presets/{presetId}/apply



```json
{
  "operationId": "photographyApplyPreset",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "presetId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyPublish

POST /api/photography/workflows/{id}/publish



```json
{
  "operationId": "photographyPublish",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyPublicationDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyInvite

POST /api/photography/workflows/{id}/recipients



```json
{
  "operationId": "photographyInvite",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyRecipientCreateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyInvitationDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyRecipient

PATCH /api/photography/workflows/{id}/recipients/{recipientId}



```json
{
  "operationId": "photographyRecipient",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "recipientId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyRecipientUpdateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyRetry

POST /api/photography/workflows/{id}/retry



```json
{
  "operationId": "photographyRetry",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## photographyApplyStudioPreset

POST /api/photography/workflows/{id}/studio-presets/{presetId}/apply



```json
{
  "operationId": "photographyApplyStudioPreset",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "presetId",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/PhotographyStudioPresetApplyDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PhotographyWorkflowDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "The finished file of one of your own exports. It is reachable by no other route and is deleted when it expires.",
  "operationId": "downloadStudioBundle",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Download a Studio bundle",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "uploadStudioBundle",
  "parameters": [],
  "requestBody": {
    "content": {
      "multipart/form-data": {
        "schema": {
          "$ref": "#/components/schemas/StudioBundleUploadCreateDto"
        }
      }
    },
    "description": "A Studio bundle to import",
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioBundleUploadDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Upload a Studio bundle",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Discard an uploaded Studio bundle

DELETE /api/studio/bundles/uploads/{id}

Deletes the uploaded file now rather than when it expires.

```json
{
  "description": "Deletes the uploaded file now rather than when it expires.",
  "operationId": "deleteStudioBundleUpload",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Discard an uploaded Studio bundle",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "The review of an uploaded bundle, recomputed for your library as it is now.",
  "operationId": "getStudioBundleUpload",
  "parameters": [
    {
      "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/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioBundleUploadDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Get an uploaded Studio bundle",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "downloadStudioExport",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Download a Studio export kept with its project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "searchStudioProjects",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectListResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "List Studio projects",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "createStudioProject",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectCreateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDetailDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Create a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Deletes every project in your Studio trash for good, with its history and comments. Media in your library is never touched.",
  "operationId": "emptyStudioProjectTrash",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectTrashEmptyResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Empty the Studio trash",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "deleteStudioProject",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Delete a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "getStudioProject",
  "parameters": [
    {
      "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/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDetailDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Get a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "updateStudioProject",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectUpdateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Update a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## List Studio review comments

GET /api/studio/projects/{id}/comments

Comments pinned to the timeline, oldest first.

```json
{
  "description": "Comments pinned to the timeline, oldest first.",
  "operationId": "getStudioProjectComments",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioCommentListResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "List Studio review comments",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Owner and reviewers may comment. The time is an exact fraction of seconds. No lease is needed.",
  "operationId": "addStudioProjectComment",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioCommentCreateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioCommentDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Add a Studio review comment",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## Remove a Studio review comment

DELETE /api/studio/projects/{id}/comments/{commentId}

The author or the project owner may remove a comment.

```json
{
  "description": "The author or the project owner may remove a comment.",
  "operationId": "removeStudioProjectComment",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Remove a Studio review comment",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "The author edits the text; the author or the owner resolves or reopens it.",
  "operationId": "updateStudioProjectComment",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioCommentUpdateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioCommentDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Update a Studio review comment",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "duplicateStudioProject",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectDuplicateDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Duplicate a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Every file kept with one of your projects, with its type, size and checksum.",
  "operationId": "getStudioProjectImports",
  "parameters": [
    {
      "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/json": {
          "schema": {
            "items": {
              "$ref": "#/components/schemas/StudioProjectImportDto"
            },
            "type": "array"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "List the files imported into a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "importStudioProjectFile",
  "parameters": [
    {
      "name": "id",
      "required": true,
      "in": "path",
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "multipart/form-data": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectImportCreateDto"
        }
      }
    },
    "description": "A file to import into the project",
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectImportDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Import a file into a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "The bytes of a file kept with one of your projects, for the editor to play or show.",
  "operationId": "getStudioProjectImportFile",
  "parameters": [
    {
      "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": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Read a file imported into a Studio project",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "acquireStudioProjectLease",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectLeaseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Acquire or renew the write lease",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Gives the lease back so another editor instance can take it without waiting for it to lapse.",
  "operationId": "releaseStudioProjectLease",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "204": {
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Release the write lease",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Appends a new revision with the content of an earlier one. History is never rewritten; the restore is itself a revision.",
  "operationId": "restoreStudioProjectRevision",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectRestoreDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Restore a Studio project revision",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Owner-only local source reversal bound to a stored revision and the requesting editor lease.",
  "operationId": "enqueueStudioReverseConform",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioReverseConformEnqueueDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioReverseConformQueuedDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Queue a Studio clip source reversal",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Rechecks ownership, current source access, lease and the original revision before relinking the clip. Newer edits are never overwritten.",
  "operationId": "applyStudioReverseConform",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioReverseConformApplyDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Apply a completed Studio clip source reversal",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## List Studio project history

GET /api/studio/projects/{id}/revisions

Revisions newest first, without their documents.

```json
{
  "description": "Revisions newest first, without their documents.",
  "operationId": "getStudioProjectHistory",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectHistoryResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "List Studio project history",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "saveStudioProjectRevision",
  "parameters": [
    {
      "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"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioProjectSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Save a Studio project revision",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "One historical revision with its document, under the same review rule as the head.",
  "operationId": "getStudioProjectRevision",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectRevisionDetailDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Get a Studio project revision",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "What changed between `against` and this revision, as graph paths and counts. No graph values are returned.",
  "operationId": "diffStudioProjectRevision",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDiffDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Compare two Studio project revisions",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "Brings a trashed project back to the shelf it was on. Owner only.",
  "operationId": "restoreStudioProjectFromTrash",
  "parameters": [
    {
      "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/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioProjectDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Restore a Studio project from the trash",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "getStudioRestoredVersion",
  "parameters": [
    {
      "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": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioRestoredVersionDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Get a restored version for Studio",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "asset.edit.get"
}
```

## 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.

```json
{
  "description": "The editor layout you last saved, or nulls when you have none. Only ever your own.",
  "operationId": "getStudioWorkspace",
  "parameters": [],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioWorkspaceDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Get your Studio workspace layout",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```

## 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.

```json
{
  "description": "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.",
  "operationId": "saveStudioWorkspace",
  "parameters": [],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/StudioWorkspaceSaveDto"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StudioWorkspaceDto"
          }
        }
      },
      "description": ""
    }
  },
  "security": [
    {
      "api_key": []
    }
  ],
  "summary": "Save your Studio workspace layout",
  "tags": [
    "Studio projects"
  ],
  "x-frameleaf-permission": "all"
}
```
