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/16f269e6-ca66-4178-9aff-d176565b9658" \
-X GET \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" {
"data": {
"id": "c715aced-b6ef-4267-895d-1cca061ea76c",
"createdAt": "2026-07-23T17:45:55.654Z",
"modifiedAt": "2026-07-23T17:45:55.654Z",
"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/6efe61cc-893e-4e5d-b5b5-c813c1db4680/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": "908371f2-cfd4-4afd-9149-6e1c69608b01",
"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": "67ba3578-5f7f-40a1-8ec1-d011a041812f"
}'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": "14d3c1d5-2fad-4341-b8ba-da5c66591301"
}'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/831a2c1f-77ab-4af1-9bc5-93d24c8d2f6d" \
-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/8d7d329c-987f-477d-81b4-c9f5512b8cf8" \
-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 |