Items
Unified resource for folders and markups. Same endpoints for get, list children, rename, delete. Scoped by API key workspace.
Get Item
GET /api/v2/items/:id
Get a single item by ID. Returns a folder (with ancestors) or a markup (project); response shape varies by type.
curl "https://api.markup.io/api/v2/items/0340a384-41c8-45fd-ba09-d2cf1eb5ae96" \
-X GET \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json"{
"data": {
"id": "132abe74-a54c-4e87-b661-e0e4a9376192",
"createdAt": "2026-06-09T07:17:45.219Z",
"modifiedAt": "2026-06-09T07:17:45.219Z",
"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"],
"url": "https://markup.io"
}
}Response Body - [FolderWithAncestorsResponse | MarkupResponse](#folderwithancestorsresponse | markupresponse)
Request Path Params IdRequestParam
| Option | Type | |
|---|---|---|
| id | string |
List Child Items
GET /api/v2/items/:id/items
List contents of a folder (folders and markups). Use GET /workspace to get archiveFolderId; then GET /items/:archiveFolderId/items to list archived items. Supports cursor-based pagination via query params: limit, since, before, ttl.
curl "https://api.markup.io/api/v2/items/ac735ce8-a716-4275-85b4-1cd70b898298/items" \
-X GET \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json"204 No ContentRequest Path Params IdRequestParam
| Option | Type | |
|---|---|---|
| id | string |
Request Query Params FolderItemsRequest
| Option | Type | |
|---|---|---|
| order optional | ||
| page optional | number | |
| limit optional | number | |
| before optional | string | |
| since optional | string | |
| ttl optional | number |
Create Folder
POST /api/v2/items
Create a new folder under the given parent. Body: parentFolderId, name, optional fallbackName.
curl "https://api.markup.io/api/v2/items" \
-X POST \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" \
--data '{
"parentFolderId": "8f8e17e0-cd16-4606-8c4f-86c8eed4734e",
"name": "some name"
}'204 No ContentRequest Body CreateFolderRequest
| Option | Type | |
|---|---|---|
| parentFolderId | string | |
| name | string | |
| fallbackName optional | string |
Archive Items
PATCH /api/v2/items/archive
Move folder items (folders and markups) to the workspace archive. Body: folderItemIds, optional withPath (“0”|“1”).
curl "https://api.markup.io/api/v2/items/archive" \
-X PATCH \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" \
--data '{
"folderItemIds": "462bf896-2028-4e28-8286-e30964021b2e"
}'204 No ContentRequest Body ArchiveFolderItemsRequest
| Option | Type | |
|---|---|---|
| folderItemIds | string[] |
Restore Items
PATCH /api/v2/items/restore
Restore folder items from the workspace archive to the root. Body: folderItemIds, optional withPath (“0”|“1”).
curl "https://api.markup.io/api/v2/items/restore" \
-X PATCH \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" \
--data '{
"folderItemIds": "2c2a035f-75b1-4061-92a5-0c9e4cb4318b"
}'204 No ContentRequest Body ArchiveFolderItemsRequest
| Option | Type | |
|---|---|---|
| folderItemIds | string[] |
Update Item
PATCH /api/v2/items/:id
Rename a folder or markup. Body: name. Same endpoint for both types.
curl "https://api.markup.io/api/v2/items/b9184211-0e33-4140-b9e5-3f0ea3a7a5bd" \
-X PATCH \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" \
--data '{
"name": "some name"
}'204 No ContentRequest Path Params IdRequestParam
| Option | Type | |
|---|---|---|
| id | string |
Request Body UpdateItemRequest
| Option | Type | |
|---|---|---|
| name | string |
Delete Item
DELETE /api/v2/items/:id
Delete a folder or markup by ID. Same endpoint for both types; no need to call different APIs.
curl "https://api.markup.io/api/v2/items/196588a3-262e-44cd-9671-34faa9229ab1" \
-X DELETE \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json"204 No ContentRequest Path Params IdRequestParam
| Option | Type | |
|---|---|---|
| id | string |
Related types
FolderItemOrder
| Option | Type | |
|---|---|---|
| FolderItemOrder | `az` | `za` | `activity` | `created` |
FolderWithAncestorsResponse | MarkupResponse
| Option | Type | |
|---|---|---|
| FolderWithAncestorsResponse | MarkupResponse |
WebpageMarkupResponse
| Option | Type | |
|---|---|---|
| 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[] | |
| url | string |
ImageMarkupResponse
| Option | Type | |
|---|---|---|
| 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[] | |
| originalMimeType | string | |
| images | MarkupImage[] | |
| 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 |
VideoMarkupResponse
| Option | Type | |
|---|---|---|
| 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[] | |
| video | MarkupVideo | |
| 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 |