Robolyst Robolyst

Team API

Your team's season HQ from your own code: the roster, the board, the calendar, the notebook, the budget, and everything your team has scouted. Read all of it, and write most of it — file a task, schedule a meeting, log an expense, tick off a pit checklist. 52 endpoints over HTTP, plus an OpenAPI document you can hand to a client generator.

Contents

Getting a key

Open Team Settings, API keys, name the key after whatever will be holding it, and copy it. The key is shown once and stored as a hash, so a lost key is replaced, never recovered.

A key carries no permissions of its own. It acts as the member who issued it, and their roles are read fresh on every call. Take a permission away and the key loses it the same second. Remove the member from the team and the key stops answering.

Issuing and revoking keys needs the api.manage permission.

Authentication

Send the key as a bearer token on every request.

curl -H "Authorization: Bearer rbl_…" \
  https://robolyst.org/api/v1/me

Keys belong on a server. The API sends no CORS headers, so a browser page cannot call it directly, and a key pasted into front-end code is readable by anyone who opens the page. Put the key in an environment variable and call the API from something the public cannot view the source of.

Start at /me when something is refused. It reports the role, the permissions and the features the key actually has.

Responses and paging

A request for one record returns that record. A list returns its rows under data, with a next_cursor beside them.

{
 "data": [ … ],
 "next_cursor": "NTA"
}

Pass that value back as cursor for the next page. A null cursor means you have reached the end. Pages are 50 rows by default and 200 at most.

Dates go out as ISO 8601 strings in UTC. Money is always whole cents, never a decimal. People appear by display name; user ids only show up where you need one to call something else.

Ids are opaque strings. New records carry a short prefix naming what they are, so an id you read out of one response tells you which endpoint will take it: task_, ord_, mtg_. Records created before the prefixes existed are bare UUIDs and keep those ids. Read the prefix, never parse it.

Writing

A key is read-only when it is issued. Writing needs a key created with write access, and /me reports which kind you are holding under access. Two gates then apply in order: the key's own access, and the permissions of the member who issued it. A write key held by a student who cannot approve orders still cannot approve orders.

Writes take a JSON body. POST creates, PATCH changes only the fields you send, and DELETE takes no body. There is no PUT.

Every write is written to the team's activity log with the endpoint, who it ran as and the id of whatever it touched. Managers read it on the AI & API page in Team Settings.

The rules the app enforces are enforced here. An expense over the receipt threshold, an order missing a required link, a title the announcement composer would reject, a locked team, a locked picklist: all of them fail the call and change nothing. The message says which rule it was.

Some things stay out of the API on purpose. Nobody is invited, removed or given a role from a script; photos, files and rich formatting are added in the app. A write that sends something to the whole team — posting an announcement, emailing about a new event — only happens when you ask for it by name, so a nightly sync job cannot mail the team by accident.

Errors

StatusCodeMeaning
400invalid_parameterA parameter is the wrong type, or a required one is missing.
400invalid_bodyThe body is not a JSON object.
400policyThe write broke one of the team's own rules, such as an expense limit.
400read_only_recordThat record is owned by something else, such as a subscribed calendar.
401unauthorizedNo key, a malformed key, or a key that has been revoked.
403forbiddenThe issuing member's role does not grant this.
403read_only_keyThe key was issued without write access.
403team_lockedThe team is locked. Reads still work.
403module_disabledThe team has that feature turned off.
404not_foundNo such record on this team.
404no_such_endpointNothing is served at that path.
405method_not_allowedThat path exists but not for that method. Allow lists the ones it takes.
409conflictSomething else holds the record, or the change contradicts its current state.
429rate_limitedOver the per-key limit. Retry-After says how long to wait.

Every failure carries the same body: { "error": { "code", "message" } }. The message is written for a person to read, so a script can log it and a student can understand what went wrong.

Rate limits

120 requests a minute per key. Going over returns 429 with a Retry-After header. A dashboard that polls every few seconds sits comfortably inside that; a loop that forgot to sleep does not. The limit may change as we learn what teams actually build.

Reference

Identity

What this key can reach.

Who this key belongs to

whoami

GET /api/v1/me

Who this call runs as: the account, the team it reads, that member’s role, whether the key may write, and exactly which permissions and features are available. Call this first when something is refused.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/me

Response

{
  "user": {
    "name": "John Doe"
  },
  "team": {
    "name": "Singularity Technology",
    "number": 7034,
    "locked": false
  },
  "role": "Manager",
  "isOwner": false,
  "access": "write",
  "permissions": [
    "tasks.manage",
    "finance.view"
  ],
  "enabledFeatures": [
    "members",
    "tasks",
    "schedule",
    "finance"
  ]
}

Roster

Who is on the team. Read only: inviting someone, changing their roles or taking them off the team is done by a person in Team Settings.

List the roster

list_roster

GET /api/v1/members

Everyone on the team with their role. Use it to resolve a name before assigning work.

Returns 403 when the members feature is off for the team.

ParameterTypeNotes
includeArchived booleanInclude members who have been archived. Off by default.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/members

Response

[
  {
    "id": "9f2c1d84-3a67-4b10-8e55-6c0b7d21ae43",
    "name": "John Doe",
    "role": "Manager",
    "roles": [
      "Manager",
      "Default"
    ],
    "placeholder": false,
    "archived": false
  }
]

Tasks

The build-season board.

List tasks

GET /api/v1/tasks

The team's tasks. Filter by status, by whether they are assigned to you, or by due date.

Returns 403 when the tasks feature is off for the team.

ParameterTypeNotes
status stringExact status name, e.g. "In Progress".
open booleanOnly tasks in a status that is not done or cancelled.
mine booleanOnly tasks assigned to you.
dueBefore dateISO date. Only tasks due on or before it.
search stringMatch against title and description.
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/tasks

Response

{
  "data": [
    {
      "id": "task_axag8agmh10m6cmgewdg",
      "title": "Rebuild the intake gate",
      "description": "The 3D-printed pawl keeps shearing under load.",
      "status": "In Progress",
      "priority": 2,
      "dueDate": "2026-10-02T00:00:00.000Z",
      "startDate": null,
      "completedAt": null,
      "tags": [
        "mechanical"
      ],
      "assignedTo": [
        "John Doe"
      ]
    }
  ],
  "next_cursor": null
}

Get a task

get_task

GET /api/v1/tasks/{id}

One task in full, including its comments and what it depends on and what depends on it.

Returns 403 when the tasks feature is off for the team.

ParameterTypeNotes
id *pathTask id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/tasks/:id

Response

{
  "id": "task_axag8agmh10m6cmgewdg",
  "title": "Rebuild the intake gate",
  "description": "The 3D-printed pawl keeps shearing under load.",
  "status": "In Progress",
  "priority": 2,
  "dueDate": "2026-10-02T00:00:00.000Z",
  "startDate": null,
  "completedAt": null,
  "tags": [
    "mechanical"
  ],
  "assignedTo": [
    "John Doe"
  ],
  "blockedBy": [
    {
      "id": "task_11sqdv48k7ymvfr4afnc",
      "title": "Print v3 pawl",
      "status": "Done"
    }
  ],
  "blocks": [],
  "comments": [
    {
      "id": "tcmt_s8kbgndx8typzxc4k2fv",
      "author": "John Doe",
      "body": "Reprinted at 60% infill, holding so far.",
      "created": "2026-09-28T18:04:00.000Z",
      "edited": null
    }
  ]
}

Create a task

create_task

POST /api/v1/tasks

Put a task on the board. It goes to the team’s first status unless you name another, and to nobody unless you pass `assignToMe` or `memberIds`.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the tasks feature is off for the team.

FieldTypeNotes
title *stringWhat needs doing.
description stringThe detail behind the title.
status stringStatus name. /tags/task_status lists the ones this team uses.
priority integer1 highest, 4 lowest.
dueDate stringYYYY-MM-DD for a day in the team’s own timezone, or a full ISO timestamp. Send an empty string to clear it.
dueTime stringHH:MM, 24-hour, in the team’s timezone. Without it a day-only due date lands on the team’s end of day.
startDate stringYYYY-MM-DD or a full ISO timestamp.
assignToMe booleanAssign it to the key’s own member.
memberIds string[]Member ids from /members. Anyone not on the team is refused.
tags string[]Label ids from /tags/task_label.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/tasks \
  -H "Content-Type: application/json" \
  -d '{"title":"…"}'

Response

{
  "id": "task_axag8agmh10m6cmgewdg",
  "title": "Rebuild the intake gate",
  "status": "In Progress",
  "dueDate": "2026-10-02T23:59:00.000Z",
  "assignedTo": [
    "9f2c1d84-3a67-4b10-8e55-6c0b7d21ae43"
  ]
}

Change a task

update_task

PATCH /api/v1/tasks/{id}

Change any field of a task. Only the fields you send move; everything else is left alone. Moving into a status the team marks done stamps the completion date, and moving back out clears it.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the tasks feature is off for the team.

Parameters

ParameterTypeNotes
id *pathTask id.

Body

FieldTypeNotes
title stringWhat needs doing.
description stringThe detail behind the title.
status stringStatus name. /tags/task_status lists the ones this team uses.
priority integer1 highest, 4 lowest.
dueDate stringYYYY-MM-DD for a day in the team’s own timezone, or a full ISO timestamp. Send an empty string to clear it.
dueTime stringHH:MM, 24-hour, in the team’s timezone. Without it a day-only due date lands on the team’s end of day.
startDate stringYYYY-MM-DD or a full ISO timestamp.
memberIds string[]Member ids from /members. Anyone not on the team is refused. Replaces the whole list.
tags string[]Label ids from /tags/task_label. Replaces the whole list.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/tasks/:id \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "task_axag8agmh10m6cmgewdg",
  "title": "Rebuild the intake gate",
  "status": "In Progress",
  "dueDate": "2026-10-02T23:59:00.000Z",
  "assignedTo": [
    "9f2c1d84-3a67-4b10-8e55-6c0b7d21ae43"
  ]
}

Delete a task

DELETE /api/v1/tasks/{id}

Removes the task, its comments, its subtasks and its dependency links. There is no undo, and no MCP tool for it — a deletion is a decision somebody makes in the app or in a script they wrote on purpose.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the tasks feature is off for the team.

ParameterTypeNotes
id *pathTask id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X DELETE https://robolyst.org/api/v1/tasks/:id

Response

{
  "id": "task_axag8agmh10m6cmgewdg",
  "deleted": true
}

Comment on a task

comment_on_task

POST /api/v1/tasks/{id}/comments

Adds a comment to the task thread as the key’s own member. Plain text; blank lines start a new paragraph.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the tasks feature is off for the team.

Parameters

ParameterTypeNotes
id *pathTask id.

Body

FieldTypeNotes
body *stringWhat to say.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/tasks/:id/comments \
  -H "Content-Type: application/json" \
  -d '{"body":"…"}'

Response

{
  "id": "tcmt_s8kbgndx8typzxc4k2fv",
  "task": "task_axag8agmh10m6cmgewdg",
  "body": "Reprinted at 60% infill, holding so far.",
  "created": "2026-09-28T18:04:00.000Z"
}

Schedule

Meetings, competitions, outreach and scrimmages.

List scheduled events

list_schedule

GET /api/v1/meetings

Meetings, competitions, outreach and scrimmages on the team calendar. Defaults to the next 30 days.

Returns 403 when the schedule feature is off for the team.

ParameterTypeNotes
from dateISO date. Defaults to now.
to dateISO date. Defaults to 30 days after `from`.
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/meetings

Response

{
  "data": [
    {
      "id": "mtg_gxk2vf34ggyw1edt9mbd",
      "title": "Build session",
      "type": "meeting",
      "start": "2026-09-18T23:00:00.000Z",
      "end": "2026-09-19T01:30:00.000Z",
      "location": "Room 214",
      "agenda": "Intake rebuild, drivetrain tuning",
      "notes": null,
      "cancelled": false,
      "rsvpMode": "decline_only",
      "ftcEventCode": null,
      "recurring": "weekly"
    }
  ],
  "next_cursor": null
}

Get a scheduled event

GET /api/v1/meetings/{id}

One meeting, competition or outreach event in full.

Returns 403 when the schedule feature is off for the team.

ParameterTypeNotes
id *pathMeeting id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/meetings/:id

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "title": "Build session",
  "type": "meeting",
  "start": "2026-09-18T23:00:00.000Z",
  "end": "2026-09-19T01:30:00.000Z",
  "location": "Room 214",
  "agenda": "Intake rebuild, drivetrain tuning",
  "notes": null,
  "cancelled": false,
  "rsvpMode": "decline_only",
  "ftcEventCode": null,
  "recurring": "weekly"
}

Schedule an event

create_meeting

POST /api/v1/meetings

Puts a meeting, outreach event or scrimmage on the calendar, posts it to the team’s Discord schedule channel, and notifies the team if you ask it to. A weekly event is stored once as a series rather than as a row per week.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the schedule feature is off for the team.

FieldTypeNotes
title *stringWhat the event is called.
type stringMeetings, outreach and scrimmages only. Competitions come from the FTC sync. meeting · outreach · scrimmage Default meeting.
start *stringWhen it starts. A full ISO timestamp, or YYYY-MM-DD for the start of that day in the team’s timezone.
end stringWhen it ends. Same formats as `start`.
location stringWhere it is.
agenda stringWhat the event is for.
memberIds string[]Who is expected, as member ids from /members. Empty means the whole team, which is the default.
private booleanKeep it off Discord and off the schedule for anyone not named. Ignored unless `memberIds` names somebody.
rsvpMode stringHow members answer. `none` takes no answers, `decline_only` only takes "can't make it" with a reason, `full` takes going/maybe/not going. Defaults to `decline_only` for meetings and `full` otherwise. On a logged week of a series it is ignored; set it on the series. none · decline_only · full
notifyMembers booleanSend the "event scheduled" notification. Off by default, so a sync job stays quiet.
recurrence stringSet to `weekly` for a repeating event. weekly
recurrenceUntil stringThe last day a weekly event runs, YYYY-MM-DD. Inclusive.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/meetings \
  -H "Content-Type: application/json" \
  -d '{"title":"…","start":"…"}'

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "title": "Build session",
  "type": "meeting",
  "start": "2026-09-18T23:00:00.000Z",
  "end": "2026-09-19T01:30:00.000Z",
  "location": "Room 214",
  "agenda": "Intake rebuild, drivetrain tuning",
  "notes": null,
  "cancelled": false,
  "rsvpMode": "decline_only",
  "ftcEventCode": null,
  "recurring": "weekly"
}

Change a scheduled event

PATCH /api/v1/meetings/{id}

Changes the fields you send and leaves the rest. An event mirrored from a subscribed calendar is refused; a competition keeps its FTC date and only moves its times.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the schedule feature is off for the team.

Parameters

ParameterTypeNotes
id *pathMeeting id.

Body

FieldTypeNotes
title stringWhat the event is called.
type stringMeetings, outreach and scrimmages only. Competitions come from the FTC sync. meeting · outreach · scrimmage Default meeting.
start stringWhen it starts. A full ISO timestamp, or YYYY-MM-DD for the start of that day in the team’s timezone.
end stringWhen it ends. Same formats as `start`.
location stringWhere it is.
agenda stringWhat the event is for.
memberIds string[]Who is expected, as member ids from /members. Empty means the whole team, which is the default.
private booleanKeep it off Discord and off the schedule for anyone not named. Ignored unless `memberIds` names somebody.
rsvpMode stringHow members answer. `none` takes no answers, `decline_only` only takes "can't make it" with a reason, `full` takes going/maybe/not going. Defaults to `decline_only` for meetings and `full` otherwise. On a logged week of a series it is ignored; set it on the series. none · decline_only · full
notifyMembers booleanSend the "event scheduled" notification. Off by default, so a sync job stays quiet.
notes stringThe write-up kept against the event.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/meetings/:id \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "title": "Build session",
  "type": "meeting",
  "start": "2026-09-18T23:00:00.000Z",
  "end": "2026-09-19T01:30:00.000Z",
  "location": "Room 214",
  "agenda": "Intake rebuild, drivetrain tuning",
  "notes": null,
  "cancelled": false,
  "rsvpMode": "decline_only",
  "ftcEventCode": null,
  "recurring": "weekly"
}

Call an event off

POST /api/v1/meetings/{id}/cancel

Marks the event cancelled and pulls its Discord card. The row stays, so everyone who already saw it sees that it is off rather than finding it gone.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the schedule feature is off for the team.

Parameters

ParameterTypeNotes
id *pathMeeting id.

Body

FieldTypeNotes
reason stringShown next to the cancelled badge.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/meetings/:id/cancel \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "title": "Build session",
  "type": "meeting",
  "start": "2026-09-18T23:00:00.000Z",
  "end": "2026-09-19T01:30:00.000Z",
  "location": "Room 214",
  "agenda": "Intake rebuild, drivetrain tuning",
  "notes": null,
  "cancelled": true,
  "rsvpMode": "decline_only",
  "ftcEventCode": null,
  "recurring": "weekly"
}

Delete a scheduled event

DELETE /api/v1/meetings/{id}

Removes the event outright, and a weekly series takes its logged weeks with it. Calling one week off is `/meetings/{id}/cancel`.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the schedule feature is off for the team.

ParameterTypeNotes
id *pathMeeting id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X DELETE https://robolyst.org/api/v1/meetings/:id

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "deleted": true
}

Answer an event

POST /api/v1/meetings/{id}/rsvp

Records whether the key’s own member is coming. It is always your own answer — there is no marking somebody else as going — and it is not the register, which a manager takes in the app. Refused on an event whose `rsvpMode` is `none`. On `decline_only`, `not_going` needs a `reason` and `going` takes a decline back.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the schedule feature is off for the team.

Parameters

ParameterTypeNotes
id *pathMeeting id.

Body

FieldTypeNotes
answer *stringYour answer. going · maybe · not_going
reason stringWhy you can't make it. Required for `not_going` on a `decline_only` event; only managers see it.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/meetings/:id/rsvp \
  -H "Content-Type: application/json" \
  -d '{"answer":"going"}'

Response

{
  "id": "mtg_gxk2vf34ggyw1edt9mbd",
  "rsvp": "going"
}

Checklists

Templates and the runs worked through against them.

List checklist templates

GET /api/v1/checklists

The checklist templates the team owns, with how many items each holds.

Returns 403 when the checklists feature is off for the team.

ParameterTypeNotes
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/checklists

Response

{
  "data": [
    {
      "id": "cl_f6sfknnabgm8znsp4e43",
      "title": "Pre-match",
      "description": "Before every match",
      "items": 12
    }
  ],
  "next_cursor": null
}

List checklist runs

GET /api/v1/checklist-runs

Times a checklist was actually worked through, with how many items are still unchecked. Open runs only unless `open=false`.

Returns 403 when the checklists feature is off for the team.

ParameterTypeNotes
open booleanSet false to include runs that have been completed. Default true.
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/checklist-runs

Response

{
  "data": [
    {
      "id": "clrun_bgfyvbtt2hbjr2k3p4fv",
      "title": "Pre-match",
      "started": "2026-09-14T14:02:00.000Z",
      "completedAt": null,
      "total": 12,
      "done": 9,
      "remaining": 3
    }
  ],
  "next_cursor": null
}

Get a checklist run

get_checklist_run

GET /api/v1/checklist-runs/{id}

One run with every item on it, in order, and whether each has been checked off. The item ids are what you check off.

Returns 403 when the checklists feature is off for the team.

ParameterTypeNotes
id *pathRun id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/checklist-runs/:id

Response

{
  "id": "clrun_bgfyvbtt2hbjr2k3p4fv",
  "title": "Pre-match",
  "started": "2026-09-14T14:02:00.000Z",
  "completedAt": null,
  "items": [
    {
      "id": "clritem_9ha2mnq0x1pw4rk7v3ty",
      "text": "Battery charged and strapped",
      "section": "Robot",
      "quantity": null,
      "checked": true,
      "checkedAt": "2026-09-14T14:05:00.000Z"
    }
  ]
}

Create a checklist template

POST /api/v1/checklists

A new template, with its items in the order you send them. Items are added with the template; editing them afterwards is done in the app.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the checklists feature is off for the team.

FieldTypeNotes
title *stringWhat the checklist is called.
description stringWhen it should be worked through.
items object[]The items, in order.
  • text * · string · The item itself.
  • section · string · Heading it sits under, e.g. "Tools".
  • quantity · integer · How many, when that matters.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/checklists \
  -H "Content-Type: application/json" \
  -d '{"title":"…"}'

Response

{
  "id": "cl_f6sfknnabgm8znsp4e43",
  "title": "Pre-match",
  "items": 12
}

Start a checklist run

start_checklist_run

POST /api/v1/checklist-runs

Works a template into a run: its items are copied as they stand now, so editing the template later does not change what this run asked for. The run gets its own Discord thread, the same one the automatic runs post to.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the checklists feature is off for the team.

FieldTypeNotes
checklist *stringTemplate id from /checklists.
meeting stringMeeting id this run belongs to, from /meetings.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/checklist-runs \
  -H "Content-Type: application/json" \
  -d '{"checklist":"…"}'

Response

{
  "id": "clrun_bgfyvbtt2hbjr2k3p4fv",
  "title": "Pre-match",
  "items": 12
}

Check an item off

check_run_item

PATCH /api/v1/checklist-runs/{id}/items/{item}

Checks one item on a run, or unchecks it. The key’s own member is recorded as who ticked it.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the checklists feature is off for the team.

Parameters

ParameterTypeNotes
id *pathRun id.
item *pathRun item id.

Body

FieldTypeNotes
checked booleanFalse to uncheck it. Default true.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/checklist-runs/:id/items/:item \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "clritem_9ha2mnq0x1pw4rk7v3ty",
  "run": "clrun_bgfyvbtt2hbjr2k3p4fv",
  "text": "Battery charged and strapped",
  "checked": true
}

Complete a checklist run

complete_checklist_run

POST /api/v1/checklist-runs/{id}/complete

Closes the run. Unchecked items stay unchecked — a run is finished when the team says it is, not when the last box is ticked. Pass `complete: false` to reopen one.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the checklists feature is off for the team.

Parameters

ParameterTypeNotes
id *pathRun id.

Body

FieldTypeNotes
complete booleanFalse reopens the run. Default true.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/checklist-runs/:id/complete \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "clrun_bgfyvbtt2hbjr2k3p4fv",
  "title": "Pre-match",
  "completedAt": "2026-09-14T15:40:00.000Z"
}

Documentation

The engineering notebook.

Search the engineering notebook

search_documentation

GET /api/v1/documentation

The team's engineering notebook. Search entry text, or filter by season and subsystem. Returns an excerpt of each entry; fetch one by id for the full text.

Returns 403 when the documentation feature is off for the team.

ParameterTypeNotes
q stringText to look for in the title or body.
season integerFTC season start year, e.g. 2026.
subsystem stringSubsystem name, e.g. "Drivetrain".
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/documentation

Response

{
  "data": [
    {
      "id": "doc_e04rxv451jekgqywab4e",
      "title": "Intake v3 testing",
      "date": "2026-09-12T00:00:00.000Z",
      "season": 2026,
      "excerpt": "Ran 40 cycles at competition speed. The pawl held."
    }
  ],
  "next_cursor": null
}

Get a notebook entry

get_documentation_entry

GET /api/v1/documentation/{id}

One notebook entry in full, as plain text.

Returns 403 when the documentation feature is off for the team.

ParameterTypeNotes
id *pathEntry id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/documentation/:id

Response

{
  "id": "doc_e04rxv451jekgqywab4e",
  "title": "Intake v3 testing",
  "date": "2026-09-12T00:00:00.000Z",
  "season": 2026,
  "body": "Ran 40 cycles at competition speed. The pawl held."
}

Write a notebook entry

create_documentation_entry

POST /api/v1/documentation

Adds an entry to the engineering notebook. Text only over the API — photos and drawings are added in the app, which is also where an entry gets its rich formatting.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the documentation feature is off for the team.

FieldTypeNotes
title *stringWhat the entry is about.
body *stringThe entry itself, as plain text. A blank line starts a new paragraph.
date stringThe day the work happened, YYYY-MM-DD in the team’s timezone. Defaults to today, and the season follows it.
authorIds string[]Who did the work, as member ids from /members. The key’s own member is always included.
subsystems string[]Subsystem ids from /tags/subsystem.
types string[]Entry-type ids from /tags/doc_type.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/documentation \
  -H "Content-Type: application/json" \
  -d '{"title":"…","body":"…"}'

Response

{
  "id": "doc_e04rxv451jekgqywab4e",
  "title": "Intake v3 testing",
  "date": "2026-09-12T00:00:00.000Z",
  "season": 2026
}

Edit a notebook entry

PATCH /api/v1/documentation/{id}

Changes the fields you send. Sending a body replaces the whole entry text, and the key’s own member is added to the list of people who have edited it.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the documentation feature is off for the team.

Parameters

ParameterTypeNotes
id *pathEntry id.

Body

FieldTypeNotes
title stringWhat the entry is about.
body stringThe entry itself, as plain text. A blank line starts a new paragraph.
date stringThe day the work happened, YYYY-MM-DD in the team’s timezone. Defaults to today, and the season follows it.
authorIds string[]Who did the work, as member ids from /members. The key’s own member is always included.
subsystems string[]Subsystem ids from /tags/subsystem.
types string[]Entry-type ids from /tags/doc_type.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/documentation/:id \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "doc_e04rxv451jekgqywab4e",
  "title": "Intake v3 testing",
  "date": "2026-09-12T00:00:00.000Z",
  "season": 2026
}

Delete a notebook entry

DELETE /api/v1/documentation/{id}

Removes the entry and anything linked to it. The notebook keeps no tombstone.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the documentation feature is off for the team.

ParameterTypeNotes
id *pathEntry id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X DELETE https://robolyst.org/api/v1/documentation/:id

Response

{
  "id": "doc_e04rxv451jekgqywab4e",
  "deleted": true
}

Announcements

What the team has been told.

List announcements

list_announcements

GET /api/v1/announcements

Team announcements, newest first. Includes unpublished drafts and scheduled posts.

Returns 403 when the announcements feature is off for the team.

ParameterTypeNotes
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/announcements

Response

{
  "data": [
    {
      "id": "ann_tv4t1vea91gjwd0abr8n",
      "title": "Bus leaves at 6:15",
      "body": "Meet at the north lot. Bring your safety glasses.",
      "pinned": true,
      "published": true,
      "publishAt": "2026-09-15T12:00:00.000Z"
    }
  ],
  "next_cursor": null
}

Write an announcement

draft_announcement

POST /api/v1/announcements

Writes an announcement. It is a draft and reaches nobody unless you pass `send`, which posts it immediately, or `publishAt`, which queues it. Sending fans out to email, push, in-app and the team’s Discord channel, so a script that writes one every morning should be leaving drafts.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the announcements feature is off for the team.

FieldTypeNotes
title *stringThe headline.
body *stringWhat the team is being told, as plain text.
pinned booleanKeep it at the top of the page.
recipientIds string[]Member ids from /members. Empty means the whole team, and a post aimed at named people stays off Discord.
publishAt stringISO timestamp to send it at. A time in the past sends it now.
send booleanPost it immediately instead of leaving a draft.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/announcements \
  -H "Content-Type: application/json" \
  -d '{"title":"…","body":"…"}'

Response

{
  "id": "ann_tv4t1vea91gjwd0abr8n",
  "title": "Bus leaves at 6:15",
  "pinned": true,
  "published": false,
  "publishAt": "2999-01-01T00:00:00.000Z",
  "note": "Saved as a draft. Publish it from the announcements page, or POST to /announcements/{id}/publish."
}

Edit an announcement

PATCH /api/v1/announcements/{id}

Changes the fields you send. A post that has already gone out keeps the moment it went out; editing it changes what people read on the page, not what landed in their inbox.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the announcements feature is off for the team.

Parameters

ParameterTypeNotes
id *pathAnnouncement id.

Body

FieldTypeNotes
title stringThe headline.
body stringWhat the team is being told, as plain text.
pinned booleanKeep it at the top of the page.
recipientIds string[]Member ids from /members. Empty means the whole team, and a post aimed at named people stays off Discord.
publishAt stringISO timestamp. Only moves a post that has not gone out.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/announcements/:id \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "ann_tv4t1vea91gjwd0abr8n",
  "title": "Bus leaves at 6:15",
  "pinned": true,
  "published": false,
  "publishAt": "2999-01-01T00:00:00.000Z",
  "note": "Saved as a draft. Publish it from the announcements page, or POST to /announcements/{id}/publish."
}

Post an announcement now

POST /api/v1/announcements/{id}/publish

Sends a draft or a scheduled post immediately, through every channel the team has turned on. There is no unsend.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the announcements feature is off for the team.

ParameterTypeNotes
id *pathAnnouncement id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/announcements/:id/publish

Response

{
  "id": "ann_tv4t1vea91gjwd0abr8n",
  "title": "Bus leaves at 6:15",
  "pinned": true,
  "published": true,
  "publishAt": "2026-09-15T12:00:00.000Z",
  "note": null
}

Delete an announcement

DELETE /api/v1/announcements/{id}

Takes the post off the page. Emails, pushes and Discord messages already delivered stay where they are.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the announcements feature is off for the team.

ParameterTypeNotes
id *pathAnnouncement id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X DELETE https://robolyst.org/api/v1/announcements/:id

Response

{
  "id": "ann_tv4t1vea91gjwd0abr8n",
  "deleted": true
}

Finance

Budget, orders and spending. Every amount is in whole cents.

Budget summary

finance_summary

GET /api/v1/finance/summary

The budget for a season: each category, what was allocated, what has been spent, and what is left. Every amount is in whole cents.

Returns 403 when the finance feature is off for the team.

ParameterTypeNotes
season integerFTC season start year. Defaults to the current season.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/finance/summary

Response

{
  "season": 2026,
  "locked": false,
  "currency": "cents",
  "totalBudget": 450000,
  "totalSpent": 187320,
  "categories": [
    {
      "id": "cat_tq8n1dda105n54xk4k5j",
      "name": "Parts",
      "allocated": 200000,
      "spent": 143200,
      "remaining": 56800
    }
  ]
}

List order requests

list_orders

GET /api/v1/finance/orders

Part and order requests, for answering "did we order that yet". Amounts are in whole cents.

Returns 403 when the finance feature is off for the team.

ParameterTypeNotes
status stringFilter to one status. draft · requested · approved · partially_ordered · ordered · received · backordered · rejected · cancelled
mine booleanOnly requests you filed.
season integerFTC season start year. Defaults to the current season.
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/finance/orders

Response

{
  "data": [
    {
      "id": "ord_7a6kz513js2gx9d650vx",
      "title": "Spare 5203 motors",
      "status": "ordered",
      "total": 12400,
      "requestedBy": "John Doe"
    }
  ],
  "next_cursor": null
}

List expenses

list_expenses

GET /api/v1/finance/expenses

Logged spending for a season, newest first. Amounts are in whole cents.

Returns 403 when the finance feature is off for the team.

ParameterTypeNotes
mine booleanOnly spending you logged.
season integerFTC season start year. Defaults to the current season.
limit integerRows per page, 1-200. Default 50.
cursor stringThe `next_cursor` from the previous page.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/finance/expenses

Response

{
  "data": [
    {
      "id": "exp_twfjy2hnccnzg3s7ez8q",
      "description": "Polycarb sheet",
      "amount": 4299,
      "vendor": "McMaster-Carr",
      "spentAt": "2026-09-09T00:00:00.000Z",
      "approved": true,
      "reimbursed": false,
      "category": "Parts / Raw stock"
    }
  ],
  "next_cursor": null
}

Log an expense

log_expense

POST /api/v1/finance/expenses

Records money already spent. Amounts are in whole cents. Your team's expense policy still applies: receipt thresholds, approval limits and whether members may log spending at all are enforced here, and the call fails when one is broken.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the expenses feature is off for the team.

FieldTypeNotes
description *stringWhat the money went on.
amountCents *integerWhole cents. $24.99 is 2499.
vendor stringWho it was bought from.
category stringBudget category name from /finance/summary. "Parts" or "Parts / Raw stock".
spentAt dateISO date. Defaults to now.
season integerFTC season start year. Defaults to the current season.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/finance/expenses \
  -H "Content-Type: application/json" \
  -d '{"description":"…","amountCents":1}'

Response

{
  "id": "exp_twfjy2hnccnzg3s7ez8q",
  "amountCents": 4299,
  "approved": false,
  "note": "Logged, but it needs a manager to approve it before it counts against the budget."
}

File an order request

request_order

POST /api/v1/finance/orders

Files a parts request for someone to approve and place. Prices are in cents. Your team's order policy applies: required links, required budget categories, allowed vendors and needed-by rules are all enforced.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the finance feature is off for the team.

FieldTypeNotes
title *stringWhat the request is for.
notes stringAnything the approver should know.
neededBy dateISO date. Must be in the future.
priority stringHow soon it is needed. low · normal · high · urgent Default normal.
season integerFTC season start year. Defaults to the current season.
items *object[]The parts to order.
  • name * · string · What the part is.
  • vendor · string · Who sells it.
  • quantity · integer · How many.
  • unitPriceCents · integer · Price each, in whole cents.
  • url · string · Link to the product page.
  • partNumber · string · The vendor's part number.
  • category · string · Budget category name.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/finance/orders \
  -H "Content-Type: application/json" \
  -d '{"title":"…","items":[{"name":"…"}]}'

Response

{
  "id": "ord_7a6kz513js2gx9d650vx",
  "title": "Spare 5203 motors",
  "status": "requested",
  "itemCount": 2,
  "totalCents": 12400
}

Approve, reject or cancel an order

PATCH /api/v1/finance/orders/{id}

Moves a pending request. Approving and rejecting need the approval permission, and a team that requires peer approval still refuses to let the requester sign off their own. Cancelling is open to the person who filed it while it is still pending.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the finance feature is off for the team.

Parameters

ParameterTypeNotes
id *pathOrder id.

Body

FieldTypeNotes
decision *stringWhat to do with it. approve · reject · cancel
reason stringWhy it was rejected. Required on a rejection.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/finance/orders/:id \
  -H "Content-Type: application/json" \
  -d '{"decision":"approve"}'

Response

{
  "id": "ord_7a6kz513js2gx9d650vx",
  "status": "approved"
}

Scouting

Pit sheets, your private notes, and your custom questions.

List scouting notes

list_scouting_notes

GET /api/v1/scouting/notes

Your team's own notes on other teams: the star, the written note, the tags and any answers to your custom fields. These never leave your team.

Returns 403 when the scouting feature is off for the team.

ParameterTypeNotes
season integerFTC season start year. Defaults to the current season.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/scouting/notes

Response

[
  {
    "teamNumber": 14892,
    "season": 2026,
    "starred": true,
    "note": "Fast cycles, weak auto.",
    "tags": [
      "Good partner"
    ],
    "answers": {
      "drivetrain": "Mecanum"
    },
    "updated": "2026-09-13T18:20:00.000Z"
  }
]

List custom scouting fields

GET /api/v1/scouting/fields

The extra questions this team added to its scouting sheet, in the order they are asked.

Returns 403 when the scouting feature is off for the team.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/scouting/fields

Response

[
  {
    "id": "scfield_kfspg0j8gk3ebteh480c",
    "label": "Preferred alliance role",
    "type": "select",
    "options": [
      {
        "value": "scorer",
        "label": "Scorer"
      },
      {
        "value": "defender",
        "label": "Defender"
      }
    ]
  }
]

List pit scouting for an event

list_pit_scouting

GET /api/v1/scouting/pit

The self-reported pit sheets for every team at an event. This is the shared pool every team at the event fills in, not your private notes.

Returns 403 when the scouting feature is off for the team.

ParameterTypeNotes
event *stringFTC event code, e.g. "USCANOQ1".
season integerFTC season start year. Defaults to the current season.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/scouting/pit

Response

[
  {
    "teamNumber": 14892,
    "season": 2026,
    "fromThisEvent": true,
    "answers": {
      "drivetrain": "Mecanum",
      "canClimb": true
    },
    "via": "qr",
    "photo": {
      "url": null,
      "thumb": null
    },
    "updated": "2026-09-13T15:02:00.000Z"
  }
]

Save a scouting note

save_scouting_note

PATCH /api/v1/scouting/notes/{team}

Writes your team’s own note on another team: the star, the written note, the tags, and answers to your custom questions. Only the fields you send change. These never leave your team, and any member may write them.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the scouting feature is off for the team.

Parameters

ParameterTypeNotes
team *pathThe team number the note is about.

Body

FieldTypeNotes
season integerFTC season start year. Defaults to the current season.
starred booleanWhether they are on the watchlist.
note stringWhat you want to remember. 2,000 characters.
tags string[]Tag names from /tags/scouting_tag. Replaces the whole list.
answers jsonAnswers to your own questions, keyed by field id from /scouting/fields. Anything that is not one of your fields is dropped.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/scouting/notes/:team \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "teamNumber": 14892,
  "season": 2026,
  "saved": true
}

Fill in a pit sheet

POST /api/v1/scouting/pit

Adds an entry to the shared pit-scouting pool for an event. The pool is every team’s, not yours: a team’s own answers about itself always win, and this fills a gap rather than overwriting one. The questions are the season’s, listed in the pit sheet itself.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the scouting feature is off for the team.

FieldTypeNotes
team *integerThe team the sheet is about.
event *stringFTC event code.
season integerFTC season start year. Defaults to the current season.
answers *jsonThe season’s pit questions, keyed by field id. A multi-choice answer is a list of values.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/scouting/pit \
  -H "Content-Type: application/json" \
  -d '{"team":1,"event":"…","answers":{}}'

Response

{
  "teamNumber": 14892,
  "season": 2026,
  "event": "USCANOQ1",
  "saved": true
}

Picklists

Alliance selection boards.

List picklists

list_picklists

GET /api/v1/picklists

Every alliance-selection board this team has started, newest event first.

Returns 403 when the scouting feature is off for the team.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/picklists

Response

[
  {
    "season": 2026,
    "eventCode": "USCANOQ1",
    "eventName": "Norcal Qualifier 1",
    "start": "2026-11-14T00:00:00.000Z",
    "locked": false,
    "updated": "2026-09-14T02:11:00.000Z"
  }
]

Get a picklist

get_picklist

GET /api/v1/picklists/{event}

One alliance-selection board in ranked order, with each team’s metrics, badges, your note on them, and whether they have already been picked.

Returns 403 when the scouting feature is off for the team.

ParameterTypeNotes
event *pathFTC event code the board belongs to.
season integerFTC season start year. Defaults to the current season.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/picklists/:event

Response

{
  "season": 2026,
  "eventCode": "USCANOQ1",
  "locked": false,
  "allianceCount": 4,
  "weights": {
    "strength": 1,
    "fit": 1,
    "reliability": 1
  },
  "self": {
    "teamNumber": 7034,
    "answers": null
  },
  "teams": [
    {
      "teamNumber": 14892,
      "teamName": "Iron Ridge",
      "order": 1,
      "dnp": false,
      "taken": null,
      "score": 82.4,
      "badges": [
        {
          "kind": "strength",
          "label": "Top scorer"
        }
      ],
      "opr": 41.2,
      "rank": 3,
      "matches": 9,
      "note": {
        "starred": true,
        "note": "Fast cycles, weak auto.",
        "tags": [
          "tag_1"
        ]
      }
    }
  ]
}

Change a picklist board

PATCH /api/v1/picklists/{event}

Sets the weights the recommendation is scored with, or locks the board. A locked board refuses every other change, which is what makes it safe to have open in the stands during selection.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the scouting feature is off for the team.

Parameters

ParameterTypeNotes
event *pathFTC event code the board belongs to.

Body

FieldTypeNotes
season integerFTC season start year. Defaults to the current season.
weights jsonWeight per factor, 0 to 1, keyed the way /picklists/{event} returns them.
locked booleanLock the order against further changes.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/picklists/:event \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "season": 2026,
  "eventCode": "USCANOQ1",
  "locked": true
}

Move a team on a picklist

PATCH /api/v1/picklists/{event}/teams/{team}

Drops a team into a new position, or marks it do-not-pick. Position is given as the team it should sit behind, because that is what survives two people reordering the same board at once; 0 puts it at the top.

Needs a key issued with write access, and fails while the team is locked.

Returns 403 when the scouting feature is off for the team.

Parameters

ParameterTypeNotes
event *pathFTC event code the board belongs to.
team *pathThe team being moved.

Body

FieldTypeNotes
season integerFTC season start year. Defaults to the current season.
afterTeam integerThe team number it should sit behind. 0 for the top of the list.
dnp booleanMark, or unmark, do-not-pick.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/picklists/:event/teams/:team \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "eventCode": "USCANOQ1",
  "teamNumber": 14892
}

Tags

The label sets a team edits in Settings, and the names the rest of the API answers with.

List every tag set

list_tags

GET /api/v1/tags

Every label set this team owns, keyed by kind. These are the names the rest of the API returns and filters on, so resolve a status or subsystem here before you match on it. Kinds belonging to a feature the team has turned off are left out. - `task_status` board columns, with `done` and `cancelled` flags - `task_label` free-form labels on a task - `subsystem` parts of the robot and the team, shared by tasks and documentation - `doc_type` what a documentation entry is - `doc_stage` where an entry sits in the design process, in order - `scouting_tag` how other teams are labelled on the watchlist - `resource_category` how links on the Resources page are filed - `outreach_audience` who an outreach log counts - `outreach_label` free-form labels on an outreach log, such as the initiative it belongs to - `partner_kind` what kind of organisation an outreach partner is - `print_material` what a 3D print can be asked for in - `practice_auto` which autonomous routine a practice run used - `practice_robot` which robot build a practice run was on

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/tags

Response

{
  "task_status": [
    {
      "id": "tst_8f2k",
      "name": "In Progress",
      "color": "7088f7",
      "order": 2000,
      "done": false,
      "cancelled": false
    }
  ],
  "task_label": [
    {
      "id": "ttg_p91c",
      "name": "Needs review",
      "color": "f7a070",
      "order": 1000
    }
  ],
  "subsystem": [
    {
      "id": "sub_4dq2",
      "name": "Drivetrain",
      "color": "70c7f7",
      "order": 1000
    }
  ]
}

List one tag set

GET /api/v1/tags/{kind}

One label set, in the order the team put it in. Same rows as `/tags`, for callers that only need the one list.

ParameterTypeNotes
kind *pathWhich set to read. task_status · task_label · subsystem · doc_type · doc_stage · scouting_tag · resource_category · outreach_audience · outreach_label · partner_kind · print_material · practice_auto · practice_robot

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  https://robolyst.org/api/v1/tags/:kind

Response

[
  {
    "id": "sub_4dq2",
    "name": "Drivetrain",
    "color": "70c7f7",
    "order": 1000
  },
  {
    "id": "sub_7mz1",
    "name": "Intake",
    "color": "f7d070",
    "order": 2000
  }
]

Add a tag

POST /api/v1/tags/{kind}

Adds one label to a set. Names are unique within a set, so adding one that already exists is refused rather than silently doing nothing.

Needs a key issued with write access, and fails while the team is locked.

Parameters

ParameterTypeNotes
kind *pathWhich set. task_status · task_label · subsystem · doc_type · doc_stage · scouting_tag · resource_category · outreach_audience · outreach_label · partner_kind · print_material · practice_auto · practice_robot

Body

FieldTypeNotes
name *stringWhat it is called.
color stringSix-digit hex, no hash. An unused palette colour is chosen when you leave it out.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X POST https://robolyst.org/api/v1/tags/:kind \
  -H "Content-Type: application/json" \
  -d '{"name":"…"}'

Response

{
  "id": "sub_4dq2",
  "name": "Drivetrain",
  "color": "70c7f7",
  "order": 3000
}

Change a tag

PATCH /api/v1/tags/{kind}/{id}

Renames a label, recolours it or reorders it. Renaming a task status carries every task in it along, because a task holds its status by name.

Needs a key issued with write access, and fails while the team is locked.

Parameters

ParameterTypeNotes
kind *pathWhich set. task_status · task_label · subsystem · doc_type · doc_stage · scouting_tag · resource_category · outreach_audience · outreach_label · partner_kind · print_material · practice_auto · practice_robot
id *pathTag id.

Body

FieldTypeNotes
name stringWhat it is called.
color stringSix-digit hex, no hash. An unused palette colour is chosen when you leave it out.
order numberSort key. Lower sorts first.
done booleanTask statuses only: work in this column counts as finished.
cancelled booleanTask statuses only: work in this column counts as dropped.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X PATCH https://robolyst.org/api/v1/tags/:kind/:id \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "id": "tst_8f2k",
  "name": "In Review",
  "color": "7088f7",
  "order": 2000,
  "done": false,
  "cancelled": false
}

Delete a tag

DELETE /api/v1/tags/{kind}/{id}

Removes a label. Records carrying it are handed to another where they have to hold one — a task moves to another status, a link to another category — and the last status or category cannot go.

Needs a key issued with write access, and fails while the team is locked.

ParameterTypeNotes
kind *pathWhich set. task_status · task_label · subsystem · doc_type · doc_stage · scouting_tag · resource_category · outreach_audience · outreach_label · partner_kind · print_material · practice_auto · practice_robot
id *pathTag id.

Request

curl -H "Authorization: Bearer $ROBOLYST_KEY" \
  -X DELETE https://robolyst.org/api/v1/tags/:kind/:id

Response

{
  "id": "sub_4dq2",
  "kind": "subsystem",
  "deleted": true
}