Skip to content

Boards API Reference ​

The Boards API provides endpoints for creating, retrieving, updating, and deleting collaborative whiteboards. All board operations require API key authentication.

Authentication ​

All Boards API endpoints require API key authentication:

bash
curl -H "X-API-Key: your-api-key" \
  https://api.boardapi.io/api/v1/boards

API keys are passed via the X-API-Key header. Get your API key from the Developer Dashboard.

Base URL ​

https://api.boardapi.io/api/v1

For development:

http://localhost:4000/api/v1

Endpoints Overview ​

MethodEndpointDescription
POST/boardsCreate a new board
GET/boardsList all boards for organization
GET/boards/by-ownerGet boards by external owner ID
GET/boards/:uuidRetrieve board details
GET/boards/:uuid/access-linksGet board access links
PATCH/boards/:uuidUpdate board metadata
DELETE/boards/:uuidDelete a board
POST/boards/:uuid/end-sessionEnd active board session
POST/boards/:uuid/duplicateDuplicate a board
PATCH/boards/:uuid/archiveArchive or restore a board

Create Board ​

Creates a new collaborative whiteboard with optional initial objects and webhook configuration.

Request ​

http
POST /boards
X-API-Key: your-api-key
Content-Type: application/json

{
  "title": "English Lesson",
  "external_id": "lesson_123",
  "expires_in_hours": 48,
  "config": {
    "max_participants": 30,
    "allow_anonymous": true
  },
  "initial_objects": [
    {
      "type": "vocabulary-card",
      "data": {
        "word": "apple",
        "translation": "яблоко"
      },
      "position": { "x": 100, "y": 100 }
    }
  ],
  "webhook_url": "https://api.client.com/webhooks"
}

Request Body Parameters ​

ParameterTypeRequiredDescription
titlestringYesBoard title (max 255 characters)
external_idstringNoYour system's reference ID for this board
expires_in_hoursnumberNoBoard expiration time in hours (default: 72)
configobjectNoBoard configuration options
config.max_participantsnumberNoMaximum allowed participants (default: 50)
config.allow_anonymousbooleanNoAllow access without registration (default: true)
initial_objectsarrayNoArray of objects to create on the board
webhook_urlstringNoWebhook URL for board events

Initial Objects Structure ​

Each object in initial_objects array:

json
{
  "type": "vocabulary-card",
  "data": {
    "word": "apple",
    "translation": "яблоко",
    "image_url": "https://cdn.example.com/apple.jpg"
  },
  "position": {
    "x": 100,
    "y": 100
  }
}
FieldTypeRequiredDescription
typestringYesObject type (e.g., vocabulary-card, shape, text)
dataobjectYesObject data (validated against object type schema)
positionobjectYesPosition on canvas
position.xnumberYesX coordinate (pixels)
position.ynumberYesY coordinate (pixels)

Response ​

Status Code: 201 Created

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "English Lesson",
  "external_id": "lesson_123",
  "status": "active",
  "created_at": "2025-11-14T10:00:00Z",
  "expires_at": "2025-11-16T10:00:00Z",
  "access_links": {
    "host": "https://app.boardapi.io/board/a1b2c3d4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "guest": "https://app.boardapi.io/board/a1b2c3d4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

Response Fields ​

FieldTypeDescription
board_uuidstringUnique board identifier (UUID)
titlestringBoard title
external_idstringYour system's reference ID
statusstringBoard status (active, archived, expired)
created_atstringISO 8601 creation timestamp
expires_atstringISO 8601 expiration timestamp
access_links.hoststringURL with host token (full control)
access_links.gueststringURL with guest token (read/write)

Example Requests ​

JavaScript/TypeScript:

javascript
const response = await fetch('https://api.boardapi.io/api/v1/boards', {
  method: 'POST',
  headers: {
    'X-API-Key': 'your-api-key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    title: 'English Lesson',
    external_id: 'lesson_123',
    expires_in_hours: 48,
    initial_objects: [
      {
        type: 'vocabulary-card',
        data: {
          word: 'apple',
          translation: 'яблоко'
        },
        position: { x: 100, y: 100 }
      }
    ],
    webhook_url: 'https://api.client.com/webhooks'
  })
});

const board = await response.json();
console.log(board.access_links.host); // Share with teacher
console.log(board.access_links.guest); // Share with students

cURL:

