API
The Archive's data as JSON, under /api/v1/. It is read from the same database, by the same queries, as the pages, so it never says something the pages do not.
Reading the API is free and needs an account: every request comes with a token made on your account page, or from a browser signed in on the site, and the Archive records which account asked what, and when. The API sends Access-Control-Allow-Origin: *, so a page on any site can read it with a token. Version 1 keeps its fields: a field may be added, but none is renamed or removed without a new version. The only requests that write come from the tooling, described under “Proof of when a run was played” below.
A list comes a page at a time. Its answer carries next_cursor; pass that back as cursor, with the same other parameters, for the next page. A cursor is opaque and belongs to the query it came from. Every answer says in RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset how much of the limit is left.
A token, and where to try it
In your browser, signed in on the site, the API answers you as your account. From a program, make a token under Settings on your account page: give it a name, copy it once, and send it with every request as Authorization: Bearer <token>. A request from nobody is answered 401 and told where to make one. You can have several tokens and revoke any of them there; your account page also shows your latest requests. A token is handed only to an account whose e-mail address is confirmed.
The same API is described as OpenAPI, generated from the same description as this page, and can be tried at /api/docs/ (Swagger UI, served by the Archive itself). Signed in on the site, you need no token there: requests from that page count as your account's. From elsewhere, press Authorize and paste a token.
Endpoints
| Endpoint | Returns |
|---|---|
| GET /api/v1/ | the list of endpoints, and how to get a token |
| GET /api/v1/games | every game with runs |
| GET /api/v1/games/{game} | one game and its categories |
| GET /api/v1/categories | every category that holds runs |
| GET /api/v1/runs | runs, newest first; with a game and a goal, grouped by category and ranked within it |
| GET /api/v1/runs/{run} | one run whole |
| GET /api/v1/runs/{run}/log | the run's log, record by record, in order |
| GET /api/v1/search | the runs whose log matched, best first |
| GET /api/v1/stats | what the Archive holds in numbers |
| POST /api/v1/tickets | a ticket for a run about to be recorded |
| GET /api/v1/tickets/{ticket} | the state of a ticket |
| DELETE /api/v1/tickets/{ticket} | delete a ticket no run was submitted with |
| POST /api/v1/tickets/{ticket}/heads | a hash of the logs as they stand, signed by the Archive with the time |
| POST /api/v1/tickets/{ticket}/extend | start the ticket's period again |
| POST /api/v1/tickets/{ticket}/revoke | the ticket takes no more heads |
| POST /api/v1/bundles | the upload zip of a run |
GET /api/v1/
The list of endpoints, and how to get a token.
No parameters.
Example: GET /api/v1/
| Field in the answer | Type | Meaning |
|---|---|---|
version | integer | |
documentation | string | |
openapi | string | |
authentication | string | |
endpoints | object[] | |
endpoints[].path | string | |
endpoints[].returns | string | |
endpoints[].params | object[] | |
endpoints[].params[].name | string | |
endpoints[].params[].about | string |
| Status | When |
|---|---|
200 | the list of endpoints, and how to get a token |
400 | A parameter or cursor that cannot be read. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
GET /api/v1/games
Every game with runs. Needs: an API token.
No parameters.
Example: GET /api/v1/games
| Field in the answer | Type | Meaning |
|---|---|---|
data | object[] | |
data[].slug | string | |
data[].id | string | |
data[].name | string | |
data[].runs | integer | |
data[].goals | object[] | |
data[].goals[].goal | string | |
data[].goals[].label | string | |
data[].platforms | string[] | |
data[].versions | string[] | |
data[].models | string[] | |
data[].latest | string | |
data[].url | string |
| Status | When |
|---|---|
200 | every game with runs |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/games/{game}
One game and its categories. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
game required | path |
Example: GET /api/v1/games/slay-the-spire
| Field in the answer | Type | Meaning |
|---|---|---|
data | object | |
data.slug | string | |
data.id | string | |
data.name | string | |
data.runs | integer | |
data.goals | object[] | |
data.goals[].goal | string | |
data.goals[].label | string | |
data.platforms | string[] | |
data.versions | string[] | |
data.models | string[] | |
data.latest | string | |
data.url | string | |
data.categories | object[] | |
data.categories[].goal | string | |
data.categories[].goalLabel | string | |
data.categories[].build | string | |
data.categories[].observation | string | |
data.categories[].input | string | |
data.categories[].timing | string | |
data.categories[].human | string | |
data.categories[].game | string | |
data.categories[].runs | integer | |
data.categories[].reached | integer |
| Status | When |
|---|---|
200 | one game and its categories |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/categories
Every category that holds runs. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
game | query | a game's slug, such as slay-the-spire |
goal | query | a goal id, such as act3 |
Example: GET /api/v1/categories?game=slay-the-spire
| Field in the answer | Type | Meaning |
|---|---|---|
data | object[] | |
data[].goal | string | |
data[].goalLabel | string | |
data[].build | string | |
data[].observation | string | |
data[].input | string | |
data[].timing | string | |
data[].human | string | |
data[].game | string | |
data[].runs | integer | |
data[].reached | integer |
| Status | When |
|---|---|
200 | every category that holds runs |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/runs
Runs, newest first; with a game and a goal, grouped by category and ranked within it. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
game | query | a game's slug |
goal | query | a goal id |
observation | query | an axis value (specification §3) |
input | query | an axis value (specification §3) |
timing | query | an axis value (specification §3) |
human | query | an axis value (specification §3) |
model | query | a full model id |
name | query | a part of the model id |
variant | query | a part of the model id |
model_version | query | a part of the model id |
snapshot | query | a part of the model id |
effort | query | as the runtime reported it |
context | query | the context window, as the runtime reported it |
provider | query | as the runtime reported it |
runtime | query | a runtime plugin id |
cli | query | a runtime CLI version |
version | query | a game version |
limit | query | runs per page, at most 100; 50 when left out |
cursor | query | next_cursor from the previous page, with the same other parameters |
Example: GET /api/v1/runs?game=slay-the-spire&goal=act3&limit=10
| Field in the answer | Type | Meaning |
|---|---|---|
data | object[] | the runs of this page |
data[].id | string | the address the run is published under; may change between revisions |
data[].uid | string | the run's identity, written once when the run was configured |
data[].revision | integer | which publication of the run this is |
data[].url | string | the run's page on this site |
data[].game | object | |
data[].game.slug | string | the game's address on this site |
data[].game.id | string | its id in the tooling |
data[].game.name | string | |
data[].game.version | string | |
data[].game.platform | string | |
data[].category | object | The seven axes of the specification's §3, game apart. |
data[].category.goal | string | |
data[].category.goalLabel | string | |
data[].category.build | string | |
data[].category.observation | string | |
data[].category.input | string | |
data[].category.timing | string | |
data[].category.human | string | |
data[].agent | object | |
data[].agent.models | object[] | the models that answered |
data[].agent.models[].model | string | the full model id |
data[].agent.models[].parts | object | name, variant, version, snapshot when the id has them |
data[].agent.models[].effort | string | |
data[].agent.models[].contextWindow | integer | |
data[].agent.models[].maxOutputTokens | integer | |
data[].agent.models[].provider | string | |
data[].agent.requested | object | the model that was asked for, where it differs |
data[].agent.requested.model | string | the full model id |
data[].agent.requested.parts | object | name, variant, version, snapshot when the id has them |
data[].agent.requested.effort | string | |
data[].agent.requested.contextWindow | integer | |
data[].agent.requested.maxOutputTokens | integer | |
data[].agent.requested.provider | string | |
data[].agent.runtime | object | the runtime plugin, with ai: whether a model played |
data[].agent.runtime.id | string | |
data[].agent.runtime.name | string | |
data[].agent.runtime.version | string | |
data[].agent.runtime.ai | boolean | for the runtime: whether a model played (the plugin's hash is one the Archive trusts) |
data[].agent.runtime.cliVersions | string[] | |
data[].agent.harness | object | the harness name and version |
data[].agent.tokens | object | tokens total, input and output, as the runtime reported them |
data[].mods | object[] | |
data[].mods[].name | string | |
data[].mods[].version | string | |
data[].times | object | Seconds, from the bundle's own timeline; never recalculated here. |
data[].times.igt | number | in-game time |
data[].times.rta | number | real time |
data[].times.thinking | number | real time minus playback time |
data[].times.toolCalls | integer | |
data[].times.playbacks | integer | |
data[].times.segments | integer | |
data[].times.toGoal | number | |
data[].reachedGoal | boolean | whether the run reached its declared goal; a run that did not is not ranked |
data[].place | integer | its place in its category, when the list is ranked |
data[].example | boolean | published to show what an entry looks like, not as a submitted run |
data[].title | string | the Archive's own title for the run, where a reviewer gave one |
data[].operator | string | the name on the account that submitted it |
data[].dates | object | |
data[].dates.started | string | |
data[].dates.completed | string | |
data[].dates.ended | string | |
data[].dates.submitted | string | |
data[].dates.published | string | |
data[].dates.zone | string | |
data[].versions | object | bundle and schema versions |
total | integer | how many runs match |
next_cursor | string | pass it as cursor for the next page; null on the last page |
| Status | When |
|---|---|
200 | runs, newest first; with a game and a goal, grouped by category and ranked within it |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/runs/{run}
One run whole. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
run required | path |
Example: GET /api/v1/runs/sts-claude-code-01
| Field in the answer | Type | Meaning |
|---|---|---|
data | object | |
data.id | string | the address the run is published under; may change between revisions |
data.uid | string | the run's identity, written once when the run was configured |
data.revision | integer | which publication of the run this is |
data.url | string | the run's page on this site |
data.game | object | |
data.game.slug | string | the game's address on this site |
data.game.id | string | its id in the tooling |
data.game.name | string | |
data.game.version | string | |
data.game.platform | string | |
data.game.settings | object | |
data.game.mods | object[] | |
data.game.mods[].name | string | |
data.game.mods[].version | string | |
data.game.mods[].source | string | |
data.game.mods[].sha256 | string | |
data.category | object | The seven axes of the specification's §3, game apart. |
data.category.goal | string | |
data.category.goalLabel | string | |
data.category.build | string | |
data.category.observation | string | |
data.category.input | string | |
data.category.timing | string | |
data.category.human | string | |
data.category.goalFinal | boolean | whether the goal is the game's own end |
data.category.humanNotes | string | |
data.agent | object | |
data.agent.models | object[] | the models that answered |
data.agent.models[].model | string | the full model id |
data.agent.models[].parts | object | name, variant, version, snapshot when the id has them |
data.agent.models[].effort | string | |
data.agent.models[].contextWindow | integer | |
data.agent.models[].maxOutputTokens | integer | |
data.agent.models[].provider | string | |
data.agent.requested | object | the model that was asked for, where it differs |
data.agent.requested.model | string | the full model id |
data.agent.requested.parts | object | name, variant, version, snapshot when the id has them |
data.agent.requested.effort | string | |
data.agent.requested.contextWindow | integer | |
data.agent.requested.maxOutputTokens | integer | |
data.agent.requested.provider | string | |
data.agent.runtime | object | the runtime plugin, with ai: whether a model played |
data.agent.runtime.id | string | |
data.agent.runtime.name | string | |
data.agent.runtime.version | string | |
data.agent.runtime.ai | boolean | for the runtime: whether a model played (the plugin's hash is one the Archive trusts) |
data.agent.runtime.cliVersions | string[] | |
data.agent.harness | object | the harness name and version |
data.agent.tokens | object | tokens total, input and output, as the runtime reported them |
data.agent.plugins | object | |
data.agent.tools | object[] | |
data.agent.tools[].name | string | |
data.agent.tools[].description | string | |
data.mods | object[] | |
data.mods[].name | string | |
data.mods[].version | string | |
data.times | object | Seconds, from the bundle's own timeline; never recalculated here. |
data.times.igt | number | in-game time |
data.times.rta | number | real time |
data.times.thinking | number | real time minus playback time |
data.times.toolCalls | integer | |
data.times.playbacks | integer | |
data.times.segments | integer | |
data.times.toGoal | number | |
data.reachedGoal | boolean | whether the run reached its declared goal; a run that did not is not ranked |
data.place | integer | its place in its category, when the list is ranked |
data.example | boolean | published to show what an entry looks like, not as a submitted run |
data.title | string | the Archive's own title for the run, where a reviewer gave one |
data.operator | string | the name on the account that submitted it |
data.dates | object | |
data.dates.started | string | |
data.dates.completed | string | |
data.dates.ended | string | |
data.dates.submitted | string | |
data.dates.published | string | |
data.dates.zone | string | |
data.versions | object | bundle and schema versions |
data.seed | string | |
data.fingerprint | string | sha256 of the run's own log; binds a recording |
data.recording | object | the recording as the bundle states it (SPEC §6) |
data.recording.seconds | number | |
data.recording.segmentSeconds | number[] | |
data.recording.cutVideo | number | |
data.recording.playbackWall | number | |
data.recording.completedRta | number | |
data.recording.videos | object[] | each video with its length and the code or line that binds it |
data.recordings | object[] | |
data.recordings[].url | string | |
data.recordings[].platform | string | |
data.recordings[].host | string | |
data.recordings[].kind | string | |
data.recordings[].confirmedAt | string | |
data.acceptance | object | on whose word the run is in the Archive |
data.acceptance.at | string | |
data.acceptance.by | string | |
data.acceptance.override | boolean | |
data.acceptance.reason | string | |
data.acceptance.missing | string[] | |
data.note | string | |
data.recordCounts | object | |
data.forum | object | |
data.forum.topic | string | |
data.goals | any[] | |
data.ends | any[] | |
data.sections | any[] | |
data.attempts | any[] | |
data.chapters | any[] | |
data.events | object[] | |
data.events[].sequence | integer | |
data.events[].at | number | |
data.events[].time | string | |
data.events[].event | string | |
data.events[].data | object | |
data.checks | any[] | the tooling's check, point by point |
data.signature | object | |
data.signature.signed | boolean | |
data.signature.valid | boolean | |
data.signature.fingerprint | string | |
data.signature.account | string | |
data.files | any[] | |
data.revisions | object[] | |
data.revisions[].revision | integer | |
data.revisions[].published | string | |
data.revisions[].current | boolean | |
data.bundle | string | the zip under /bundles/ |
data.log | string |
| Status | When |
|---|---|
200 | one run whole |
301 | The run is published under another address now; error.location names it. |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/runs/{run}/log
The run's log, record by record, in order. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
run required | path | |
limit | query | records per page, at most 100; 100 when left out |
cursor | query | next_cursor from the previous page, with the same other parameters |
Example: GET /api/v1/runs/sts-claude-code-01/log?limit=100
| Field in the answer | Type | Meaning |
|---|---|---|
run | string | |
data | object[] | |
data[].sequence | integer | the record's place in the log |
data[].at | number | seconds from the start of the recording |
data[].kind | string | |
data[].role | string | who spoke |
data[].tool | string | for a call and its result: the tool |
data[].call | string | the call a result belongs to |
data[].event | string | for an event: its name |
data[].data | object | for an event: what the harness attached |
data[].body | string | what was said, the code that ran, or what came back, as the published log has it |
next_cursor | string | pass it as cursor for the next page; null on the last page |
| Status | When |
|---|---|
200 | the run's log, record by record, in order |
301 | The run is published under another address now; error.location names it. |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/search
The runs whose log matched, best first. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
q | query | the words: "exact phrase", -leave out, prefix*; and conditions on game-state values: current_hp<10, floor>=5, screen_type=MAP, or with the path, game_state.current_hp<10 |
game | query | as for runs |
goal | query | as for runs |
model | query | as for runs |
what | query | said, prompt, code, returned or event |
limit | query | runs per page, at most 20 |
cursor | query | next_cursor from the previous page, with the same other parameters |
Example: GET /api/v1/search?q=boss&game=slay-the-spire
| Field in the answer | Type | Meaning |
|---|---|---|
query | object | the query as read |
total | integer | how many matches |
runs | integer | in how many runs |
data | object[] | |
data[].run | object | |
data[].run.id | string | the address the run is published under; may change between revisions |
data[].run.uid | string | the run's identity, written once when the run was configured |
data[].run.revision | integer | which publication of the run this is |
data[].run.url | string | the run's page on this site |
data[].run.game | object | |
data[].run.game.slug | string | the game's address on this site |
data[].run.game.id | string | its id in the tooling |
data[].run.game.name | string | |
data[].run.game.version | string | |
data[].run.game.platform | string | |
data[].run.category | object | The seven axes of the specification's §3, game apart. |
data[].run.category.goal | string | |
data[].run.category.goalLabel | string | |
data[].run.category.build | string | |
data[].run.category.observation | string | |
data[].run.category.input | string | |
data[].run.category.timing | string | |
data[].run.category.human | string | |
data[].run.agent | object | |
data[].run.agent.models | object[] | the models that answered |
data[].run.agent.models[].model | string | the full model id |
data[].run.agent.models[].parts | object | name, variant, version, snapshot when the id has them |
data[].run.agent.models[].effort | string | |
data[].run.agent.models[].contextWindow | integer | |
data[].run.agent.models[].maxOutputTokens | integer | |
data[].run.agent.models[].provider | string | |
data[].run.agent.requested | object | the model that was asked for, where it differs |
data[].run.agent.requested.model | string | the full model id |
data[].run.agent.requested.parts | object | name, variant, version, snapshot when the id has them |
data[].run.agent.requested.effort | string | |
data[].run.agent.requested.contextWindow | integer | |
data[].run.agent.requested.maxOutputTokens | integer | |
data[].run.agent.requested.provider | string | |
data[].run.agent.runtime | object | the runtime plugin, with ai: whether a model played |
data[].run.agent.runtime.id | string | |
data[].run.agent.runtime.name | string | |
data[].run.agent.runtime.version | string | |
data[].run.agent.runtime.ai | boolean | for the runtime: whether a model played (the plugin's hash is one the Archive trusts) |
data[].run.agent.runtime.cliVersions | string[] | |
data[].run.agent.harness | object | the harness name and version |
data[].run.agent.tokens | object | tokens total, input and output, as the runtime reported them |
data[].run.mods | object[] | |
data[].run.mods[].name | string | |
data[].run.mods[].version | string | |
data[].run.times | object | Seconds, from the bundle's own timeline; never recalculated here. |
data[].run.times.igt | number | in-game time |
data[].run.times.rta | number | real time |
data[].run.times.thinking | number | real time minus playback time |
data[].run.times.toolCalls | integer | |
data[].run.times.playbacks | integer | |
data[].run.times.segments | integer | |
data[].run.times.toGoal | number | |
data[].run.reachedGoal | boolean | whether the run reached its declared goal; a run that did not is not ranked |
data[].run.place | integer | its place in its category, when the list is ranked |
data[].run.example | boolean | published to show what an entry looks like, not as a submitted run |
data[].run.title | string | the Archive's own title for the run, where a reviewer gave one |
data[].run.operator | string | the name on the account that submitted it |
data[].run.dates | object | |
data[].run.dates.started | string | |
data[].run.dates.completed | string | |
data[].run.dates.ended | string | |
data[].run.dates.submitted | string | |
data[].run.dates.published | string | |
data[].run.dates.zone | string | |
data[].run.versions | object | bundle and schema versions |
data[].matches | object[] | every match in that run; the record itself is in the run's log |
data[].matches[].sequence | integer | |
data[].matches[].at | number | |
data[].matches[].kind | string | |
data[].matches[].section | string | |
next_cursor | string | pass it as cursor for the next page; null on the last page |
| Status | When |
|---|---|
200 | the runs whose log matched, best first |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/stats
What the Archive holds in numbers. Needs: an API token.
| Parameter | In | Meaning |
|---|---|---|
game | query | a game's slug; tool calls per section need one |
Example: GET /api/v1/stats?game=portal
| Field in the answer | Type | Meaning |
|---|---|---|
game | string | |
data | object | |
data.totals | object | runs, games, reached, models, runtimes, rta, igt, thinking, toolCalls, tokens |
data.games | object[] | |
data.models | object[] | |
data.runtimes | object[] | |
data.sections | object[] |
| Status | When |
|---|---|
200 | what the Archive holds in numbers |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
429 | Over the limit for this token; Retry-After says when to try again. |
GET /api/v1/tickets/{ticket}
The state of a ticket. Needs: the tooling's sign-in, or the ticket's own secret.
| Parameter | In | Meaning |
|---|---|---|
ticket required | path |
| Status | When |
|---|---|
200 | the ticket's heads and receipts |
404 | no such ticket for you |
Errors and limits
An error is an answer with the status and an object error holding status and message, the message in words. The statuses each endpoint can answer are in its own table above and in the OpenAPI document.
| Status | When |
|---|---|
301 | The run is published under another address now; error.location names it. |
400 | A parameter or cursor that cannot be read. |
401 | No token, or a revoked one: make one on your account page. |
404 | No such game, run or endpoint. |
405 | Anything but GET: the API only reads. |
409 | the ticket has lapsed |
422 | refused, with `code` and `reasons` |
429 | Over the limit for this token; Retry-After says when to try again. |
The limit is 300 requests per 5 minutes per token; every answer says in its RateLimit headers how much is left.
The shape of things
A run has three identifiers, and they are not interchangeable: uid is the identity, written once when the run was configured and never changed; id is the address it was published under and may change; revision counts publications of that same run. A series may start above 1 and may have gaps.
Timings come from the bundle's own timeline.json and are never recalculated here: rta is real time, igt the time the game actually ran, thinking the difference between real time and the time playbacks took.
No video is served. Where a recording is published is archive data added by the submitter. A recording is tied to a bundle by its verification code, aas and the first 32 hex digits of the fingerprint, which is the sha256 of the run's own session.sanitized.jsonl; the code stands in the video's description, or in its title.
The bundles themselves
Under /bundles/<run>.r<revision>.zip every revision of a bundle is served as it passed the Archive's checks when it was uploaded, without the private part of the upload. That is the evidence: anyone can recalculate the hashes against manifest.json without trusting anything this site says, on their own machine or in the browser.
Proof of when a run was played
- The tooling asks the Archive to confirm when a run was played only when the runner is signed in with
aas login, or has said yes to it for that run. It then makes three kinds of request to this site: one ticket before the run; a hash of its own logs at the start and end of every segment and once an hour, which the Archive signs with the time it received it; and, when the runner submits, the bundle. Nothing about the runner or the run goes with the ticket or the hashes. - The signatures are made with the Archive's proof key, published at
/.well-known/aas-proof.txt, and they travel in the bundle'sproof.json, so anyone can check them against that key. When a run is submitted the Archive holds them against what it received.
POST /api/v1/tickets
A ticket for a run about to be recorded. Needs: the tooling's sign-in.
No parameters.
| Status | When |
|---|---|
200 | the ticket, when it was issued, when it lapses, and the Archive's signature |
429 | Over the limit for this token; Retry-After says when to try again. |
DELETE /api/v1/tickets/{ticket}
Delete a ticket no run was submitted with. Needs: the tooling's sign-in, or the ticket's own secret.
| Parameter | In | Meaning |
|---|---|---|
ticket required | path |
| Status | When |
|---|---|
200 | deleted |
404 | no such ticket for you |
POST /api/v1/tickets/{ticket}/heads
A hash of the logs as they stand, signed by the Archive with the time. Needs: the tooling's sign-in, or the ticket's own secret.
| Parameter | In | Meaning |
|---|---|---|
ticket required | path |
| Status | When |
|---|---|
200 | done; for heads, the receipt |
404 | no such ticket for you |
409 | the ticket has lapsed |
POST /api/v1/tickets/{ticket}/extend
Start the ticket's period again. Needs: the tooling's sign-in, or the ticket's own secret.
| Parameter | In | Meaning |
|---|---|---|
ticket required | path |
| Status | When |
|---|---|
200 | done; for heads, the receipt |
404 | no such ticket for you |
409 | the ticket has lapsed |
POST /api/v1/tickets/{ticket}/revoke
The ticket takes no more heads. Needs: the tooling's sign-in, or the ticket's own secret.
| Parameter | In | Meaning |
|---|---|---|
ticket required | path |
| Status | When |
|---|---|
200 | done; for heads, the receipt |
404 | no such ticket for you |
409 | the ticket has lapsed |
POST /api/v1/bundles
The upload zip of a run. Needs: the tooling's sign-in.
No parameters.
| Status | When |
|---|---|
200 | received: `status` review, the submission's number, the proof's status and the reasons a reviewer will see |
401 | sign in with aas login |
422 | refused, with `code` and `reasons` |