Skip to Content
APIResourcesAdmin APIMarkup

Markup

Markup is the main resource of the MarkUp.io API. Create, get, update, and delete markups (MarkUp projects); list and search by workspace; bulk create, move, and delete.

Create Markup from URL

POST /api/v2/markups/url

This URL should lead to webpage or one of supported types .

POST /api/v2/markups/url
curl "https://api.markup.io/api/v2/markups/url" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "url": "https://markup.io", "name": "My Markup" }'
200 OK
{ "data": { "id": "1f23b12d-ef54-4a53-9e46-58371a68e565", "createdAt": "2026-09-22T11:18:38.209Z", "modifiedAt": "2026-09-22T11:18:38.209Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Body CreateUrlMarkupRequest

OptionType
url string
name optionalstring

If not set the name will be set to the URL hostname.

workspaceId optionalstring

If not set or empty, the API key's workspace is used.

parentFolderId optionalstring

Folder id where the markup will be created. If not set, the workspace root folder is used.

Create Markup from file

POST /api/v2/markups/file

Create a markup from a single file in one of supported types . The endpoint takes a POST Content-Type: multipart/form-data request with one file field. The whole request must be under 20MB. For larger files, and to put several images in one markup, use the upload flow and Create Markup from files.

POST /api/v2/markups/file
curl "https://api.markup.io/api/v2/markups/file?workspaceId=123e4567-e89b-12d3-a456-426655440000" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: multipart/form-data" \ -F 'file=@/path/to/pictures/picture.jpg'
200 OK
{ "data": { "id": "91a878b7-6f88-487f-96e4-88095847108a", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Query Params CreateFileMarkupRequest

OptionType
name optionalstring

If not set the name will default based on URL or file name.

workspaceId string
parentFolderId optionalstring

Folder id where the markup will be created. If not set, the workspace root folder is used.

Create Markup from files

POST /api/v2/markups/from-files

Create a markup from files already uploaded through the upload flow. Upload each file first (POST /uploads/upload-policy -> POST the bytes as a form to the returned presigned URL -> POST /uploads/upload-complete), then pass the resulting fileIds here. A file there is bounded by the workspace’s remaining storage allowance rather than by a fixed per-file cap, so it is also the way to use a file too large for Create Markup from file. Several images (png, jpeg, gif, bmp, webp, svg) become one multi-page markup, and the order of fileIds is the order they appear in. A PDF, a video, or an image needing conversion (tiff, psd, eps) makes a markup of its own, so send exactly one fileId and do not mix it with others. Every file must belong to this workspace and can be used only once.

POST /api/v2/markups/from-files
curl "https://api.markup.io/api/v2/markups/from-files" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "workspaceId": "123e4567-e89b-12d3-a456-426655440000", "fileIds": ["3f1b9d2e-1c4a-4b7e-9a1d-2c5e8f0a7b31", "8c2a4e6f-5d3b-4a1c-8e9f-0b7d6c3a2e14"], "name": "Homepage review" }'
200 OK
{ "data": { "id": "59f0a8a4-001f-4929-900a-d340895af796", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Body CreateMarkupFromFilesRequest

OptionType
workspaceId string
fileIds string[]

Completed upload IDs. Each one is the fileId returned by Get an upload policy and then confirmed through upload-complete. Send several displayable images (png, jpeg, gif, bmp, webp, svg) to make one markup with a page per image, in the order given; or send exactly one PDF, video, or image needing conversion (tiff, psd, eps) to make a markup of that file — those types cannot be combined with each other or with images. Every file must belong to this workspace and can be used only once.

name optionalstring

If not set, the name defaults to the first file's name without its extension.

parentFolderId optionalstring

Folder id where the markup will be created. If not set, the workspace root folder is used.

Search Markups

GET /api/v2/markups/search

Search markups in workspace by name or URL (includes subfolders). Returns metadata only by default; pass include=media to attach every markup’s files, or narrow it to include=images, videos or documents.

GET /api/v2/markups/search
curl "https://api.markup.io/api/v2/markups/search?workspaceId=afb2496f-a18f-4392-871d-94ff9f9e7573&include=media" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "data": [ {} ] } }

Response Body ListMarkupResponse

OptionType
data T[]

Request Query Params SearchMarkupsQuery

OptionType
workspaceId string
query optionalstring
limit optionalnumber
include optionalstring

Comma-separated file payloads to expand, omitted by default because a page of markups can carry thousands of images. media expands every markup that has a file; images, videos and documents expand only image, video and PDF markups respectively and can be combined (images,videos). A markup of a type you did not ask for comes back without its file payload.

Get Markup Usage

GET /api/v2/markups/usage

Returns the workspace’s monthly MarkUp usage: scope, allowance, used, remaining, reset date and warning/limit flags. limit, remaining and totalRemaining are null on an unlimited plan. used counts MarkUps charged to the plan allowance and bundleUsed those charged to a purchased bundle, so the total created this period is used + bundleUsed.

GET /api/v2/markups/usage
curl "https://api.markup.io/api/v2/markups/usage" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "scope": "Workspace", "used": 42, "bundleUsed": 0, "limit": 100, "remaining": 58, "isUnlimited": false, "enforcementEnabled": true, "isCustomOverride": false, "warningThreshold": 0.8, "isWarning": false, "isLimitReached": false, "bundleBalance": 0, "totalRemaining": 58, "isDrawingOnBundle": false, "averageMonthlyUsage": null, "periodStart": "2023-02-01T00:00:00.000Z", "periodEnd": "2023-03-01T00:00:00.000Z" } }

Get Markup

GET /api/v2/markups/:id

GET /api/v2/markups/:id
curl "https://api.markup.io/api/v2/markups/16f443c1-7f28-4742-ac1b-d75e7f5cd180" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "id": "ec13e7fd-7d90-453c-978d-4a4afeef647d", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Path Params IdRequestParam

OptionType
id string

Get Markup Tag

GET /api/v2/markups/:id/tag

Returns taggable and tagged users for the markup (project). Same as v1 GET tag/project/:id.

GET /api/v2/markups/:id/tag
curl "https://api.markup.io/api/v2/markups/6f1ec676-32fa-4193-9854-2693f0f61eb4/tag" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "taggable": [ {} ], "tagged": [ { "id": "some id", "name": "some name", "email": "some email" } ] } }

