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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter | A parameter is the wrong type, or a required one is missing. |
| 400 | invalid_body | The body is not a JSON object. |
| 400 | policy | The write broke one of the team's own rules, such as an expense limit. |
| 400 | read_only_record | That record is owned by something else, such as a subscribed calendar. |
| 401 | unauthorized | No key, a malformed key, or a key that has been revoked. |
| 403 | forbidden | The issuing member's role does not grant this. |
| 403 | read_only_key | The key was issued without write access. |
| 403 | team_locked | The team is locked. Reads still work. |
| 403 | module_disabled | The team has that feature turned off. |
| 404 | not_found | No such record on this team. |
| 404 | no_such_endpoint | Nothing is served at that path. |
| 405 | method_not_allowed | That path exists but not for that method. Allow lists the ones it takes. |
| 409 | conflict | Something else holds the record, or the change contradicts its current state. |
| 429 | rate_limited | Over 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
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
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.
| Parameter | Type | Notes |
|---|---|---|
| includeArchived | boolean | Include 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.
| Parameter | Type | Notes |
|---|---|---|
| status | string | Exact status name, e.g. "In Progress". |
| open | boolean | Only tasks in a status that is not done or cancelled. |
| mine | boolean | Only tasks assigned to you. |
| dueBefore | date | ISO date. Only tasks due on or before it. |
| search | string | Match against title and description. |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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 /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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Task 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
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.
| Field | Type | Notes |
|---|---|---|
| title * | string | What needs doing. |
| description | string | The detail behind the title. |
| status | string | Status name. /tags/task_status lists the ones this team uses. |
| priority | integer | 1 highest, 4 lowest. |
| dueDate | string | YYYY-MM-DD for a day in the team’s own timezone, or a full ISO timestamp. Send an empty string to clear it. |
| dueTime | string | HH:MM, 24-hour, in the team’s timezone. Without it a day-only due date lands on the team’s end of day. |
| startDate | string | YYYY-MM-DD or a full ISO timestamp. |
| assignToMe | boolean | Assign 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
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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Task id. |
Body
| Field | Type | Notes |
|---|---|---|
| title | string | What needs doing. |
| description | string | The detail behind the title. |
| status | string | Status name. /tags/task_status lists the ones this team uses. |
| priority | integer | 1 highest, 4 lowest. |
| dueDate | string | YYYY-MM-DD for a day in the team’s own timezone, or a full ISO timestamp. Send an empty string to clear it. |
| dueTime | string | HH:MM, 24-hour, in the team’s timezone. Without it a day-only due date lands on the team’s end of day. |
| startDate | string | YYYY-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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Task 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
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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Task id. |
Body
| Field | Type | Notes |
|---|---|---|
| body * | string | What 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
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.
| Parameter | Type | Notes |
|---|---|---|
| from | date | ISO date. Defaults to now. |
| to | date | ISO date. Defaults to 30 days after `from`. |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Meeting 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
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.
| Field | Type | Notes |
|---|---|---|
| title * | string | What the event is called. |
| type | string | Meetings, outreach and scrimmages only. Competitions come from the FTC sync. meeting · outreach · scrimmage Default meeting. |
| start * | string | When it starts. A full ISO timestamp, or YYYY-MM-DD for the start of that day in the team’s timezone. |
| end | string | When it ends. Same formats as `start`. |
| location | string | Where it is. |
| agenda | string | What the event is for. |
| memberIds | string[] | Who is expected, as member ids from /members. Empty means the whole team, which is the default. |
| private | boolean | Keep it off Discord and off the schedule for anyone not named. Ignored unless `memberIds` names somebody. |
| rsvpMode | string | How 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 | boolean | Send the "event scheduled" notification. Off by default, so a sync job stays quiet. |
| recurrence | string | Set to `weekly` for a repeating event. weekly |
| recurrenceUntil | string | The 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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Meeting id. |
Body
| Field | Type | Notes |
|---|---|---|
| title | string | What the event is called. |
| type | string | Meetings, outreach and scrimmages only. Competitions come from the FTC sync. meeting · outreach · scrimmage Default meeting. |
| start | string | When it starts. A full ISO timestamp, or YYYY-MM-DD for the start of that day in the team’s timezone. |
| end | string | When it ends. Same formats as `start`. |
| location | string | Where it is. |
| agenda | string | What the event is for. |
| memberIds | string[] | Who is expected, as member ids from /members. Empty means the whole team, which is the default. |
| private | boolean | Keep it off Discord and off the schedule for anyone not named. Ignored unless `memberIds` names somebody. |
| rsvpMode | string | How 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 | boolean | Send the "event scheduled" notification. Off by default, so a sync job stays quiet. |
| notes | string | The 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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Meeting id. |
Body
| Field | Type | Notes |
|---|---|---|
| reason | string | Shown 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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Meeting 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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Meeting id. |
Body
| Field | Type | Notes |
|---|---|---|
| answer * | string | Your answer. going · maybe · not_going |
| reason | string | Why 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.
| Parameter | Type | Notes |
|---|---|---|
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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.
| Parameter | Type | Notes |
|---|---|---|
| open | boolean | Set false to include runs that have been completed. Default true. |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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 /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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Run 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.
| Field | Type | Notes |
|---|---|---|
| title * | string | What the checklist is called. |
| description | string | When it should be worked through. |
| items | object[] | The items, in order.
|
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
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.
| Field | Type | Notes |
|---|---|---|
| checklist * | string | Template id from /checklists. |
| meeting | string | Meeting 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
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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Run id. |
| item * | path | Run item id. |
Body
| Field | Type | Notes |
|---|---|---|
| checked | boolean | False 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
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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Run id. |
Body
| Field | Type | Notes |
|---|---|---|
| complete | boolean | False 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
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.
| Parameter | Type | Notes |
|---|---|---|
| q | string | Text to look for in the title or body. |
| season | integer | FTC season start year, e.g. 2026. |
| subsystem | string | Subsystem name, e.g. "Drivetrain". |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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 /api/v1/documentation/{id}
One notebook entry in full, as plain text.
Returns 403 when the documentation feature is off for the team.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Entry 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
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.
| Field | Type | Notes |
|---|---|---|
| title * | string | What the entry is about. |
| body * | string | The entry itself, as plain text. A blank line starts a new paragraph. |
| date | string | The 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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Entry id. |
Body
| Field | Type | Notes |
|---|---|---|
| title | string | What the entry is about. |
| body | string | The entry itself, as plain text. A blank line starts a new paragraph. |
| date | string | The 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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Entry 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
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.
| Parameter | Type | Notes |
|---|---|---|
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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
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.
| Field | Type | Notes |
|---|---|---|
| title * | string | The headline. |
| body * | string | What the team is being told, as plain text. |
| pinned | boolean | Keep 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 | string | ISO timestamp to send it at. A time in the past sends it now. |
| send | boolean | Post 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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Announcement id. |
Body
| Field | Type | Notes |
|---|---|---|
| title | string | The headline. |
| body | string | What the team is being told, as plain text. |
| pinned | boolean | Keep 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 | string | ISO 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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Announcement 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.
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Announcement 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
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.
| Parameter | Type | Notes |
|---|---|---|
| season | integer | FTC 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
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.
| Parameter | Type | Notes |
|---|---|---|
| status | string | Filter to one status. draft · requested · approved · partially_ordered · ordered · received · backordered · rejected · cancelled |
| mine | boolean | Only requests you filed. |
| season | integer | FTC season start year. Defaults to the current season. |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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
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.
| Parameter | Type | Notes |
|---|---|---|
| mine | boolean | Only spending you logged. |
| season | integer | FTC season start year. Defaults to the current season. |
| limit | integer | Rows per page, 1-200. Default 50. |
| cursor | string | The `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
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.
| Field | Type | Notes |
|---|---|---|
| description * | string | What the money went on. |
| amountCents * | integer | Whole cents. $24.99 is 2499. |
| vendor | string | Who it was bought from. |
| category | string | Budget category name from /finance/summary. "Parts" or "Parts / Raw stock". |
| spentAt | date | ISO date. Defaults to now. |
| season | integer | FTC 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
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.
| Field | Type | Notes |
|---|---|---|
| title * | string | What the request is for. |
| notes | string | Anything the approver should know. |
| neededBy | date | ISO date. Must be in the future. |
| priority | string | How soon it is needed. low · normal · high · urgent Default normal. |
| season | integer | FTC season start year. Defaults to the current season. |
| items * | object[] | The parts to order.
|
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
| Parameter | Type | Notes |
|---|---|---|
| id * | path | Order id. |
Body
| Field | Type | Notes |
|---|---|---|
| decision * | string | What to do with it. approve · reject · cancel |
| reason | string | Why 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
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.
| Parameter | Type | Notes |
|---|---|---|
| season | integer | FTC 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
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.
| Parameter | Type | Notes |
|---|---|---|
| event * | string | FTC event code, e.g. "USCANOQ1". |
| season | integer | FTC 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
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
| Parameter | Type | Notes |
|---|---|---|
| team * | path | The team number the note is about. |
Body
| Field | Type | Notes |
|---|---|---|
| season | integer | FTC season start year. Defaults to the current season. |
| starred | boolean | Whether they are on the watchlist. |
| note | string | What you want to remember. 2,000 characters. |
| tags | string[] | Tag names from /tags/scouting_tag. Replaces the whole list. |
| answers | json | Answers 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.
| Field | Type | Notes |
|---|---|---|
| team * | integer | The team the sheet is about. |
| event * | string | FTC event code. |
| season | integer | FTC season start year. Defaults to the current season. |
| answers * | json | The 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
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 /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.
| Parameter | Type | Notes |
|---|---|---|
| event * | path | FTC event code the board belongs to. |
| season | integer | FTC 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
| Parameter | Type | Notes |
|---|---|---|
| event * | path | FTC event code the board belongs to. |
Body
| Field | Type | Notes |
|---|---|---|
| season | integer | FTC season start year. Defaults to the current season. |
| weights | json | Weight per factor, 0 to 1, keyed the way /picklists/{event} returns them. |
| locked | boolean | Lock 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
| Parameter | Type | Notes |
|---|---|---|
| event * | path | FTC event code the board belongs to. |
| team * | path | The team being moved. |
Body
| Field | Type | Notes |
|---|---|---|
| season | integer | FTC season start year. Defaults to the current season. |
| afterTeam | integer | The team number it should sit behind. 0 for the top of the list. |
| dnp | boolean | Mark, 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
}