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/eb91f902-a103-477c-b645-2d8cd5d4ce4b" \
-X GET \
-H "Authorization: Bearer <API-KEY-SECRET>" \
-H "Markup-API-Version: 2023-02-22" \
-H "Content-Type: application/json" {
"data": {
"id": "85978f40-bcdf-4e7a-b3dd-ed4ae3663add",
"createdAt": "2026-06-29T11:29:57.943Z",
"modifiedAt": "2026-06-29T11:29:57.944Z",
"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/d7015afc-11f7-4650-a7ef-308b0dd5b474/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": "239cefc0-8e62-48fc-a854-3c8992c3eb47",
"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": "cf25753e-cc7d-4af1-bdbb-cae4867a9abc"
}'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": "0ad3ef72-94de-4338-bfbb-6f104587fb7b"
}'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/4483ea04-e04a-413f-94a9-8d03bc49d4b5" \
-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/d3555b1e-8301-4702-90ae-ba04df9da044" \
-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 |