Response Body ProjectMessageTagsResponse

OptionType
taggable TaggableTagsResponse[]
tagged TaggedUserTagResponse[]

Request Path Params IdRequestParam

OptionType
id string

List Markup View Modes

GET /api/v2/markups/:id/view-modes

Returns the available view modes (device breakpoints) for a markup, with per-mode thread counts.

GET /api/v2/markups/:id/view-modes
curl "https://api.markup.io/api/v2/markups/2b0249d8-3736-44fb-8878-68122ca9e890/view-modes" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
Response
204 No Content

Request Path Params IdRequestParam

OptionType
id string

List All Markups

GET /api/v2/markups

Cursor-based pagination. Use since for next page, before for previous. Order: createdAt desc. Returns metadata only by default; pass include=media to attach every markup’s files, or narrow it to include=images, videos or documents. isReady is always reported, so a caller can tell a markup still being converted from one with no files.

GET /api/v2/markups
curl "https://api.markup.io/api/v2/markups?workspaceId=eaf7ff36-aad8-4f1b-8b4e-3f7d82ae7b82&include=media" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "data": [ {} ], "hasMore": true } }

Response Body ListMarkupPaginatedResponse

OptionType
data
hasMore boolean
nextCursor string
prevCursor string

Request Query Params ListMarkupsQuery

OptionType
workspaceId string
limit optionalnumber
since optionalstring
before optionalstring
ttl optionalnumber
include optionalstring

Comma-separated file payloads to expand, omitted by default because a page of markups can carry thousands of images. media expands every markup that has a file; images, videos and documents expand only image, video and PDF markups respectively and can be combined (images,videos). A markup of a type you did not ask for comes back without its file payload.

Update Markup

POST /api/v2/markups/:id

