Boards
Board endpoints let you retrieve the project board tree and a board's items, inspect a board, and create or modify boards and board folders.
Endpoints
Get boards # GET/api/v1/{hash}/board
/api/v1/{hash}/boardRequest
GET /api/v1/{hash}/boardcurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board"Response
Returns 200 OK.
The response includes the root board so clients can reconstruct the complete board and folder hierarchy. The root is an internal folder container with parentId: null; it is not a playable board and cannot be moved or deleted.
[
{
"id": "b0",
"name": "Root",
"type": "folder",
"parentId": null,
"children": ["folder_1"],
"elementCount": 0,
"noteCount": 0,
"connectionCount": 0,
"branchCount": 0,
"jumperCount": 0
},
{
"id": "folder_1",
"name": "Chapter One",
"type": "folder",
"parentId": "b0",
"children": ["b1"],
"elementCount": 0,
"noteCount": 0,
"connectionCount": 0,
"branchCount": 0,
"jumperCount": 0
},
{
"id": "b1",
"name": "Main Board",
"type": "board",
"parentId": "folder_1",
"children": [],
"elementCount": 5,
"noteCount": 3,
"connectionCount": 10,
"branchCount": 3,
"jumperCount": 1
}
]Summary fields
| Field | Description |
|---|---|
id | Board or folder ID. |
name | Board or folder name. |
type | board for a regular board or folder for the root and board folders. Use this field to determine the resource type. |
parentId | ID of the direct parent folder. The root returns null. |
children | IDs of the folder's direct child boards and folders. Regular boards cannot have children and return an empty array. |
elementCount | Number of elements directly contained by a regular board. |
noteCount | Number of notes directly contained by a regular board. |
connectionCount | Number of connections directly contained by a regular board. |
branchCount | Number of branches directly contained by a regular board. |
jumperCount | Number of jumpers directly contained by a regular board. |
The response uses the same fields for every entry to provide a stable schema. Folder entries—including the root—cannot directly contain project items, so their item counts are 0. Regular boards cannot contain child boards or folders, so their children value is [].
Get board elements # GET/api/v1/{hash}/board/{boardID}/elements
/api/v1/{hash}/board/{boardID}/elementsRequest
GET /api/v1/{hash}/board/{boardID}/elementscurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/elements"Response
Returns 200 OK.
[
{
"id": "e2",
"title": "String title",
"x": 10205,
"y": 10769,
"width": 138,
"height": 100,
"theme": "red",
"hasContent": true,
"componentCount": 0,
"attributeCount": 2,
"outputCount": 4
}
]Get board notes # GET/api/v1/{hash}/board/{boardID}/notes
/api/v1/{hash}/board/{boardID}/notesRequest
GET /api/v1/{hash}/board/{boardID}/notescurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/notes"Response
Returns 200 OK with compact note objects in board order:
[
{
"id": "n1",
"content": "Testing note",
"x": 3100,
"y": 2200,
"width": 50,
"height": 100,
"theme": "cyan",
"autoHeight": true
}
]Get board jumpers # GET/api/v1/{hash}/board/{boardID}/jumpers
/api/v1/{hash}/board/{boardID}/jumpersRequest
GET /api/v1/{hash}/board/{boardID}/jumperscurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/jumpers"Response
Returns 200 OK with compact jumper objects in board order:
[
{
"id": "jump1",
"x": 900,
"y": 15000,
"width": 185,
"height": 86,
"elementId": "e1"
}
]Get board branches # GET/api/v1/{hash}/board/{boardID}/branches
/api/v1/{hash}/board/{boardID}/branchesRequest
GET /api/v1/{hash}/board/{boardID}/branchescurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/branches"Response
Returns 200 OK with compact branch objects in board order. Condition values are IDs, not expanded condition objects.
[
{
"id": "br2",
"x": 500,
"y": 500,
"theme": "default",
"conditions": {
"ifCondition": "cond3",
"elseIfConditions": ["cond4", "cond5", "cond6"],
"elseCondition": "cond7"
}
}
]Get board connections # GET/api/v1/{hash}/board/{boardID}/connections
/api/v1/{hash}/board/{boardID}/connectionsRequest
GET /api/v1/{hash}/board/{boardID}/connectionscurl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/connections"Response
Returns 200 OK with compact connection objects in board order:
[
{
"id": "con2",
"sourceid": "e2",
"sourceType": "elements",
"targetid": "e1",
"targetType": "elements",
"sourceFace": "right",
"targetFace": "left",
"label": "<p>Continue</p>",
"labelLocation": 0.5,
"labelWidth": 100,
"theme": "default",
"type": "Bezier"
}
]The five board-item collection endpoints return 404 Not Found when the board does not exist and 400 Bad Request when {boardID} identifies a folder, because folders cannot contain board items.
Get board # GET/api/v1/{hash}/board/{boardID}
/api/v1/{hash}/board/{boardID}Request
GET /api/v1/{hash}/board/{boardID}curl --request GET \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}"Response
Returns 200 OK with the stored board object:
{
"id": "b1",
"name": "Board 1",
"customId": "custom_b1",
"elements": ["e1", "e2"],
"notes": ["n1"],
"jumpers": ["jump1"],
"branches": ["br1"],
"connections": ["con1", "con2"],
"comments": ["comment1"],
"attributes": ["board_attribute_9"]
}Regular boards include their item and attribute ID collections. Folder boards contain children instead of board-item collections. Use the attribute endpoints to read and modify board attributes.
The comments collection contains thread IDs. Use List project comments to retrieve thread content and replies, and match each thread's position.id to the board ID.
Create board or folder # POST/api/v1/{hash}/board
/api/v1/{hash}/boardRequest
POST /api/v1/{hash}/boardcurl --request POST \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data @payload.json \
"https://arcweave.com/api/v1/PROJECT_HASH/board"Create a regular board:
{
"name": "API Board",
"customId": "apiBoard",
"parentId": "folder_1",
"index": 0
}Create a folder:
{
"type": "folder",
"name": "API Folder"
}| Property | Required | Type | Description |
|---|---|---|---|
type | No | String | board or folder. Defaults to board. |
name | No | String | Defaults to Untitled board for boards or New Folder for folders. |
customId | No | String | Arcscript ID for a regular board. A unique ID is generated from the name when omitted. Not accepted for folders. |
parentId | No | String or null | Parent folder ID. Defaults to the root board container. |
index | No | Non-negative integer or "-" | Position in the parent folder. Defaults to "-", which appends the item. |
The parent, when supplied, must exist and must be a folder.
A board customId must match ^[A-Za-z$][0-9A-Za-z_]*$: start with a letter or $, followed by letters, numbers, or underscores. It cannot be an Arcscript reserved identifier such as if, true, or random, or duplicate any existing board or component custom ID in the project.
Response
Returns 201 Created with the generated resource ID and project version data:
{
"version": 12,
"newVersion": 13,
"versionTime": ["1720788000", "123456"],
"id": "65139ea3-331f-4b25-88b4-ea7a65ff106c"
}Update board # PATCH/api/v1/{hash}/board/{boardID}
/api/v1/{hash}/board/{boardID}Request
PATCH /api/v1/{hash}/board/{boardID}curl --request PATCH \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data @payload.json \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}"{
"name": "Updated Board Name"
}Request fields:
| Property | Required | Type | Description |
|---|---|---|---|
name | No | String | Updated board or folder name. |
customId | No | String | Set a regular board custom ID only when one is missing. |
Supply at least one of name or customId. The custom ID must satisfy the creation rules. You may set a missing ID or resend the current one, but changing an existing non-empty custom ID is not supported. Folders do not accept customId.
Response
Returns 200 OK with project version data:
{
"version": 12,
"newVersion": 13,
"versionTime": ["1720788000", "123456"]
}Move or reorder board # PATCH/api/v1/{hash}/board/{boardID}/index
/api/v1/{hash}/board/{boardID}/indexRequest
PATCH /api/v1/{hash}/board/{boardID}/indexcurl --request PATCH \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data @payload.json \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}/index"{
"parentId": "folder_1",
"index": 0
}Request fields:
| Property | Required | Type | Description |
|---|---|---|---|
parentId | No | String or null | Target folder. Omit to keep the current parent; use null for the root. |
index | Yes | Non-negative integer | New position within the target folder. |
indexis required.- Omit
parentIdto reorder within the current folder. - Use
"parentId": nullto move the item to the root. - The target parent must be a folder.
- The root board cannot be moved.
- A folder cannot be moved into itself or one of its descendants.
Response
Returns 200 OK with project version data:
{
"version": 12,
"newVersion": 13,
"versionTime": ["1720788000", "123456"]
}Delete board # DELETE/api/v1/{hash}/board/{boardID}
/api/v1/{hash}/board/{boardID}Request
DELETE /api/v1/{hash}/board/{boardID}curl --request DELETE \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
"https://arcweave.com/api/v1/PROJECT_HASH/board/{boardID}"Deleting a board deletes its contents. Deleting a folder deletes its entire subtree, including the boards and their contents.
If the deleted board or folder subtree contains the project's starting element, Arcweave automatically clears the starting element to null. You do not need to clear it before deleting the board, and no replacement starting element is selected automatically. Use Set the starting element to select an element on a remaining board.
At least one playable board must remain. Deleting the last playable board, or a folder containing all remaining playable boards, returns 409 Conflict without applying the deletion. This error has type: "integrity_conflict" and conflictType: "invalid_target". A playable board is a regular board (type: "board"), even if it is empty; folders and the internal root do not count. Create another board before retrying the deletion if necessary.
The internal root cannot be deleted; attempting to delete it returns 400 Bad Request.
Response
Returns 200 OK with project version data:
{
"version": 12,
"newVersion": 13,
"versionTime": ["1720788000", "123456"]
}Common errors
| Status | Meaning |
|---|---|
400 | Invalid payload, folder used as an item board, root mutation, non-folder parent, or recursive move. |
403 | Project permission denied. |
404 | Project, board, or requested parent not found. |
409 | Deletion would leave no playable boards, or the board tree changed before the command was applied. |