bash
curl -X POST https://api.boardapi.io/api/v1/boards \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "English Lesson",
    "external_id": "lesson_123",
    "expires_in_hours": 48,
    "initial_objects": [
      {
        "type": "vocabulary-card",
        "data": {
          "word": "apple",
          "translation": "яблоко"
        },
        "position": {"x": 100, "y": 100}
      }
    ],
    "webhook_url": "https://api.client.com/webhooks"
  }'

PHP:

php
<?php
$ch = curl_init('https://api.boardapi.io/api/v1/boards');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'X-API-Key: your-api-key',
        'Content-Type: application/json'
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'English Lesson',
        'external_id' => 'lesson_123',
        'expires_in_hours' => 48,
        'initial_objects' => [
            [
                'type' => 'vocabulary-card',
                'data' => [
                    'word' => 'apple',
                    'translation' => 'яблоко'
                ],
                'position' => ['x' => 100, 'y' => 100]
            ]
        ],
        'webhook_url' => 'https://api.client.com/webhooks'
    ]),
    CURLOPT_RETURNTRANSFER => true
]);

$board = json_decode(curl_exec($ch), true);
echo $board['access_links']['host'];

Possible Errors ​

Status CodeErrorDescription
400Bad RequestMissing required fields or invalid data format
401UnauthorizedInvalid or missing API key
413Payload Too LargeRequest body exceeds size limit
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer error occurred

Get Board ​

Retrieves board metadata and current state.

Request ​

http
GET /boards/:id
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
idstringBoard UUID

Query Parameters ​

ParameterTypeDescription
includeObjectsbooleanInclude canvas objects in response (default: true)
includeParticipantsbooleanInclude current participants list (default: false)

Response ​

Status Code: 200 OK

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "English Lesson",
  "external_id": "lesson_123",
  "status": "active",
  "created_at": "2025-11-14T10:00:00Z",
  "updated_at": "2025-11-14T12:30:45Z",
  "expires_at": "2025-11-16T10:00:00Z",
  "state": {
    "version": 42,
    "objects": [
      {
        "id": "obj_1",
        "type": "vocabulary-card",
        "data": {
          "word": "apple",
          "translation": "яблоко"
        },
        "position": {
          "x": 100,
          "y": 100
        },
        "created_at": "2025-11-14T10:00:00Z",
        "created_by": "user_123"
      }
    ]
  },
  "participants": [
    {
      "user_id": "user_1",
      "role": "host",
      "joined_at": "2025-11-14T10:00:00Z",
      "color": "#FF6B6B"
    },
    {
      "user_id": "user_2",
      "role": "guest",
      "joined_at": "2025-11-14T10:05:00Z",
      "color": "#4ECDC4"
    }
  ],
  "participants_count": 2,
  "objects_count": 1
}

Response Fields ​

FieldTypeDescription
board_uuidstringBoard identifier
titlestringBoard title
statusstringBoard status
stateobjectCurrent board state (canvas objects)
state.versionnumberState version for conflict resolution
state.objectsarrayArray of objects on canvas
participantsarrayActive participants (if requested)
participants_countnumberTotal active participants
objects_countnumberTotal objects on board

Example Requests ​

JavaScript/TypeScript:

javascript
const response = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4?includeObjects=true&includeParticipants=true',
  {
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const board = await response.json();
console.log(`Board: ${board.title}`);
console.log(`Participants: ${board.participants_count}`);
console.log(`Objects: ${board.objects_count}`);

cURL:

bash
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4?includeObjects=true'

PHP:

php
<?php
$headers = ['X-API-Key: your-api-key'];
$board = json_decode(
  file_get_contents(
    'https://api.boardapi.io/api/v1/boards/a1b2c3d4?includeObjects=true',
    false,
    stream_context_create(['http' => ['header' => implode("\r\n", $headers)]])
  ),
  true
);

echo "Board: {$board['title']}\n";
echo "Participants: {$board['participants_count']}\n";

Possible Errors ​

Status CodeErrorDescription
404Not FoundBoard does not exist
401UnauthorizedInvalid API key
410GoneBoard has expired

Update Board ​

Updates board metadata such as title, expiration, or webhook URL.

Request ​

http
PATCH /boards/:id
X-API-Key: your-api-key
Content-Type: application/json

{
  "title": "Updated Lesson Title",
  "expires_in_hours": 72,
  "webhook_url": "https://api.client.com/webhooks-v2"
}

URL Parameters ​

ParameterTypeDescription
idstringBoard UUID

Request Body Parameters ​

ParameterTypeRequiredDescription
titlestringNoNew board title
expires_in_hoursnumberNoNew expiration time
webhook_urlstringNoNew webhook URL for events
configobjectNoUpdated board configuration

Response ​

Status Code: 200 OK

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "Updated Lesson Title",
  "updated_at": "2025-11-14T13:00:00Z",
  "expires_at": "2025-11-17T10:00:00Z"
}