POST /api/v2/markups/:id
curl "https://api.markup.io/api/v2/markups/06a8f372-feda-4943-8a54-d66455ec6813" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "name": "MarkUp.io" }'
200 OK
{ "data": { "id": "39fb2dbb-c1b4-49e2-b50e-834090024377", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Path Params IdRequestParam

OptionType
id string

Request Body UpdateMarkupRequest

OptionType
name string

Pause or Resume New Comments

PATCH /api/v2/markups/:id/read-only

Pauses or resumes new comments on the markup by toggling its readOnly state. Pausing requires a plan with pauseCommentsEnabled; resuming is always allowed.

PATCH /api/v2/markups/:id/read-only
curl "https://api.markup.io/api/v2/markups/2b98618d-0760-487f-859b-8c2d5aca9ba4/read-only" \ -X PATCH \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "readOnly": true }'
200 OK
{ "data": { "id": "5afcca3b-3ccc-49e2-a5af-da26697c1fe1", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Path Params IdRequestParam

OptionType
id string

Request Body UpdateMarkupReadOnlyRequest

OptionType
readOnly boolean

Download Original File

GET /api/v2/markups/:id/original/download-url

Returns a short-lived presigned URL to download the markup’s retained original file. Only available for markups created from a file whose original is still kept (see hasRetainedOriginal). Returns 404 when no retained original exists.

GET /api/v2/markups/:id/original/download-url
curl "https://api.markup.io/api/v2/markups/e8fe7179-60de-4ea8-8089-442c283b9a22/original/download-url" \ -X GET \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "url": "some url", "filename": "some filename", "mimeType": "some mimeType", "filesize": 123 } }

Response Body OriginalDownloadUrlResponse

OptionType
url string
filename string
mimeType string
filesize number

Request Path Params IdRequestParam

OptionType
id string

Keep or Archive Original File

PATCH /api/v2/markups/:id/original

Sets the per-markup original-file retention override. retainOriginal: true keeps the original even when the workspace’s storage policy is NEVER_STORE; false archives it. An original that has already been archived cannot be re-retained (returns 400). Returns the updated markup.

PATCH /api/v2/markups/:id/original
curl "https://api.markup.io/api/v2/markups/65832759-93da-4c4c-bb0a-bec4f1db6ca4/original" \ -X PATCH \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "retainOriginal": true }'
200 OK
{ "data": { "id": "b0421d3b-086e-402e-9e98-e0076eacd43b", "createdAt": "2026-09-22T11:18:38.210Z", "modifiedAt": "2026-09-22T11:18:38.210Z", "type": "webpage", "name": "MarkUp.io", "markupUrl": "https://app.markup.io/markup/f289b90a-1166-4f63-aef3-a0cce4543413", "thumbnailUrl": "https://media.markup.io/thumbnails/markup/9b339cd0-546d-4292-a54b-6e128ce6113e", "activeThreads": 10, "readOnly": true, "status": "editing", "note": { "id": "uuid", "projectId": "uuid", "note": "Internal note", "showNoteOnProjectOpen": true }, "projectReviews": [ { "projectId": "uuid", "userId": "uuid", "comment": "Looks good", "createdAt": 1705312800000 } ], "scopes": [ "update-project-read-only", "delete-project" ], "retainOriginal": true, "hasRetainedOriginal": true, "url": "https://markup.io" } }

Response Body - MarkupResponse

Request Path Params IdRequestParam

OptionType
id string

Request Body UpdateMarkupOriginalRequest

OptionType
retainOriginal boolean

Archive Original File

DELETE /api/v2/markups/:id/original

Archives the markup’s retained original file (queues it for deletion from storage) and returns the archived file size. Returns 404 when no retained original exists.

DELETE /api/v2/markups/:id/original
curl "https://api.markup.io/api/v2/markups/f1994047-e36c-49cd-93a8-7f815100c71a/original" \ -X DELETE \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
200 OK
{ "data": { "archivedFileSize": 123 } }

Response Body ArchiveOriginalResponse

OptionType
archivedFileSize number

Request Path Params IdRequestParam

OptionType
id string

Delete Markup

DELETE /api/v2/markups/:id

DELETE /api/v2/markups/:id
curl "https://api.markup.io/api/v2/markups/587daad8-13bf-4161-9924-8db615b44811" \ -X DELETE \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json"
Response
204 No Content

Request Path Params IdRequestParam

OptionType
id string

Bulk Create Markups from URLs

POST /api/v2/markups/bulk/from-url

POST /api/v2/markups/bulk/from-url
curl "https://api.markup.io/api/v2/markups/bulk/from-url" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "items": [ {} ] }'
Response
204 No Content

Request Body BulkCreateMarkupsFromUrlRequest

OptionType
items BulkCreateMarkupFromUrlItem[]

Bulk Create Markups from Files

POST /api/v2/markups/bulk/from-files

Not implemented — the handler always rejects. Kept out of the published docs until it works; to create one markup from several images use Create Markup from files.

POST /api/v2/markups/bulk/from-files
curl "https://api.markup.io/api/v2/markups/bulk/from-files" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "items": [ {} ] }'
Response
204 No Content

Request Body BulkCreateMarkupsFromFilesRequest

OptionType
items BulkCreateMarkupFromFileItem[]

Bulk Move Markups

POST /api/v2/markups/bulk/move

POST /api/v2/markups/bulk/move
curl "https://api.markup.io/api/v2/markups/bulk/move" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "markupIds": "38b7570e-67fb-4a09-b681-e39319e9c495", "targetFolderId": "d6a08854-1a38-4969-bc3f-7b15363514ae" }'
Response
204 No Content

Request Body BulkMoveMarkupsRequest

OptionType
markupIds string[]
targetFolderId string

Bulk Delete Markups

POST /api/v2/markups/bulk/delete

POST /api/v2/markups/bulk/delete
curl "https://api.markup.io/api/v2/markups/bulk/delete" \ -X POST \ -H "Authorization: Bearer <API-KEY-SECRET>" \ -H "Markup-API-Version: 2023-02-22" \ -H "Content-Type: application/json" \ --data '{ "markupIds": "fea57233-a98f-4dc8-9142-39230e0462a6" }'
Response
204 No Content

Request Body BulkDeleteMarkupsRequest

OptionType
markupIds string[]

MarkupResponse

WebpageMarkupResponse

OptionType
id string
createdAt Iso8601Timestamp
modifiedAt Iso8601Timestamp
deletedAt Iso8601Timestamp
type ProjectType
name string
markupUrl string
thumbnailUrl string
activeThreads number
readOnly boolean
status ProjectStatus
note ProjectNoteResponse
projectReviews ProjectReviewResponse[]
scopes string[]
retainOriginal boolean
hasRetainedOriginal boolean
url string

ImageMarkupResponse

OptionType
id string
createdAt Iso8601Timestamp
modifiedAt Iso8601Timestamp
deletedAt Iso8601Timestamp
type ProjectType
name string
markupUrl string
thumbnailUrl string
activeThreads number
readOnly boolean
status ProjectStatus
note ProjectNoteResponse
projectReviews ProjectReviewResponse[]
scopes string[]
retainOriginal boolean
hasRetainedOriginal boolean
originalMimeType string

Mime type of the file the markup was created from, when it differs from the images themselves (a converted document, for example). Absent for markups built directly from uploaded images, where the per-image mimeType already describes the source file.

images MarkupImage[]

The images that make up this markup, in display order. Always present on a single-markup read; on the list and search endpoints only when include=images is requested. An empty array means the markup has no images yet — check isReady to tell that from a conversion still running.

isReady boolean

Some of the files need to be converted before Markup is ready for reviewing. After the conversion is done, this flag will be set to true and the markup_ready webhook will be sent.

VideoMarkupResponse

OptionType
id string
createdAt Iso8601Timestamp
modifiedAt Iso8601Timestamp
deletedAt Iso8601Timestamp
type ProjectType
name string
markupUrl string
thumbnailUrl string
activeThreads number
readOnly boolean
status ProjectStatus
note ProjectNoteResponse
projectReviews ProjectReviewResponse[]
scopes string[]
retainOriginal boolean
hasRetainedOriginal boolean
video MarkupVideo

The video this markup was created from. Absent until the conversion job has produced it — check isReady to tell "still converting" from "no file".

isReady boolean

Some of the files need to be converted before Markup is ready for reviewing. After the conversion is done, this flag will be set to true and the markup_ready webhook will be sent.

PdfMarkupResponse

OptionType
id string
createdAt Iso8601Timestamp
modifiedAt Iso8601Timestamp
deletedAt Iso8601Timestamp
type ProjectType
name string
markupUrl string
thumbnailUrl string
activeThreads number
readOnly boolean
status ProjectStatus
note ProjectNoteResponse
projectReviews ProjectReviewResponse[]
scopes string[]
retainOriginal boolean
hasRetainedOriginal boolean
document MarkupDocument

The document this markup was created from. Absent while the upload is still being processed, so a client must not assume it is present.

isReady boolean

Some of the files need to be converted before Markup is ready for reviewing. After the conversion is done, this flag will be set to true and the markup_ready webhook will be sent.

TaggedUserTagResponse

OptionType
id string
name string
email string