Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone f6f2112e77bc8c011e38c83a
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
public/openapi.json
{
"openapi": "3.1.0",
"info": {
"title": "Tasks API",
"version": "1.0.0",
"summary": "Free kanban boards (a free Trello alternative) for people and their AI assistants.",
"description": "Make boards, add, change and move cards, comment, and read boards back. No account. Reading a board needs only its id (the secret in its link). Changing it needs the board key, returned once as boardKey when the board is made, in the x-board-key header. Errors are JSON with an error sentence that says what to change. Full guide: https://tasks-free.openapps.xyz/llms.txt",
"contact": {
"name": "OpenApps",
"url": "https://openapps.free/"
}
},
"servers": [
{
"url": "https://functions.openapps.xyz/apps/f6f2112e77bc8c011e38c83a/api"
}
],
"externalDocs": {
"url": "https://tasks-free.openapps.xyz/llms.txt",
"description": "llms.txt guide"
},
"components": {
"securitySchemes": {
"boardKey": {
"type": "apiKey",
"in": "header",
"name": "x-board-key",
"description": "The board's key (boardKey from POST /boards, or the part after #k= in the admin link). It also allows renaming, archiving and deleting the board, so keep it private."
}
},
"schemas": {
"Error": {
"type": "object",
"properties": {
"error": {
"type": "string"
}
},
"required": [
"error"
]
},
"Checklist": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"done": {
"type": "boolean"
}
},
"required": [
"text",
"done"
]
}
},
"Card": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"list": {
"type": "string"
},
"listId": {
"type": "string"
},
"position": {
"type": "integer",
"description": "Place in its list, from 0."
},
"description": {
"type": "string",
"description": "Markdown."
},
"due": {
"type": "string",
"description": "\"\" when there is none."
},
"done": {
"type": "boolean"
},
"labels": {
"type": "array",
"items": {
"type": "string"
}
},
"assignees": {
"type": "array",
"items": {
"type": "string"
}
},
"checklist": {
"$ref": "#/components/schemas/Checklist"
},
"cover": {
"type": "string"
},
"archived": {
"type": "boolean"
},
"url": {
"type": "string",
"format": "uri"
},
"comments": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Comment"
}
}
},
"required": [
"id",
"title",
"description",
"due",
"done",
"labels",
"assignees",
"checklist",
"archived",
"url"
]
},
"Comment": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"text": {
"type": "string"
},
"at": {
"type": "string",
"format": "date-time"
}
}
},
"List": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"archived": {
"type": "boolean"
},
"cards": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Card"
}
}
},
"required": [
"id",
"title",
"archived",
"cards"
]
},
"Board": {
"type": "object",
"properties": {
"board": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"archived": {
"type": "boolean"
}
}
},
"labels": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"green",
"yellow",
"orange",
"red",
"pink",
"purple",
"blue",
"sky",
"gray"
]
}
}
}
},
"members": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
},
"lists": {
"type": "array",
"items": {
"$ref": "#/components/schemas/List"
}
},
"counts": {
"type": "object",
"properties": {
"lists": {
"type": "integer"
},
"cards": {
"type": "integer"
}
}
}
},
"required": [
"board",
"labels",
"members",
"lists"
]
},
"CreatedBoard": {
"allOf": [
{
"$ref": "#/components/schemas/Board"
},
{
"type": "object",
"properties": {
"boardKey": {
"type": "string"
},
"adminUrl": {
"type": "string",
"format": "uri"
},
"note": {
"type": "string"
}
},
"required": [
"boardKey",
"adminUrl"
]
}
]
},
"CardInput": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500
},
"description": {
"type": "string",
"maxLength": 20000
},
"due": {
"type": [
"string",
"null"
],
"description": "Wall-clock date, \"2026-11-03\" or \"2026-11-03T15:00\". null or \"\" clears it.",
"examples": [
"2026-11-03"
]
},
"done": {
"type": "boolean",
"description": "The due date is complete."
},
"labels": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"description": "Labels by name or id. Names the board does not have yet are added. Replaces the whole list.",
"maxItems": 50
},
"assignees": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"description": "People by name or id. Names the board does not have yet are added. Replaces the whole list.",
"maxItems": 100
},
"checklist": {
"type": "array",
"maxItems": 100,
"description": "Replaces the whole checklist.",
"items": {
"oneOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 500
},
"done": {
"type": "boolean"
}
},
"required": [
"text"
]
}
]
}
},
"cover": {
"oneOf": [
{
"type": "string",
"enum": [
"green",
"yellow",
"orange",
"red",
"pink",
"purple",
"blue",
"sky",
"gray"
]
},
{
"type": "string",
"enum": [
""
]
}
]
},
"archived": {
"type": "boolean"
},
"list": {
"type": "string",
"description": "A list title or id."
},
"position": {
"description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
"oneOf": [
{
"type": "string",
"enum": [
"top",
"bottom"
]
},
{
"type": "integer",
"minimum": 0
}
]
}
}
},
"NewBoard": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"template": {
"type": "string",
"enum": [
"blank",
"kanban",
"weekly-plan",
"content-calendar",
"bug-tracker"
]
},
"lists": {
"type": "array",
"maxItems": 100,
"description": "List titles, or lists with cards. Defaults to To do, Doing, Done.",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"archived": {
"type": "boolean"
},
"cards": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"$ref": "#/components/schemas/CardInput"
}
]
}
}
},
"required": [
"title"
]
}
]
}
},
"labels": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"green",
"yellow",
"orange",
"red",
"pink",
"purple",
"blue",
"sky",
"gray"
]
}
}
}
},
"members": {
"type": "array",
"items": {
"type": "string"
}
},
"trello": {
"type": "object",
"description": "A Trello board's JSON export (up to 128 KB). Lists, cards, labels, checklists, due dates, members and comments come across."
}
}
}
}
},
"paths": {
"/templates": {
"get": {
"operationId": "listTemplates",
"summary": "List the board templates and what they contain",
"responses": {
"200": {
"description": "Templates",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"templates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"summary": {
"type": "string"
},
"lists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"cards": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
},
"example": {
"templates": [
{
"id": "kanban",
"name": "Kanban",
"summary": "To do, Doing and Done, with a few cards that show how a board works.",
"lists": [
{
"title": "To do",
"cards": [
"Drag a card to Doing when you start it"
]
},
{
"title": "Doing",
"cards": []
},
{
"title": "Done",
"cards": [
"Make a board"
]
}
]
}
]
}
}
}
}
}
}
},
"/boards": {
"post": {
"operationId": "createBoard",
"summary": "Make a board from a template, a description of lists and cards, or a Trello export",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewBoard"
},
"example": {
"title": "Website relaunch",
"lists": [
{
"title": "To do",
"cards": [
"Pick a hosting plan",
{
"title": "Write the About page",
"due": "2026-11-03",
"labels": [
"Copy"
],
"assignees": [
"Sam"
],
"checklist": [
"Draft",
"Review"
]
}
]
},
"Doing",
"Done"
],
"labels": [
{
"name": "Copy",
"color": "blue"
}
]
}
}
}
},
"responses": {
"201": {
"description": "The new board, with boardKey and adminUrl",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatedBoard"
},
"example": {
"board": {
"id": "aB3dE5fG7hJ9kL2mN4pQ",
"title": "Launch plan",
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
"archived": false
},
"labels": [
{
"id": "Lb2cD4eF6g",
"name": "High priority",
"color": "red"
}
],
"members": [
{
"id": "Mm7nP8qR9s",
"name": "Sam"
}
],
"lists": [
{
"id": "Hn4xW2pQ9r",
"title": "To do",
"archived": false,
"cards": [
{
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
]
},
{
"id": "Jk5yX3rS8t",
"title": "Doing",
"archived": false,
"cards": []
},
{
"id": "Tz6aB4cD7e",
"title": "Done",
"archived": false,
"cards": []
}
],
"counts": {
"lists": 3,
"cards": 1
},
"boardKey": "xY7zA2bC4dE6fG8hJ3kL5mN9",
"adminUrl": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/admin#k=xY7zA2bC4dE6fG8hJ3kL5mN9",
"note": "Give the person the board url..."
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
}
],
"get": {
"operationId": "getBoard",
"summary": "Read a board: lists in order with their cards, labels and people",
"parameters": [
{
"name": "archived",
"in": "query",
"required": false,
"description": "true to include archived lists and cards.",
"schema": {
"type": "string",
"enum": [
"true",
"false"
]
}
},
{
"name": "comments",
"in": "query",
"required": false,
"description": "true to include each card's comments.",
"schema": {
"type": "string",
"enum": [
"true",
"false"
]
}
},
{
"name": "format",
"in": "query",
"required": false,
"description": "json (default) or csv (one row per card).",
"schema": {
"type": "string",
"enum": [
"json",
"csv"
]
}
}
],
"responses": {
"200": {
"description": "The board",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Board"
},
"example": {
"board": {
"id": "aB3dE5fG7hJ9kL2mN4pQ",
"title": "Launch plan",
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
"archived": false
},
"labels": [
{
"id": "Lb2cD4eF6g",
"name": "High priority",
"color": "red"
}
],
"members": [
{
"id": "Mm7nP8qR9s",
"name": "Sam"
}
],
"lists": [
{
"id": "Hn4xW2pQ9r",
"title": "To do",
"archived": false,
"cards": [
{
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
]
},
{
"id": "Jk5yX3rS8t",
"title": "Doing",
"archived": false,
"cards": []
},
{
"id": "Tz6aB4cD7e",
"title": "Done",
"archived": false,
"cards": []
}
],
"counts": {
"lists": 3,
"cards": 1
}
}
},
"text/csv": {
"schema": {
"type": "string",
"description": "With format=csv: one row per card (List, Card, Description, Labels, Assigned to, Due, Done, Checklist, Archived)."
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
},
"patch": {
"operationId": "updateBoard",
"summary": "Rename, archive or restore a board",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"archived": {
"type": "boolean"
}
}
},
"example": {
"archived": true
}
}
}
},
"responses": {
"200": {
"description": "The board",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Board"
},
"example": {
"board": {
"id": "aB3dE5fG7hJ9kL2mN4pQ",
"title": "Launch plan",
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
"archived": false
},
"labels": [
{
"id": "Lb2cD4eF6g",
"name": "High priority",
"color": "red"
}
],
"members": [
{
"id": "Mm7nP8qR9s",
"name": "Sam"
}
],
"lists": [
{
"id": "Hn4xW2pQ9r",
"title": "To do",
"archived": false,
"cards": [
{
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
]
},
{
"id": "Jk5yX3rS8t",
"title": "Doing",
"archived": false,
"cards": []
},
{
"id": "Tz6aB4cD7e",
"title": "Done",
"archived": false,
"cards": []
}
],
"counts": {
"lists": 3,
"cards": 1
}
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
},
"delete": {
"operationId": "deleteBoard",
"summary": "Delete the board and everything on it, for everyone",
"security": [
{
"boardKey": []
}
],
"responses": {
"200": {
"description": "Deleted",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"deleted": {
"type": "string"
}
}
},
"example": {
"ok": true,
"deleted": "aB3dE5fG7hJ9kL2mN4pQ"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/lists": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
}
],
"post": {
"operationId": "addList",
"summary": "Add a list",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"position": {
"description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
"oneOf": [
{
"type": "string",
"enum": [
"top",
"bottom"
]
},
{
"type": "integer",
"minimum": 0
}
]
}
},
"required": [
"title"
]
},
"example": {
"title": "Waiting",
"position": 1
}
}
}
},
"responses": {
"201": {
"description": "The new list",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/List"
},
"example": {
"id": "Wq2eR4tY6u",
"title": "Waiting",
"archived": false,
"cards": []
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/lists/{listId}": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
},
{
"name": "listId",
"in": "path",
"required": true,
"description": "The list id, from GET /boards/{boardId}.",
"schema": {
"type": "string"
}
}
],
"patch": {
"operationId": "updateList",
"summary": "Rename, move, archive or restore a list",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"archived": {
"type": "boolean"
},
"position": {
"description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
"oneOf": [
{
"type": "string",
"enum": [
"top",
"bottom"
]
},
{
"type": "integer",
"minimum": 0
}
]
}
}
},
"example": {
"title": "Blocked"
}
}
}
},
"responses": {
"200": {
"description": "The list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"archived": {
"type": "boolean"
}
}
},
"example": {
"id": "Wq2eR4tY6u",
"title": "Blocked",
"archived": false
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/cards": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
}
],
"post": {
"operationId": "addCard",
"summary": "Add a card to a list",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/CardInput"
},
{
"required": [
"list",
"title"
]
}
]
},
"example": {
"list": "To do",
"title": "Write the brief",
"due": "2026-11-03",
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
"Outline",
"Draft"
]
}
}
}
},
"responses": {
"201": {
"description": "The new card",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Card"
},
"example": {
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"list": "To do",
"listId": "Hn4xW2pQ9r",
"position": 0,
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/cards/{cardId}": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
},
{
"name": "cardId",
"in": "path",
"required": true,
"description": "The card id, from GET /boards/{boardId}.",
"schema": {
"type": "string"
}
}
],
"get": {
"operationId": "getCard",
"summary": "Read one card with its comments",
"responses": {
"200": {
"description": "The card",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Card"
},
"example": {
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"list": "To do",
"listId": "Hn4xW2pQ9r",
"position": 0,
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw",
"comments": [
{
"id": "Cm1nB2vC3xZ4aS",
"name": "Sam",
"text": "On it.",
"at": "2026-10-19T14:02:11.000Z"
}
]
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
},
"patch": {
"operationId": "updateCard",
"summary": "Change a card, or move it with list and position",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CardInput"
},
"example": {
"done": true,
"list": "Done"
}
}
}
},
"responses": {
"200": {
"description": "The card",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Card"
},
"example": {
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"list": "Done",
"listId": "Hn4xW2pQ9r",
"position": 0,
"description": "",
"due": "2026-11-03",
"done": true,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
},
"delete": {
"operationId": "deleteCard",
"summary": "Delete a card and its comments for good",
"security": [
{
"boardKey": []
}
],
"responses": {
"200": {
"description": "Deleted",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"deleted": {
"type": "string"
}
}
},
"example": {
"ok": true,
"deleted": "Kq3vT8mZp2Lw"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/cards/{cardId}/move": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
},
{
"name": "cardId",
"in": "path",
"required": true,
"description": "The card id, from GET /boards/{boardId}.",
"schema": {
"type": "string"
}
}
],
"post": {
"operationId": "moveCard",
"summary": "Move a card to a list and position",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"list": {
"type": "string",
"description": "A list title or id."
},
"position": {
"description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
"oneOf": [
{
"type": "string",
"enum": [
"top",
"bottom"
]
},
{
"type": "integer",
"minimum": 0
}
]
}
}
},
"example": {
"list": "Doing",
"position": 0
}
}
}
},
"responses": {
"200": {
"description": "The moved card",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Card"
},
"example": {
"id": "Kq3vT8mZp2Lw",
"title": "Write the brief",
"list": "Doing",
"listId": "Hn4xW2pQ9r",
"position": 0,
"description": "",
"due": "2026-11-03",
"done": false,
"labels": [
"High priority"
],
"assignees": [
"Sam"
],
"checklist": [
{
"text": "Outline",
"done": true
},
{
"text": "Draft",
"done": false
}
],
"cover": "",
"archived": false,
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
},
"/boards/{boardId}/cards/{cardId}/comments": {
"parameters": [
{
"name": "boardId",
"in": "path",
"required": true,
"description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
"schema": {
"type": "string"
}
},
{
"name": "cardId",
"in": "path",
"required": true,
"description": "The card id, from GET /boards/{boardId}.",
"schema": {
"type": "string"
}
}
],
"post": {
"operationId": "addComment",
"summary": "Comment on a card",
"security": [
{
"boardKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 5000
},
"name": {
"type": "string",
"maxLength": 40,
"description": "Shown as the author. Defaults to Assistant."
}
},
"required": [
"text"
]
},
"example": {
"text": "Draft is in the shared folder.",
"name": "Claude"
}
}
}
},
"responses": {
"201": {
"description": "The comment",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"cardId": {
"type": "string"
},
"name": {
"type": "string"
},
"text": {
"type": "string"
},
"at": {
"type": "string",
"format": "date-time"
},
"url": {
"type": "string",
"format": "uri"
}
}
},
"example": {
"id": "Cm1nB2vC3xZ4aS",
"cardId": "Kq3vT8mZp2Lw",
"name": "Claude",
"text": "Draft is in the shared folder.",
"at": "2026-10-19T14:02:11.000Z",
"url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
}
}
}
},
"400": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"401": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"403": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"404": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
},
"409": {
"description": "The request was refused. error says what to change.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"error": "That key does not match this board."
}
}
}
}
}
}
}
}
}Change history
Point OpenApps links to openapps.free
Bind agent address in policy
Use OpenApps service URLs and add contribution strip
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync