{"openapi":"3.1.0","info":{"title":"releaseszn API","description":"Publish software releases on releaseszn: add a project from GitHub, prepare the imported release (changelog, screenshots), check it and publish it. Built for coding agents: every error has a stable `code` and a `fix` for this exact request (/docs/errors), and every media response says what to do `next`. Guides: /docs/quickstart and /docs/submit-prompt.md.","license":{"name":""},"version":"1"},"servers":[{"url":"https://releaseszn.com/api/v1"}],"paths":{"/auth/device":{"post":{"tags":["account"],"summary":"Start a device sign-in","description":"For an agent without a token: answers a `user_code` and a link to show the author, who signs in on releaseszn and approves. Meanwhile poll `POST /auth/device/token` every `interval` seconds; once approved it answers a `submit` token, once. No token needed. 10 an hour per address, 30 per IPv6 /48.","operationId":"start_device_sign_in","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DeviceStartBody"},{"type":"null"}]}}}},"responses":{"200":{"description":"Show the author the link and code, then poll","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStart"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{}]}},"/auth/device/token":{"post":{"tags":["account"],"summary":"Poll a device sign-in","description":"Every `interval` seconds, until the author decides: `authorization_pending` while they haven't, `slow_down` when polled sooner, `access_denied` or `expired_token`. Once approved, answers a new `submit` token of the approving account, once: save it without printing it. No token needed.","operationId":"poll_device_sign_in","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevicePollBody"}}},"required":true},"responses":{"200":{"description":"The token, shown this once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceToken"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{}]}},"/feedback":{"post":{"tags":["feedback"],"summary":"Send feedback","description":"An idea, a bug report or a question for the people who run releaseszn. No token is needed; with one, the message carries your handle. At most 5 messages an hour per account, or per address without a token, and 60 an hour from everyone together.","operationId":"send_feedback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackBody"}}},"required":true},"responses":{"201":{"description":"Stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackReceived"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"token":[]}]}},"/me":{"get":{"tags":["account"],"summary":"Check the token","description":"Who the token belongs to, its scopes, its rate limit, and whether GitHub still accepts the author's sign-in on the website (`github.status`; `renew_required` means POST /projects would answer github_reauth_required). Works with any scope: call it first.","operationId":"get_me","responses":{"200":{"description":"The token's owner","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":[]}]},"delete":{"tags":["account"],"summary":"Delete the account permanently","description":"Deletes the token owner's account: every project with its releases, screenshots (their files too) and placements, plus their votes, impressions, sessions and API tokens, this one included. It can't be undone: ask the person first, then repeat their handle in `confirm`. Signing in with GitHub again creates a new, empty account. A token from a device sign-in can't do this (`403 device_token_cannot_delete_account`): only one created on /settings/tokens can.","operationId":"delete_me","parameters":[{"name":"confirm","in":"query","description":"The account's handle: deleting is permanent, so it must be confirmed\nexplicitly.","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/media/{id}":{"get":{"tags":["media"],"summary":"Get media and its quality report","description":"Poll until `status` is `ready` (check `hero_ok` and `quality`) or `failed` (see `error.fix`).","operationId":"get_media","parameters":[{"name":"id","in":"path","description":"Media id","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"The media","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"token":[]}]},"delete":{"tags":["media"],"summary":"Delete media","description":"Deletes the media and its stored files. A published release's hero can't be deleted (replace it instead), and nothing of a published release once its edit window has closed.","operationId":"delete_media","parameters":[{"name":"id","in":"path","description":"Media id","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"Deleted"},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]},"patch":{"tags":["media"],"summary":"Update media","operationId":"update_media","parameters":[{"name":"id","in":"path","description":"Media id","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUpdate"}}},"required":true},"responses":{"200":{"description":"The updated media","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/media/{id}/complete":{"post":{"tags":["media"],"summary":"Finish a presigned upload","description":"Call after the `PUT` to `upload.url` succeeded; processing starts. An upload that failed can be sent and completed once more (`409 upload_spent` after that, and for a file that was too complex to convert).","operationId":"complete_upload","parameters":[{"name":"id","in":"path","description":"Media id","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"Idempotency-Key","in":"header","description":"Retry-safe key: a repeat with the same key replays the first response for 24 hours","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Already processing or ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"202":{"description":"Processing; poll GET /media/{id}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects":{"get":{"tags":["projects"],"summary":"List your projects","operationId":"list_projects","parameters":[{"name":"mine","in":"query","description":"Must be `true`: only your own projects can be listed.","required":false,"schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Projects per page, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"cursor","in":"query","description":"`next_cursor` of the previous page.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Your projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["read"]}]},"post":{"tags":["projects"],"summary":"Add a project","description":"Lists a GitHub repository you admin or maintain and imports its releases in the background. An unclaimed project is claimed (200); your own is returned as is (200).","operationId":"create_project","parameters":[{"name":"Idempotency-Key","in":"header","description":"Retry-safe key: a repeat with the same key replays the first response for 24 hours","required":false,"schema":{"type":["string","null"]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBody"}}},"required":true},"responses":{"200":{"description":"Already yours, or claimed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"201":{"description":"Created; poll `import_status`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}":{"get":{"tags":["projects"],"summary":"Get a project","description":"Public; with a token, its owner also sees it while hidden by moderators.","operationId":"get_project","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"token":[]}]},"delete":{"tags":["projects"],"summary":"Delete a project permanently","description":"Deletes the project with all its releases, screenshots (their files too), tags, votes and board placements. It can't be undone: ask the author first, then repeat the slug in `confirm`. The repository can be added again later as a new project.","operationId":"delete_project","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"confirm","in":"query","description":"The project's slug again: deleting is permanent, so it must be\nconfirmed explicitly.","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]},"patch":{"tags":["projects"],"summary":"Update a project","operationId":"update_project","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}},"required":true},"responses":{"200":{"description":"The updated project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}/media":{"post":{"tags":["media"],"summary":"Add media","description":"URL import (`source_url`; 202, processed in the background) or presigned upload (`filename`, `content_type`, `bytes`; 201 with `upload`). Screenshots (PNG, JPEG, WebP), GIFs and terminal recordings (asciinema `.cast`), the last two shown as video. A GIF is carousel and gallery only; a recording may be the hero, its poster frame then being the still image that is checked. A new hero replaces the release's current one. Poll `GET /media/{id}` for the quality report.","operationId":"create_media","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Retry-safe key: a repeat with the same key replays the first response for 24 hours","required":false,"schema":{"type":["string","null"]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaRequest"}}},"required":true},"responses":{"201":{"description":"Presigned upload: PUT the file to `upload.url`, then POST /media/{id}/complete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaCreated"}}}},"202":{"description":"URL import queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaCreated"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}/releases":{"get":{"tags":["releases"],"summary":"List a project's releases","description":"Public; drafts only for the owner's token.","operationId":"list_releases","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Only releases with this status: `draft`, `published` or `history`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Releases per page, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"cursor","in":"query","description":"`next_cursor` of the previous page.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Releases, newest first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseList"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"token":[]}]}},"/projects/{slug}/releases/{tag}":{"get":{"tags":["releases"],"summary":"Get a release","description":"Public; a draft only for the owner's token.","operationId":"get_release","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"tag","in":"path","description":"Git tag of the release, e.g. `v1.2.0`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The release with its media","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{},{"token":[]}]},"patch":{"tags":["releases"],"summary":"Update a release","description":"Title, changelog and models of the draft, or of a published release within 24 hours of publishing.","operationId":"update_release","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"tag","in":"path","description":"Git tag of the release, e.g. `v1.2.0`","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdate"}}},"required":true},"responses":{"200":{"description":"The updated release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}/releases/{tag}/check":{"post":{"tags":["releases"],"summary":"Check before publishing","description":"Runs every publishing gate without publishing: each failed gate has a `fix`.","operationId":"check_release","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"tag","in":"path","description":"Git tag of the release, e.g. `v1.2.0`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The gate report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}/releases/{tag}/publish":{"post":{"tags":["releases"],"summary":"Publish a release","description":"Publishes the release if every blocking gate passes. Ask the author first. A refusal (409/422) includes the gate `report`.","operationId":"publish_release","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"tag","in":"path","description":"Git tag of the release, e.g. `v1.2.0`","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Retry-safe key: a repeat with the same key replays the first response for 24 hours","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Published"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/projects/{slug}/stats":{"get":{"tags":["projects"],"summary":"Your project's stats","description":"How your project and its releases do on releaseszn, for its owner only: headline numbers with the change against the previous period, a daily series, each release's numbers and rates against the site's recent releases, its place on the boards and in the hot feed, how upvotes were weighted, and where viewers came from. Aggregates only, never who. Explained at /docs/stats.","operationId":"get_project_stats","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","description":"`7d`, `30d` (the default) or `all`.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The stats","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStats"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["read"]}]}},"/projects/{slug}/sync":{"post":{"tags":["projects"],"summary":"Re-import from GitHub","description":"Fetches new GitHub releases and repository metadata in the background.","operationId":"sync_project","parameters":[{"name":"slug","in":"path","description":"Project slug","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Retry-safe key: a repeat with the same key replays the first response for 24 hours","required":false,"schema":{"type":["string","null"]}}],"responses":{"202":{"description":"Queued; poll the project's `import_status`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncStarted"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"token":["submit"]}]}},"/rules":{"get":{"tags":["reference"],"summary":"Get the submission rules","description":"Every limit and threshold in force: changelog length, media types and sizes, hero quality thresholds, edit window, rate limits and `llm_providers`. Read it instead of hard-coding numbers.","operationId":"get_rules","responses":{"200":{"description":"The rules","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{}]}},"/tags":{"get":{"tags":["reference"],"summary":"List tags","operationId":"list_tags","parameters":[{"name":"kind","in":"query","description":"Only this kind: `ai`, `cat`, `platform`, `lang` or `license`.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag kinds and tags","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tags"}}}},"4XX":{"description":"See /docs/errors","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{}]}}},"components":{"schemas":{"Audience":{"type":"object","description":"Who looked.","required":["signed_in","anonymous","signed_in_viewers","returning"],"properties":{"anonymous":{"type":"integer","format":"int64","description":"Anonymous viewers (distinct per day, summed)."},"returning":{"type":"integer","format":"int64","description":"… of whom had seen an earlier release of the project."},"signed_in":{"type":"integer","format":"int64","description":"Signed-in viewers (distinct per day, summed)."},"signed_in_viewers":{"type":"integer","format":"int64","description":"Signed-in viewers in the period."}}},"BoardSpot":{"type":"object","description":"A live board and where the project stands on it.","required":["board","title","period","url","places","weighted_votes","needed","ends_at","final_at","status"],"properties":{"board":{"type":"string","description":"`day`, `week` or `month`."},"ends_at":{"type":"string","format":"date-time","description":"When the period ends, RFC 3339."},"final_at":{"type":"string","format":"date-time","description":"When it's final, RFC 3339."},"needed":{"type":"number","format":"double","description":"Weighted upvotes needed to place."},"period":{"type":"string","description":"The open period, e.g. \"Week 41, 2026\"."},"places":{"type":"integer","format":"int64","description":"Places on the board."},"rank":{"type":["integer","null"],"format":"int64","description":"Its rank among projects, from 1."},"score":{"type":["number","null"],"format":"double","description":"Its score and the last podium place's (upvote rates)."},"status":{"type":"string","description":"Where it stands, in a sentence."},"title":{"type":"string","description":"\"Release of the Day\", …."},"to_beat":{"type":["number","null"],"format":"double","description":"The score to beat for the last place, if it's below the podium."},"url":{"type":"string","description":"Its page."},"version":{"type":["string","null"],"description":"The project's release competing (its best), if any."},"weighted_votes":{"type":"number","format":"double","description":"Its weighted upvotes."}}},"CheckLine":{"type":"object","description":"A check of the hero screenshot.","required":["check","label","ok"],"properties":{"check":{"type":"string","description":"Check name (MEDIA.md §2.3)."},"fix":{"type":["string","null"],"description":"What to do, when it failed."},"label":{"type":"string","description":"Label."},"ok":{"type":"boolean","description":"Passed."}}},"CreateBody":{"type":"object","description":"Add (or claim) a project from a GitHub repository you admin or maintain.","required":["repo_url"],"properties":{"description":{"type":"string","description":"Longer description (markdown)."},"homepage_url":{"type":["string","null"],"description":"Homepage (`https`); defaults to the repository's."},"repo_url":{"type":"string","description":"GitHub repository URL, e.g. `https://github.com/owner/repo`."},"summary":{"type":"string","description":"One-line summary shown on cards (limits in `GET /rules`)."},"tags":{"type":"array","items":{"type":"string"},"description":"Chosen tags (`ai/…` exactly one, `cat/…`, `platform/…`; see\n`GET /tags`)."}},"additionalProperties":false},"Day":{"type":"object","description":"One bar of a series.","required":["date","impressions","opens","repo_clicks","votes","follows","saves","page_views","badge_loads","released"],"properties":{"badge_loads":{"type":"integer","format":"int64","description":"README badge loads."},"date":{"type":"string","description":"The UTC day, `YYYY-MM-DD`."},"follows":{"type":"integer","format":"int64","description":"New followers."},"impressions":{"type":"integer","format":"int64","description":"Times seen."},"opens":{"type":"integer","format":"int64","description":"Release page opens from cards."},"page_views":{"type":"integer","format":"int64","description":"Release page views."},"released":{"type":"array","items":{"type":"string"},"description":"Versions posted that day."},"repo_clicks":{"type":"integer","format":"int64","description":"Repository clicks."},"saves":{"type":"integer","format":"int64","description":"New saves."},"stars":{"type":["integer","null"],"format":"int64","description":"GitHub stars seen that day."},"votes":{"type":"integer","format":"int64","description":"Upvotes."}}},"DevicePollBody":{"type":"object","description":"A poll.","required":["device_code"],"properties":{"device_code":{"type":"string","description":"The `device_code` from `POST /auth/device`."}},"additionalProperties":false},"DeviceStart":{"type":"object","description":"A sign-in waiting for the author.","required":["device_code","user_code","verification_uri","verification_uri_complete","expires_in","interval","next"],"properties":{"device_code":{"type":"string","description":"Secret: send it to `POST /auth/device/token`. Never show it to\nanyone; it is good for one token, for 10 minutes."},"expires_in":{"type":"integer","format":"int64","description":"Seconds until the codes expire."},"interval":{"type":"integer","format":"int64","description":"Seconds to wait between polls."},"next":{"type":"string","description":"What to do now."},"user_code":{"type":"string","description":"What the author confirms on the page, e.g. `BCDF-GHJK`. Show it."},"verification_uri":{"type":"string","description":"The page where the author types the code."},"verification_uri_complete":{"type":"string","description":"The same page with the code filled in: the link to show."}}},"DeviceStartBody":{"type":"object","description":"What the agent says about itself (the body is optional).","properties":{"client_name":{"type":["string","null"],"description":"Who is asking, shown to the author and given to the token as its\nname: 1–60 characters, e.g. \"Claude Code in ripfast\". Without it,\n\"Agent (device sign-in)\"."}},"additionalProperties":false},"DeviceToken":{"type":"object","description":"The token, answered once.","required":["token","token_type","name","scopes","expires_at","handle","next"],"properties":{"expires_at":{"type":"string","format":"date-time","description":"When it stops working (RFC 3339), 90 days from now."},"handle":{"type":"string","description":"The account it belongs to: whoever approved."},"name":{"type":"string","description":"Its name on `/settings/tokens`: the `client_name` sent."},"next":{"type":"string","description":"What to do now."},"scopes":{"type":"array","items":{"type":"string"},"description":"Always `[\"submit\"]`."},"token":{"type":"string","description":"The API token (`rsz_…`), shown this once. Save it without printing\nit, e.g. to `~/.config/releaseszn/auth-header`."},"token_type":{"type":"string","description":"Always `Bearer`: send it as `Authorization: Bearer rsz_…`."}}},"FeedPlace":{"type":"object","description":"Where a release sits in the live hot feed.","required":["position","of","slot","slot_words","parts"],"properties":{"fresh_left":{"type":["integer","null"],"format":"int64","description":"Fresh-lane impressions still guaranteed, if it's in the lane."},"of":{"type":"integer","format":"int64","description":"Cards in the feed."},"parts":{"type":"array","items":{"$ref":"#/components/schemas/ScorePart"},"description":"The score's parts."},"position":{"type":"integer","format":"int64","description":"Position, from 1."},"slot":{"type":"string","description":"`ranked`, `fresh` or `explore`."},"slot_words":{"type":"string","description":"Why it's in that slot."}}},"FeedbackBody":{"type":"object","description":"A message for the operators.","required":["kind","message"],"properties":{"email":{"type":["string","null"],"description":"An address to reply to, if you want an answer."},"kind":{"type":"string","description":"`idea`, `bug`, `question` or `other`."},"message":{"type":"string","description":"10 to 5,000 characters. For a bug: what you sent, what came back\n(the error's `code`), and what you expected."},"name":{"type":["string","null"],"description":"Who is writing, up to 100 characters. With a token, your handle is\nused when this is absent."},"page":{"type":["string","null"],"description":"The site path this is about, e.g. `/docs/errors`."}},"additionalProperties":false},"FeedbackReceived":{"type":"object","description":"The message was stored.","required":["received"],"properties":{"received":{"type":"boolean","description":"Always `true`: the operators will read it."}}},"FieldError":{"type":"object","description":"One problem with one field of a request, as returned in a problem's\n`errors` list.","required":["field","code","message"],"properties":{"code":{"type":"string","description":"Stable code."},"field":{"type":"string","description":"JSON field, e.g. `summary` or `models[2].provider`."},"message":{"type":"string","description":"What's wrong and how to fix it."}}},"Following":{"type":"object","description":"Followers, saves and stars.","required":["followers","saves","stars"],"properties":{"followers":{"type":"integer","format":"int64","description":"Followers now."},"saves":{"type":"integer","format":"int64","description":"Saves now."},"stars":{"type":"integer","format":"int64","description":"GitHub stars at the last sync."},"stars_gained":{"type":["integer","null"],"format":"int64","description":"Stars gained over the period, from the daily snapshots."}}},"Gate":{"type":"object","description":"One gate's result.","required":["gate","ok"],"properties":{"code":{"type":["string","null"],"description":"Stable code, when it failed."},"detail":{"type":["string","null"],"description":"What was found."},"fix":{"type":["string","null"],"description":"What to do, when it failed."},"gate":{"type":"string","description":"Gate name."},"ok":{"type":"boolean","description":"Passed."}}},"GitHubSignIn":{"type":"string","description":"Whether GitHub still accepts the author's sign-in on the website.","enum":["ok","renew_required","unknown"]},"Group":{"type":"object","description":"A row of a breakdown.","required":["key","label","count","share"],"properties":{"count":{"type":"integer","format":"int64","description":"Count."},"key":{"type":"string","description":"Stable key (`home`, `news.ycombinator.com`, `other`, …)."},"label":{"type":"string","description":"Label."},"share":{"type":"number","format":"double","description":"Share of the breakdown's total, 0 to 1."}}},"Hour":{"type":"object","description":"An hour of a release's launch.","required":["hour","impressions","opens"],"properties":{"hour":{"type":"integer","format":"int64","description":"Hours after posting, 0 to 47."},"impressions":{"type":"integer","format":"int64","description":"Times seen."},"opens":{"type":"integer","format":"int64","description":"Release page opens."}}},"Me":{"type":"object","description":"Who the token belongs to, and its rate limit.","required":["user","token","rate_limit","github"],"properties":{"github":{"$ref":"#/components/schemas/MeGitHub"},"rate_limit":{"$ref":"#/components/schemas/MeRateLimit"},"token":{"$ref":"#/components/schemas/MeToken"},"user":{"$ref":"#/components/schemas/MeUser"}}},"MeGitHub":{"type":"object","description":"The author's GitHub sign-in, which `POST /projects` uses to check\nrepository permissions, so an agent can see a sign-in that needs\nrenewing before doing any work. Checked with GitHub at most once a minute\nper account; a new sign-in is checked at once.","required":["status","renew_url","next"],"properties":{"next":{"type":"string","description":"What to do now, as a sentence."},"renew_url":{"type":"string","description":"Where the author renews it, in a browser (works while signed in)."},"status":{"$ref":"#/components/schemas/GitHubSignIn","description":"`ok`, `renew_required` or `unknown`."}}},"MeRateLimit":{"type":"object","description":"The token's rate limit right now (this request included).","required":["limit","remaining","reset_seconds"],"properties":{"limit":{"type":"integer","description":"Requests allowed per minute.","minimum":0},"remaining":{"type":"integer","description":"Requests left in this minute.","minimum":0},"reset_seconds":{"type":"integer","format":"int64","description":"Seconds until the budget is full again.","minimum":0}}},"MeToken":{"type":"object","description":"The token itself (never its secret).","required":["name","prefix","scopes","expires_at"],"properties":{"expires_at":{"type":"string","format":"date-time","description":"When it stops working (RFC 3339): 90 days after it was made at most."},"name":{"type":"string","description":"Name given when it was created."},"prefix":{"type":"string","description":"First characters, as shown on `/settings/tokens`."},"scopes":{"type":"array","items":{"type":"string"},"description":"`read` and/or `submit`."}}},"MeUser":{"type":"object","description":"The token's owner.","required":["handle"],"properties":{"display_name":{"type":["string","null"],"description":"Display name, if set."},"handle":{"type":"string","description":"Handle (the GitHub login at sign-up)."}}},"Media":{"type":"object","description":"A screenshot, GIF or terminal recording and its processing state.","required":["id","kind","role","status","project","alt_text","position","urls","hero_ok"],"properties":{"alt_text":{"type":"string","description":"What it shows, for screen readers."},"bytes":{"type":["integer","null"],"format":"int64","description":"Size of the upload in bytes."},"error":{"type":["object","null"],"description":"Why processing failed: `{code, message, fix}`."},"height":{"type":["integer","null"],"format":"int32","description":"Height in pixels, once processed."},"hero_ok":{"type":"boolean","description":"Passes every hero check (`MEDIA.md`), so it can be a release's hero."},"id":{"type":"integer","format":"int64","description":"Media id."},"kind":{"type":"string","description":"`image`; `video` for a GIF and `cast` for a terminal recording, which\nare both shown as a muted, looping MP4 (`urls.mp4`) with the WebP\nvariants as its poster."},"next":{"type":["string","null"],"description":"What to do next, if anything."},"position":{"type":"integer","format":"int32","description":"Order in the carousel or gallery."},"project":{"type":"string","description":"Project slug."},"quality":{"type":["object","null"],"description":"The quality report: one entry per check, each failed one with a\n`fix`."},"release_tag":{"type":["string","null"],"description":"Release it belongs to; `null` for the project gallery."},"role":{"type":"string","description":"`hero`, `carousel` or `gallery`."},"source_url":{"type":["string","null"],"description":"Where it was imported from (URL imports)."},"status":{"type":"string","description":"`pending`, `processing`, `ready` or `failed`."},"urls":{"type":"object","description":"Processed variants: WebP by width, e.g. `{\"w720\": \"https://…\"}`, and\n`mp4` for a GIF or a terminal recording.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"width":{"type":["integer","null"],"format":"int32","description":"Width in pixels, once processed."}}},"MediaCreated":{"allOf":[{"$ref":"#/components/schemas/Media","description":"The new media."},{"type":"object","properties":{"replaced_media_id":{"type":["integer","null"],"format":"int64","description":"The previous hero, deleted because this one replaces it."},"upload":{"oneOf":[{"$ref":"#/components/schemas/UploadInstructions","description":"Presigned uploads only: where to `PUT` the file."},{"type":"null"}]}}}],"description":"Media just added."},"MediaRequest":{"type":"object","description":"Add media, either by **URL import** (`source_url`) or by **presigned\nupload** (`filename`, `content_type` and `bytes`, then `PUT` the file to\nthe returned `upload.url` and `POST /media/{id}/complete`).","properties":{"alt_text":{"type":"string","description":"What the media shows, for screen readers (length limits in\n`GET /rules`)."},"bytes":{"type":["integer","null"],"format":"int64","description":"Presigned upload: the size in bytes (limit in `GET /rules`)."},"content_type":{"type":["string","null"],"description":"Presigned upload: `image/png`, `image/jpeg`, `image/webp`,\n`image/gif`, or `application/x-asciicast` for a terminal recording\n(`.cast`). The last two are carousel and gallery only."},"filename":{"type":["string","null"],"description":"Presigned upload: the file name."},"release_tag":{"type":["string","null"],"description":"Release the media belongs to; omitted for the project gallery."},"role":{"type":["string","null"],"description":"`hero`, `carousel` or `gallery`."},"source_url":{"type":["string","null"],"description":"URL import: an `https` URL the server fetches the file from."}},"additionalProperties":false},"MediaUpdate":{"type":"object","description":"Change media; omitted fields stay as they are.","properties":{"alt_text":{"type":["string","null"],"description":"New alt text."},"position":{"type":["integer","null"],"format":"int32","description":"New position, 0–99."},"release_tag":{"type":["string","null"],"description":"Move it to another release (with `role`)."},"role":{"type":["string","null"],"description":"New role: `hero`, `carousel` or `gallery` (a hero must pass every\nhero check to replace a published one)."}},"additionalProperties":false},"Metric":{"type":"object","description":"A headline number with its change against the previous period.","required":["key","label","hint","unit","value"],"properties":{"hint":{"type":"string","description":"What it counts, in a sentence."},"key":{"type":"string","description":"Stable key, e.g. `impressions`."},"label":{"type":"string","description":"Label."},"previous":{"type":["number","null"],"format":"double","description":"Value in the period before, if bounded."},"unit":{"$ref":"#/components/schemas/Unit","description":"Unit."},"value":{"type":"number","format":"double","description":"Value in the period."}}},"Model":{"type":"object","description":"An LLM used to build the release (optional; see `llm_providers` in\n`GET /rules`).","required":["provider","model"],"properties":{"model":{"type":"string","description":"Model id as the author knows it."},"provider":{"type":"string","description":"One of [`LLM_PROVIDERS`]."}},"additionalProperties":false},"Period":{"type":"object","description":"The period covered.","required":["name","label","from","to"],"properties":{"from":{"type":"string","format":"date","description":"First day, `YYYY-MM-DD`."},"label":{"type":"string","description":"Label."},"name":{"type":"string","description":"`7d`, `30d` or `all`."},"to":{"type":"string","format":"date","description":"Last day (today, UTC)."}}},"Problem":{"type":"object","description":"An error: RFC 9457 problem details (`application/problem+json`) with a\nstable `code` and a `fix` sentence for this exact request. Every code is\nlisted at `/docs/errors`.","required":["type","title","status","code","fix"],"properties":{"code":{"type":"string","description":"Stable error code, e.g. `validation_failed` or `hero_locked`."},"detail":{"type":["string","null"],"description":"More about this request, when there is something to add."},"errors":{"type":"array","items":{"$ref":"#/components/schemas/FieldError"},"description":"One entry per invalid field (`422 validation_failed`)."},"fix":{"type":"string","description":"What to do about it, for this request."},"report":{"oneOf":[{"$ref":"#/components/schemas/Report","description":"The gate report, when `publish` was refused."},{"type":"null"}]},"status":{"type":"integer","format":"int32","description":"The HTTP status.","minimum":0},"title":{"type":"string","description":"Short summary of the error."},"type":{"type":"string","description":"Always `/docs/errors`."}}},"Project":{"type":"object","description":"A project: a GitHub repository listed on releaseszn.","required":["slug","url","repo_url","name","summary","description","tags","stars","import_status","hidden","releases_url"],"properties":{"created_at":{"type":["string","null"],"format":"date-time","description":"When it was added (RFC 3339)."},"description":{"type":"string","description":"Longer description (markdown)."},"hidden":{"type":"boolean","description":"Hidden by moderators: off the site and the public API; only you\nstill see it."},"homepage_url":{"type":["string","null"],"description":"Homepage, if any."},"import_error":{"type":["string","null"],"description":"Why the import failed, if it did."},"import_status":{"type":"string","description":"`pending`, `running`, `done` or `failed`: the GitHub import."},"license":{"type":["string","null"],"description":"SPDX license id from GitHub, if any."},"name":{"type":"string","description":"Name (the repository's)."},"owner":{"type":["string","null"],"description":"Owner's handle; `null` while unclaimed."},"releases_url":{"type":"string","description":"Its releases in this API."},"repo_url":{"type":"string","description":"GitHub repository."},"slug":{"type":"string","description":"URL slug; never changes."},"stars":{"type":"integer","format":"int32","description":"GitHub stars at the last import."},"summary":{"type":"string","description":"One-line summary shown on cards."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags as `kind/name`, e.g. `lang/rust` (see `GET /tags`)."},"url":{"type":"string","description":"The project page on the site."}}},"ProjectList":{"type":"object","description":"The caller's projects.","required":["projects"],"properties":{"next_cursor":{"type":["string","null"],"description":"Pass it as `?cursor=` for the next page; `null` on the last one."},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"},"description":"Newest first, one page of them."}}},"ProjectRef":{"type":"object","description":"The project.","required":["slug","name","url"],"properties":{"name":{"type":"string","description":"Name."},"slug":{"type":"string","description":"Slug."},"url":{"type":"string","description":"Project page path."}}},"ProjectStats":{"type":"object","description":"Everything about a project's performance on releaseszn, for its owner.","required":["project","period","generated_at","overview","daily","releases","boards","placements","votes","sources","audience","page_referrers","following"],"properties":{"audience":{"$ref":"#/components/schemas/Audience","description":"Who looked."},"boards":{"type":"array","items":{"$ref":"#/components/schemas/BoardSpot"},"description":"Live boards."},"daily":{"type":"array","items":{"$ref":"#/components/schemas/Day"},"description":"Day by day."},"following":{"$ref":"#/components/schemas/Following","description":"Followers, saves and stars."},"generated_at":{"type":"string","format":"date-time","description":"When computed, RFC 3339."},"overview":{"type":"array","items":{"$ref":"#/components/schemas/Metric"},"description":"Headline numbers."},"page_referrers":{"type":"array","items":{"$ref":"#/components/schemas/Group"},"description":"Sites that linked to release pages (external only)."},"period":{"$ref":"#/components/schemas/Period","description":"The period."},"placements":{"type":"array","items":{"$ref":"#/components/schemas/Won"},"description":"Places won, newest first."},"project":{"$ref":"#/components/schemas/ProjectRef","description":"The project."},"releases":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseStats"},"description":"Release by release, newest first."},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"},"description":"Where views came from."},"votes":{"$ref":"#/components/schemas/Votes","description":"Upvotes."}}},"ProjectUpdate":{"type":"object","description":"Change a project; omitted fields stay as they are.","properties":{"description":{"type":["string","null"],"description":"New description (markdown)."},"homepage_url":{"type":["string","null"],"description":"New homepage (`https`); `null` clears it."},"summary":{"type":["string","null"],"description":"New summary."},"tags":{"type":["array","null"],"items":{"type":"string"},"description":"New chosen tags (they replace the current `ai`, `cat` and\n`platform` tags)."}},"additionalProperties":false},"Published":{"type":"object","description":"A published release and the report it passed.","required":["release","report"],"properties":{"release":{"$ref":"#/components/schemas/Release","description":"The release, now `published`."},"report":{"$ref":"#/components/schemas/Report","description":"The gates it passed."}}},"Rate":{"type":"object","description":"A rate compared with the site's recent releases.","required":["key","label","unit","lower_is_better"],"properties":{"better_than":{"type":["number","null"],"format":"double","description":"Share of those releases this one does better than, 0 to 1 (for a\nrate where lower is better, such as skips, \"better\" means lower)."},"key":{"type":"string","description":"Stable key, e.g. `open_rate`."},"label":{"type":"string","description":"Label."},"lower_is_better":{"type":"boolean","description":"Lower is better (skip rate)."},"site_median":{"type":["number","null"],"format":"double","description":"Median over the site's recent releases."},"unit":{"$ref":"#/components/schemas/Unit","description":"Unit (`ms` or `ratio`)."},"value":{"type":["number","null"],"format":"double","description":"The release's value, once it has been seen."}}},"Reach":{"type":"object","description":"How far into a gallery viewers got.","required":["screenshot","viewers","share"],"properties":{"screenshot":{"type":"integer","format":"int64","description":"Screenshot number, from 1 (the hero)."},"share":{"type":"number","format":"double","description":"Share of the hero's viewers, 0 to 1."},"viewers":{"type":"integer","format":"int64","description":"Viewers who reached it."}}},"Release":{"type":"object","description":"A release, imported from GitHub and prepared here before publishing.","required":["tag","version","kind","changelog","status","eligible","url","models","media"],"properties":{"changelog":{"type":"string","description":"Changelog (markdown; rendered sanitized on the site)."},"eligible":{"type":"boolean","description":"Will be ranked."},"forge_published_at":{"type":["string","null"],"format":"date-time","description":"When it was published on GitHub (RFC 3339)."},"ineligible_reason":{"type":["string","null"],"description":"Why it won't be ranked, if not eligible: the code of the gate it\nfailed, or `not_decided` for a draft (decided when it's published;\n`POST …/check` shows the outcome now)."},"kind":{"type":"string","description":"`initial`, `major`, `minor`, `patch` or `other` (only major and\nminor releases are ranked)."},"media":{"type":"array","items":{"$ref":"#/components/schemas/Media"},"description":"Its media: hero first, then the carousel."},"models":{"type":"array","items":{"$ref":"#/components/schemas/Model"},"description":"LLMs reported as used to build it."},"posted_at":{"type":["string","null"],"format":"date-time","description":"When it was published here (RFC 3339)."},"status":{"type":"string","description":"`draft` (the newest, preparable), `published` or `history`."},"tag":{"type":"string","description":"Git tag, e.g. `v1.2.0`."},"title":{"type":["string","null"],"description":"Optional title."},"url":{"type":"string","description":"The release page on the site."},"version":{"type":"string","description":"Version without the prefix, e.g. `1.2.0`."}}},"ReleaseList":{"type":"object","description":"A project's releases.","required":["import_status","releases"],"properties":{"import_status":{"type":"string","description":"The project's GitHub import: releases appear once it's `done`."},"next_cursor":{"type":["string","null"],"description":"Pass it as `?cursor=` for the next page; `null` on the last one."},"releases":{"type":"array","items":{"$ref":"#/components/schemas/Release"},"description":"Newest first, one page of them."}}},"ReleaseStats":{"type":"object","description":"One release's numbers.","required":["tag","version","url","posted_at","posted_ago","impressions","viewers","opens","repo_clicks","shares","votes","weighted_votes","rates","views_to_compare","lifetime_votes","lifetime_weighted_votes","score","followers_after","saves_after","launch","gallery","screenshots","checks"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/CheckLine"},"description":"Hero checks."},"feed":{"oneOf":[{"$ref":"#/components/schemas/FeedPlace","description":"Place in the live hot feed."},{"type":"null"}]},"followers_after":{"type":"integer","format":"int64","description":"Followers gained in the 7 days after posting."},"gallery":{"type":"array","items":{"$ref":"#/components/schemas/Reach"},"description":"Gallery reach (releases with several screenshots)."},"impressions":{"type":"integer","format":"int64","description":"Times seen in the period."},"launch":{"type":"array","items":{"$ref":"#/components/schemas/Hour"},"description":"First 48 hours, hourly."},"lifetime_votes":{"type":"integer","format":"int64","description":"Lifetime upvotes and weighted upvotes."},"lifetime_weighted_votes":{"type":"number","format":"double","description":"Lifetime weighted upvotes."},"opens":{"type":"integer","format":"int64","description":"Release page opens in the period."},"posted_ago":{"type":"string","description":"Posted, in words (\"3d ago\")."},"posted_at":{"type":"string","format":"date-time","description":"Posted, RFC 3339."},"rates":{"type":"array","items":{"$ref":"#/components/schemas/Rate"},"description":"Lifetime rates against the site."},"repo_clicks":{"type":"integer","format":"int64","description":"Repository clicks in the period."},"saves_after":{"type":"integer","format":"int64","description":"Saves gained in the 7 days after posting."},"score":{"type":"number","format":"double","description":"Vote score (an upvote rate)."},"score_24h":{"type":["number","null"],"format":"double","description":"Score frozen 24 h after posting (decides the day board)."},"screenshots":{"type":"integer","format":"int64","description":"Screenshots, hero included."},"shares":{"type":"integer","format":"int64","description":"Shares in the period."},"tag":{"type":"string","description":"Git tag."},"url":{"type":"string","description":"Release page path."},"version":{"type":"string","description":"Version."},"viewers":{"type":"integer","format":"int64","description":"Viewers in the period."},"views_to_compare":{"type":"integer","format":"int64","description":"Impressions it still needs before rates are compared (0 = compared)."},"votes":{"type":"integer","format":"int64","description":"Upvotes in the period."},"weighted_votes":{"type":"number","format":"double","description":"Weighted upvotes in the period."}}},"ReleaseUpdate":{"type":"object","description":"Change a release (the draft, or a published one within 24 hours);\nomitted fields stay as they are.","properties":{"changelog":{"type":["string","null"],"description":"New changelog (markdown)."},"models":{"type":["array","null"],"items":{"$ref":"#/components/schemas/Model"},"description":"LLMs used (optional; `[]` clears)."},"title":{"type":["string","null"],"description":"New title; `null` clears it."}},"additionalProperties":false},"Report":{"type":"object","description":"The `check` / `publish` report: every gate and whether the release can\nbe published and ranked.","required":["tag","publishable","eligible","gates"],"properties":{"eligible":{"type":"boolean","description":"Will be ranked once published."},"gates":{"type":"array","items":{"$ref":"#/components/schemas/Gate"},"description":"Every gate, in a fixed order."},"publishable":{"type":"boolean","description":"Can be published now."},"tag":{"type":"string","description":"Release tag."}}},"ScorePart":{"type":"object","description":"One part of the hot-feed score.","required":["key","label","value","words"],"properties":{"key":{"type":"string","description":"`votes`, `engagement`, `velocity` or `decay`."},"label":{"type":"string","description":"Label."},"value":{"type":"number","format":"double","description":"The raw part (standard deviations, or the decay factor)."},"words":{"type":"string","description":"In words."}}},"Source":{"type":"object","description":"Where the views came from.","required":["surface","label","impressions","opens","share"],"properties":{"impressions":{"type":"integer","format":"int64","description":"Times seen there."},"label":{"type":"string","description":"Label."},"opens":{"type":"integer","format":"int64","description":"Release opens from there."},"share":{"type":"number","format":"double","description":"Share of all impressions, 0 to 1."},"surface":{"type":"string","description":"Surface key (`home`, `tag`, …)."}}},"SyncStarted":{"type":"object","description":"A re-import was queued.","required":["slug","import_status","next"],"properties":{"import_status":{"type":"string","description":"`pending` or `running`."},"next":{"type":"string","description":"What to poll next."},"slug":{"type":"string","description":"Project slug."}}},"Tag":{"type":"object","description":"A tag.","required":["tag","kind","name","settable"],"properties":{"kind":{"type":"string","description":"Its kind."},"name":{"type":"string","description":"Display name."},"settable":{"type":"boolean","description":"You may set it in `tags` (`false`: detected, read-only)."},"tag":{"type":"string","description":"`kind/slug`, as used in a project's `tags`, e.g. `cat/cli`."}}},"TagKind":{"type":"object","description":"A tag kind.","required":["kind","set_by"],"properties":{"kind":{"type":"string","description":"`ai`, `cat`, `platform`, `lang` or `license`."},"set_by":{"type":"string","description":"Who sets it, e.g. \"you, up to 3\" or \"detected from the repository\"."}}},"Tags":{"type":"object","description":"Tag kinds and the tags in use.","required":["kinds","tags"],"properties":{"kinds":{"type":"array","items":{"$ref":"#/components/schemas/TagKind"},"description":"Every kind, with who sets it."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/Tag"},"description":"Tags you can choose, then tags detected from repositories."}}},"Unit":{"type":"string","description":"What a number measures, for formatting.","enum":["count","weighted","ms","ratio"]},"UploadInstructions":{"type":"object","description":"Where and how to upload the file of a presigned upload.","required":["url","method","headers"],"properties":{"expires_at":{"type":["string","null"],"format":"date-time","description":"When the URL stops working (RFC 3339)."},"headers":{"type":"object","description":"Headers to send with the bytes.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"method":{"type":"string","description":"Always `PUT`."},"url":{"type":"string","description":"Presigned URL, valid for an hour."}}},"Votes":{"type":"object","description":"Upvotes, explained.","required":["count","weighted","bands","referrers"],"properties":{"bands":{"type":"array","items":{"$ref":"#/components/schemas/Group"},"description":"By voter weight band: `none`, `partial`, `full`, `extra`."},"count":{"type":"integer","format":"int64","description":"Upvotes in the period."},"referrers":{"type":"array","items":{"$ref":"#/components/schemas/Group"},"description":"Sites voters came from (external only)."},"weighted":{"type":"number","format":"double","description":"Weighted."}}},"Won":{"type":"object","description":"A place won.","required":["board","rank","period","url"],"properties":{"board":{"type":"string","description":"`day`, `week` or `month`."},"period":{"type":"string","description":"The period, e.g. \"October 2026\"."},"rank":{"type":"integer","format":"int64","description":"Place, from 1."},"url":{"type":"string","description":"The period's page."}}}},"securitySchemes":{"token":{"type":"http","scheme":"bearer","description":"A personal API token (`rsz_…`) from /settings/tokens or a device sign-in (`POST /auth/device`), with the `read` and/or `submit` scope."}}},"tags":[{"name":"account","description":"Your token, and getting one by device sign-in"},{"name":"reference","description":"Tags and the rules in force"},{"name":"projects","description":"Projects, imported from GitHub"},{"name":"releases","description":"Prepare, check and publish releases"},{"name":"media","description":"Screenshots: URL import or presigned upload"},{"name":"feedback","description":"Ideas, bug reports and questions for the operators"}]}