Example Requests ​

JavaScript/TypeScript:

javascript
const response = await fetch('https://api.boardapi.io/api/v1/boards/a1b2c3d4', {
  method: 'PATCH',
  headers: {
    'X-API-Key': 'your-api-key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    title: 'Updated Lesson Title',
    expires_in_hours: 72
  })
});

const updated = await response.json();
console.log(`Updated: ${updated.title}`);

cURL:

bash
curl -X PATCH https://api.boardapi.io/api/v1/boards/a1b2c3d4 \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Updated Lesson Title",
    "expires_in_hours": 72
  }'

Possible Errors ​

Status CodeErrorDescription
400Bad RequestInvalid update data
404Not FoundBoard does not exist
401UnauthorizedInvalid API key

Delete Board ​

Deletes a board and all associated data. This operation is permanent and cannot be undone.

Request ​

http
DELETE /boards/:id
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
idstringBoard UUID

Response ​

Status Code: 204 No Content

No response body is returned on success.

Example Requests ​

JavaScript/TypeScript:

javascript
const response = await fetch('https://api.boardapi.io/api/v1/boards/a1b2c3d4', {
  method: 'DELETE',
  headers: {
    'X-API-Key': 'your-api-key'
  }
});

if (response.status === 204) {
  console.log('Board deleted successfully');
}

cURL:

bash
curl -X DELETE https://api.boardapi.io/api/v1/boards/a1b2c3d4 \
  -H "X-API-Key: your-api-key"

PHP:

php
<?php
$ch = curl_init('https://api.boardapi.io/api/v1/boards/a1b2c3d4');

curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_HTTPHEADER => ['X-API-Key: your-api-key'],
    CURLOPT_RETURNTRANSFER => true
]);

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 204) {
    echo "Board deleted successfully";
}

Possible Errors ​

Status CodeErrorDescription
404Not FoundBoard does not exist
401UnauthorizedInvalid API key

List All Boards ​

Retrieves a list of all boards for the authenticated organization, with optional status filtering.

Request ​

http
GET /boards?status=active
X-API-Key: your-api-key

Query Parameters ​

ParameterTypeRequiredDescription
statusstringNoFilter by board status: active, archived, expired

Response ​

Status Code: 200 OK

json
[
  {
    "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "title": "English Lesson",
    "external_id": "lesson_123",
    "status": "active",
    "created_at": "2025-11-14T10:00:00Z",
    "updated_at": "2025-11-14T12:30:45Z",
    "expires_at": "2025-11-16T10:00:00Z",
    "participants_count": 5,
    "objects_count": 12
  },
  {
    "board_uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "title": "Math Practice",
    "external_id": "lesson_124",
    "status": "active",
    "created_at": "2025-11-14T11:00:00Z",
    "updated_at": "2025-11-14T11:15:00Z",
    "expires_at": "2025-11-16T11:00:00Z",
    "participants_count": 3,
    "objects_count": 8
  }
]

Example Requests ​

JavaScript/TypeScript:

javascript
// Get all active boards
const response = await fetch('https://api.boardapi.io/api/v1/boards?status=active', {
  headers: {
    'X-API-Key': 'your-api-key'
  }
});

const boards = await response.json();
console.log(`Total active boards: ${boards.length}`);

cURL:

bash
# Get all boards
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards'

# Get only active boards
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards?status=active'

# Get only archived boards
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards?status=archived'

PHP:

php
<?php
$headers = ['X-API-Key: your-api-key'];
$boards = json_decode(
  file_get_contents(
    'https://api.boardapi.io/api/v1/boards?status=active',
    false,
    stream_context_create(['http' => ['header' => implode("\r\n", $headers)]])
  ),
  true
);

echo "Total boards: " . count($boards) . "\n";
foreach ($boards as $board) {
    echo "- {$board['title']} ({$board['participants_count']} participants)\n";
}

Possible Errors ​

Status CodeErrorDescription
401UnauthorizedInvalid API key
400Bad RequestInvalid status value

Get Boards by Owner ​

Retrieves all boards associated with a specific external owner ID.

Request ​

http
GET /boards/by-owner?externalId=user_12345
X-API-Key: your-api-key

Query Parameters ​

ParameterTypeRequiredDescription
externalIdstringYesExternal owner ID from your system

Response ​

Status Code: 200 OK

json
[
  {
    "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "title": "User's Board 1",
    "external_id": "lesson_123",
    "owner_external_id": "user_12345",
    "status": "active",
    "created_at": "2025-11-14T10:00:00Z",
    "expires_at": "2025-11-16T10:00:00Z"
  },
  {
    "board_uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "title": "User's Board 2",
    "external_id": "lesson_124",
    "owner_external_id": "user_12345",
    "status": "active",
    "created_at": "2025-11-14T11:00:00Z",
    "expires_at": "2025-11-16T11:00:00Z"
  }
]

Example Requests ​

JavaScript/TypeScript:

javascript
// Get all boards owned by a specific user
const userId = 'teacher_456';
const response = await fetch(
  `https://api.boardapi.io/api/v1/boards/by-owner?externalId=${userId}`,
  {
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const userBoards = await response.json();
console.log(`Teacher has ${userBoards.length} boards`);

cURL:

bash
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/by-owner?externalId=teacher_456'

PHP:

php
<?php
$teacherId = 'teacher_456';
$url = 'https://api.boardapi.io/api/v1/boards/by-owner?externalId=' . urlencode($teacherId);
$boards = json_decode(
  file_get_contents($url, false, stream_context_create([
    'http' => ['header' => 'X-API-Key: your-api-key']
  ])),
  true
);

echo "Teacher has " . count($boards) . " boards\n";

Use Cases ​

  • Display all boards created by a teacher in your LMS
  • Show student's personal boards in their dashboard
  • Filter boards by organization department or team

Possible Errors ​

Status CodeErrorDescription
401UnauthorizedInvalid API key
400Bad RequestMissing externalId parameter

Retrieves the host and guest access links for an existing board. Useful for re-sharing board URLs or integrating into your UI.

Request ​

http
GET /boards/:uuid/access-links
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
uuidstringBoard UUID

Response ​

Status Code: 200 OK

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "access_links": {
    "host": "https://app.boardapi.io/board/a1b2c3d4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJib2FyZFV1aWQiOiJhMWIyYzNkNCIsInJvbGUiOiJob3N0In0...",
    "guest": "https://app.boardapi.io/board/a1b2c3d4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJib2FyZFV1aWQiOiJhMWIyYzNkNCIsInJvbGUiOiJndWVzdCJ9..."
  }
}

Response Fields ​

FieldTypeDescription
board_uuidstringBoard identifier
access_links.hoststringHost access link (full permissions)
access_links.gueststringGuest access link (read/write)

Example Requests ​

JavaScript/TypeScript:

javascript
// Get access links for a board
const response = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/access-links',
  {
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const { access_links } = await response.json();

// Display in your UI
document.getElementById('host-link').value = access_links.host;
document.getElementById('guest-link').value = access_links.guest;

cURL:

bash
curl -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/access-links'

PHP:

php
<?php
$boardId = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
$result = json_decode(
  file_get_contents(
    "https://api.boardapi.io/api/v1/boards/{$boardId}/access-links",
    false,
    stream_context_create(['http' => ['header' => 'X-API-Key: your-api-key']])
  ),
  true
);

echo "Host link: {$result['access_links']['host']}\n";
echo "Guest link: {$result['access_links']['guest']}\n";

Use Cases ​

  • Display board links in your application UI
  • Send invitation emails with board access
  • Regenerate links for existing boards
  • Implement "Copy Link" functionality

Possible Errors ​

Status CodeErrorDescription
404Not FoundBoard does not exist
401UnauthorizedInvalid API key
410GoneBoard has expired

End Board Session ​

Ends the active session for a board, disconnecting all participants and marking the session as completed. The board itself is not deleted and can be accessed again later.

Request ​

http
POST /boards/:uuid/end-session
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
uuidstringBoard UUID

Response ​

Status Code: 200 OK

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "session_ended_at": "2025-11-14T15:30:00Z",
  "status": "active",
  "message": "Session ended successfully. All participants have been disconnected."
}

Response Fields ​

FieldTypeDescription
board_uuidstringBoard identifier
session_ended_atstringISO 8601 timestamp of session end
statusstringBoard status (remains active)
messagestringConfirmation message

Example Requests ​

JavaScript/TypeScript:

javascript
// End board session (e.g., when lesson is finished)
const response = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/end-session',
  {
    method: 'POST',
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const result = await response.json();
console.log(result.message);
// "Session ended successfully. All participants have been disconnected."

cURL:

bash
curl -X POST \
  -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/end-session'

PHP:

php
<?php
$ch = curl_init('https://api.boardapi.io/api/v1/boards/a1b2c3d4/end-session');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: your-api-key'],
    CURLOPT_RETURNTRANSFER => true
]);

$result = json_decode(curl_exec($ch), true);
echo $result['message'];

Use Cases ​

  • End online lesson/class session
  • Force disconnect all participants for maintenance
  • Complete collaborative work session
  • Trigger end-of-session webhooks

Behavior ​

  • All connected WebSocket clients are disconnected
  • Session metadata is updated with end timestamp
  • Board state is preserved and can be accessed later
  • Board status remains active (not archived)
  • New participants can still join after session ends

Possible Errors ​

Status CodeErrorDescription
404Not FoundBoard does not exist
401UnauthorizedInvalid API key

Duplicate Board ​

Creates an exact copy of an existing board, including all objects and configuration. The new board gets a new UUID and fresh access links.

Request ​

http
POST /boards/:uuid/duplicate
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
uuidstringBoard UUID to duplicate

Response ​

Status Code: 201 Created

json
{
  "board_uuid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "title": "English Lesson (Copy)",
  "external_id": "lesson_123_copy",
  "status": "active",
  "created_at": "2025-11-14T16:00:00Z",
  "expires_at": "2025-11-16T16:00:00Z",
  "access_links": {
    "host": "https://app.boardapi.io/board/c3d4e5f6?token=...",
    "guest": "https://app.boardapi.io/board/c3d4e5f6?token=..."
  },
  "source_board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Response Fields ​

FieldTypeDescription
board_uuidstringNew board UUID
titlestringNew board title (original + " (Copy)")
external_idstringNew external ID (original + "_copy")
statusstringBoard status (always active)
access_linksobjectNew access links for the duplicated board
source_board_uuidstringOriginal board UUID

What Gets Duplicated ​

βœ… Copied:

  • All objects on the canvas (with positions)
  • Board title (with " (Copy)" suffix)
  • Board configuration (max_participants, allow_anonymous, etc.)
  • External ID (with "_copy" suffix)
  • Webhook URL

❌ Not Copied:

  • Board UUID (new UUID is generated)
  • Access tokens (new tokens are generated)
  • Participant history
  • Session history
  • Creation/update timestamps

Example Requests ​

JavaScript/TypeScript:

javascript
// Duplicate a board (e.g., reuse lesson template)
const response = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/duplicate',
  {
    method: 'POST',
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const newBoard = await response.json();
console.log(`Duplicated board: ${newBoard.board_uuid}`);
console.log(`New host link: ${newBoard.access_links.host}`);

cURL:

bash
curl -X POST \
  -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/duplicate'

PHP:

php
<?php
$ch = curl_init('https://api.boardapi.io/api/v1/boards/a1b2c3d4/duplicate');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: your-api-key'],
    CURLOPT_RETURNTRANSFER => true
]);

$newBoard = json_decode(curl_exec($ch), true);
echo "New board: {$newBoard['board_uuid']}\n";
echo "Host link: {$newBoard['access_links']['host']}\n";

Use Cases ​

  • Reuse lesson templates for multiple classes
  • Create backup copies before major changes
  • Fork boards for different student groups
  • Create variations of successful board layouts

Possible Errors ​

Status CodeErrorDescription
404Not FoundSource board does not exist
401UnauthorizedInvalid API key
410GoneSource board has expired

Archive Board ​

Archives or restores a board. Archived boards are hidden from the default board list but can still be accessed and unarchived later.

Request ​

http
PATCH /boards/:uuid/archive
X-API-Key: your-api-key

URL Parameters ​

ParameterTypeDescription
uuidstringBoard UUID

Response ​

Status Code: 200 OK

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "English Lesson",
  "status": "archived",
  "archived_at": "2025-11-14T17:00:00Z",
  "message": "Board archived successfully"
}

Or when unarchiving:

json
{
  "board_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "English Lesson",
  "status": "active",
  "restored_at": "2025-11-14T17:30:00Z",
  "message": "Board restored successfully"
}

Response Fields ​

FieldTypeDescription
board_uuidstringBoard identifier
titlestringBoard title
statusstringNew status (archived or active)
archived_atstringTimestamp when archived (if archiving)
restored_atstringTimestamp when restored (if unarchiving)
messagestringConfirmation message

Behavior ​

When archiving:

  • Board status changes from active to archived
  • Board is hidden from GET /boards (unless ?status=archived)
  • Existing access links continue to work
  • Active sessions are not disconnected
  • Board data is preserved

When unarchiving:

  • Board status changes from archived to active
  • Board appears in GET /boards again
  • All data and access links remain unchanged

Example Requests ​

JavaScript/TypeScript:

javascript
// Archive a board
const response = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/archive',
  {
    method: 'PATCH',
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const result = await response.json();
console.log(result.message); // "Board archived successfully"

// To unarchive, call the same endpoint again
const restoreResponse = await fetch(
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/archive',
  {
    method: 'PATCH',
    headers: {
      'X-API-Key': 'your-api-key'
    }
  }
);

const restored = await restoreResponse.json();
console.log(restored.message); // "Board restored successfully"

cURL:

bash
# Archive board
curl -X PATCH \
  -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/archive'

# Unarchive board (call same endpoint again)
curl -X PATCH \
  -H "X-API-Key: your-api-key" \
  'https://api.boardapi.io/api/v1/boards/a1b2c3d4/archive'

PHP:

php
<?php
// Archive board
$ch = curl_init('https://api.boardapi.io/api/v1/boards/a1b2c3d4/archive');

curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => ['X-API-Key: your-api-key'],
    CURLOPT_RETURNTRANSFER => true
]);

$result = json_decode(curl_exec($ch), true);
echo $result['message'];

// The endpoint toggles status, so calling it again will restore

Use Cases ​

  • Archive completed lessons/sessions
  • Clean up board list without deleting
  • Preserve historical boards for review
  • Temporarily hide inactive boards

Archive vs Delete ​

OperationStatusDataAccess LinksReversible
ArchivearchivedPreservedWorkYes (toggle)
DeleteN/ADeletedBrokenNo

Possible Errors ​

Status CodeErrorDescription
404Not FoundBoard does not exist
401UnauthorizedInvalid API key

Response Status Codes ​

CodeMeaningDescription
200OKRequest succeeded
201CreatedResource created successfully
204No ContentRequest succeeded with no response body
400Bad RequestInvalid request parameters
401UnauthorizedMissing or invalid API key
404Not FoundResource not found
410GoneResource has expired
413Payload Too LargeRequest body too large
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer error occurred

Rate Limiting ​

All API endpoints are rate-limited based on your plan:

  • Standard: 1,000 requests/hour
  • Premium: 10,000 requests/hour

Rate limit information is included in response headers:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1642512000

Common Use Cases ​

Create a Board for a Lesson ​

javascript
const lesson = {
  title: 'English Lesson: Animals',
  lesson_id: 12345,
  vocabulary: [
    { word: 'cat', translation: 'ΠΊΠΎΡ‚' },
    { word: 'dog', translation: 'собака' }
  ]
};

const board = await createBoard({
  title: lesson.title,
  external_id: `lesson_${lesson.lesson_id}`,
  expires_in_hours: 24,
  initial_objects: lesson.vocabulary.map((word, i) => ({
    type: 'vocabulary-card',
    data: word,
    position: { x: 100 + (i * 220), y: 100 }
  })),
  webhook_url: 'https://api.myschool.com/webhooks'
});

// Share URLs with teacher and students
teacher.board_url = board.access_links.host;
students.board_url = board.access_links.guest;

Monitor Board Activity ​

javascript
// Periodically check board state
setInterval(async () => {
  const board = await fetch(`/api/v1/boards/${boardId}`, {
    headers: { 'X-API-Key': apiKey }
  }).then(r => r.json());

  console.log(`Active participants: ${board.participants_count}`);
  console.log(`Objects on board: ${board.objects_count}`);
}, 30000); // Every 30 seconds

Clean Up Expired Boards ​

javascript
// Delete boards when they're no longer needed
async function cleanup() {
  const boards = await listBoards();

  for (const board of boards) {
    if (new Date(board.expires_at) < new Date()) {
      await fetch(`/api/v1/boards/${board.board_uuid}`, {
        method: 'DELETE',
        headers: { 'X-API-Key': apiKey }
      });
    }
  }
}

Next Steps ​