{"openapi":"3.1.0","info":{"title":"apicraft API","summary":"GitHub release API on your own GitHub token: version checks, downloads, changelogs and a tracked-repository list.","description":"Check whether a version is outdated against the newest GitHub release of any repository your token can read. Built for the storytold Craft applications behind ArtCraft, but it works for every public repo.\n\n**How it works:** create a free account at `/login/`, save your own GitHub token on the account page, then call the API with your personal key (`ac_...`) in `Authorization: Bearer`. Every request runs on *your* GitHub token and quota; the server never spends its own.\n\n**Authorize:** press *Authorize* and paste your `ac_` key. Responses carry `X-RateLimit-*` and `X-RateLimit-Policy` headers, an `X-Request-ID` and (on JSON GETs) an `ETag`. Every error has the same JSON shape with a stable `error` code, a `hint` and sometimes an `action`. Create one named *automation key* per script on the dashboard (read-only or full). Live service state is at `/status/`.","version":"3.1.0"},"paths":{"/auth/options":{"get":{"tags":["Authentication & Accounts"],"summary":"Sign-in Options","description":"Public. Tells the login page whether emailed codes are on, and where the Buy me a coffee pop-up points.","operationId":"options_auth_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOptions"}}}}}}},"/auth/access":{"post":{"tags":["Authentication & Accounts"],"summary":"Log In or Create Account","description":"One call for both. If the email has an account, the password is checked and you are logged in; if not, an account is created with that password and you are logged in. The password is checked before anything is emailed. One mailbox, one account: `+tags`, upper case and (for Gmail) dots do not make a new address.\n\n**With email codes on**, the first call (no `code`) checks the password and mails a 6-digit code (`code_sent: true`); repeat the call with `code` to finish. Calling again without `code` after the cooldown sends a fresh one. Codes expire after 10 minutes, work once and allow 5 attempts.","operationId":"access_auth_access_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password/forgot":{"post":{"tags":["Authentication & Accounts"],"summary":"Forgot Password: Send a Code","description":"Emails a 6-digit code to reset the password. The answer is identical whether or not the address has an account. Answers 503 while email codes are switched off.","operationId":"password_forgot_auth_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password/reset":{"post":{"tags":["Authentication & Accounts"],"summary":"Forgot Password: Set a New One","description":"Checks the emailed code, sets the new password, signs out every other session and logs you in. Answers 503 while email codes are switched off.","operationId":"password_reset_auth_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["Authentication & Accounts"],"summary":"Get User Profile & Active API Key","description":"Returns the signed-in user's email, API key, limits, whether a GitHub token is saved, and 7-day usage telemetry.","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}}}}},"/auth/github-token":{"get":{"tags":["Authentication & Accounts"],"summary":"Check Your Saved GitHub Token","description":"Tells you whether you saved a GitHub token, whether GitHub still accepts it and how many requests per hour it has left. The token itself is never returned.","operationId":"github_token_status_auth_github_token_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitHubTokenStatus"}}}}}},"put":{"tags":["Authentication & Accounts"],"summary":"Save Your GitHub Token","description":"GitHub is asked first and the token is refused unless it works. It is then stored AES-256-GCM encrypted and every API call you make runs on it, under your own 5,000 requests per hour. Fine-grained tokens with no permissions are enough for public repositories.","operationId":"github_token_save_auth_github_token_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitHubTokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitHubTokenStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication & Accounts"],"summary":"Remove Your GitHub Token","description":"Deletes the saved token. API calls that need GitHub stop working until you save a new one.","operationId":"github_token_delete_auth_github_token_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}}}}},"/auth/key/regenerate":{"post":{"tags":["Authentication & Accounts"],"summary":"Regenerate Custom Animal API Key","description":"Immediately revokes the previous API key and issues a new dual-animal API key with an embedded CRC32 checksum.","operationId":"regenerate_auth_key_regenerate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRegenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/keys":{"get":{"tags":["Authentication & Accounts"],"summary":"List Your Automation Keys","description":"Browser session only. Extra API keys for scripts and CI, each with its own name and access (read-only or full). Only the start of each key is shown; the key itself is shown once, when it is created. All keys share your account's rate limits and your GitHub token.","operationId":"keys_list_auth_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyList"}}}}}},"post":{"tags":["Authentication & Accounts"],"summary":"Create an Automation Key","description":"Browser session only. Creates a named key. `read` can call every GET endpoint and the batch check; `full` can also add, change and remove tracked repositories. The key is returned once and cannot be shown again. Delete it any time to revoke it.","operationId":"keys_create_auth_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/keys/{key_id}":{"put":{"tags":["Authentication & Accounts"],"summary":"Change an Automation Key","description":"Browser session only. Rename a key, change its access, set or remove its expiry and its daily cap. The secret does not change; use rotate for that.","operationId":"keys_update_auth_keys__key_id__put","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication & Accounts"],"summary":"Delete an Automation Key","description":"Browser session only. The key stops working within a few seconds.","operationId":"keys_delete_auth_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/keys/{key_id}/rotate":{"post":{"tags":["Authentication & Accounts"],"summary":"Rotate an Automation Key","description":"Browser session only. Issues a new secret for the same key (name, access, expiry and daily cap stay) and the old secret stops working at once. Shown once.","operationId":"keys_rotate_auth_keys__key_id__rotate_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["Authentication & Accounts"],"summary":"Sign Out & Clear Session","description":"Destroys the active server-side session and instructs the browser to delete the session cookie.","operationId":"logout_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password/change":{"post":{"tags":["Authentication & Accounts"],"summary":"Change Password","description":"Browser session only. Needs the current password. Every session is signed out and this browser gets a fresh one. Your API key does not change.","operationId":"password_change_auth_password_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/email/change":{"post":{"tags":["Authentication & Accounts"],"summary":"Change Email","description":"Browser session only. Needs your password. One mailbox, one account: an address that belongs to another account is refused. While email codes are on, the first call mails a code to the NEW address and you repeat the call with `code` to finish. Other sessions are signed out; this browser gets a fresh one. Your API key does not change.","operationId":"email_change_auth_email_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/sessions/revoke-all":{"post":{"tags":["Authentication & Accounts"],"summary":"Sign Out Everywhere","description":"Browser session only. Ends every session on every device, including this one. Your API key keeps working.","operationId":"sessions_revoke_all_auth_sessions_revoke_all_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/craft/status":{"get":{"tags":["Craft Watch"],"summary":"Craft Modules and Collector Status","description":"Which of the three modules (Craft Watch, Contributors, CraftSuite tracker) are on, whether they can run, when they last ran and how much data they hold. The owner of the server switches them on the Admin page. Includes the credits.","operationId":"status_ep_api_v1_craft_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CraftStatus"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/apps":{"get":{"tags":["Craft Watch"],"summary":"Every Watched Craft App","description":"One entry per app: latest release, the update verdict (green, yellow, red, grey), activity numbers (the *alive* meter), advisories, OpenSSF Scorecard and, when the CraftSuite module is on, the readiness percentage. Served from the collector's data, so it costs no GitHub request.","operationId":"apps_ep_api_v1_craft_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/apps/{slug}":{"get":{"tags":["Craft Watch"],"summary":"One Craft App in Detail","description":"Verdict with its evidence, the four stat cards, recent merged pull requests, releases, published advisories, open problems and most wanted features (by thumbs-up), the 30-day history and the report spike check for the newest release.","operationId":"app_detail_ep_api_v1_craft_apps__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/apps/{slug}/version":{"get":{"tags":["Craft Watch"],"summary":"What Do We See for My Version?","description":"Pick a release tag (see `releases` in the answer or `GET /apps/{slug}`) and get what the public records show for it: newer releases that mention hardening or name an advisory, open advisories, changes merged but not yet released. It never says safe or unsafe.","operationId":"version_ep_api_v1_craft_apps__slug__version_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Release tag, for example photocraft-v0.16.0. Default: the newest","title":"Tag"},"description":"Release tag, for example photocraft-v0.16.0. Default: the newest"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionVerdict"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/compare":{"get":{"tags":["Craft Watch"],"summary":"Compare the Craft Apps","description":"All apps side by side with the same measures, sorted by one of them, and which app leads each measure.","operationId":"compare_ep_api_v1_craft_compare_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(busiest|alive|fastest_fix|most_stable|most_ready|newest_release|stars)$","description":"busiest (commits), alive (merges this week), fastest_fix (days from advisory to fix), most_stable (fewest crash-like reports), most_ready (CraftSuite), newest_release, stars","default":"busiest","title":"Sort"},"description":"busiest (commits), alive (merges this week), fastest_fix (days from advisory to fix), most_stable (fewest crash-like reports), most_ready (CraftSuite), newest_release, stars"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__craft__routes__CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/events":{"get":{"tags":["Craft Watch"],"summary":"Events: Releases, Advisories and Merged Changes","description":"A newest-first feed across all apps, for automations that react to new releases or published advisories. Poll with `since` set to the time of the newest event you already handled (and `If-None-Match` for a body-less 304). `security_change` is a merged change whose title or labels mention hardening or an advisory.","operationId":"events_ep_api_v1_craft_events_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Look back this many days (ignored when `since` is given)","default":7,"title":"Days"},"description":"Look back this many days (ignored when `since` is given)"},{"name":"types","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"description":"Comma list of release, advisory, security_change, merged","title":"Types"},"description":"Comma list of release, advisory, security_change, merged"},{"name":"app","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$"},{"type":"null"}],"description":"Only this app (slug)","title":"App"},"description":"Only this app (slug)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"description":"ISO time; only newer events","title":"Since"},"description":"ISO time; only newer events"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/contributors":{"get":{"tags":["Craft Watch"],"summary":"Contributors Leaderboard","description":"Everyone who merged or committed in the Craft repositories, ranked. Public facts only (login, counts, times); bots are left out. While the first full sync runs, `syncing_repos` is above 0 and the numbers still grow.","operationId":"contributors_ep_api_v1_craft_contributors_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(merged|commits|opened|recent|merge_rate|name|reverted|repos|median_merge)$","default":"merged","title":"Sort"}},{"name":"repo","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$"},{"type":"null"}],"description":"Only pull requests and commits in this repository","title":"Repo"},"description":"Only pull requests and commits in this repository"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":90,"minimum":1},{"type":"null"}],"description":"Only pull requests merged in the last N days","title":"Days"},"description":"Only pull requests merged in the last N days"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"description":"Part of a login","title":"Q"},"description":"Part of a login"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/contributors/{login}":{"get":{"tags":["Craft Watch"],"summary":"One Contributor","description":"Rank, counts, their pull requests (newest 300, up to 1,000 with `prs`) and commits per repository.","operationId":"contributor_ep_api_v1_craft_contributors__login__get","parameters":[{"name":"login","in":"path","required":true,"schema":{"type":"string","title":"Login"}},{"name":"prs","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"How many of the person's newest pull requests to list","default":300,"title":"Prs"},"description":"How many of the person's newest pull requests to list"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/stats":{"get":{"tags":["Craft Watch"],"summary":"Organisation Statistics and Chart Data","description":"Totals, merged and opened per day for 90 days, weekly contributor growth, when pull requests get merged (weekday and hour, UTC), time to merge, per-repository numbers with SonarCloud quality, and the latest merges.","operationId":"stats_ep_api_v1_craft_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgStats"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/tracker":{"get":{"tags":["Craft Watch"],"summary":"Replacement Tracker (CraftSuite, optional)","description":"How close each Crafting App is to replacing the original, as each project estimates it in its own ROADMAP.md, with the weekly history. Data collected by CraftSuite under CC BY 4.0: **credit CraftSuite (craftsuite.net) with a link** when you show it. Answers `module_disabled` unless the owner switched this module on.","operationId":"tracker_ep_api_v1_craft_tracker_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackerResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/craft/credits":{"get":{"tags":["Craft Watch"],"summary":"Credits","description":"Who made the ideas and data behind the Craft modules: Craft Watch by Overprivileged, ArtCraft Contributors, and the CraftSuite tracker (CC BY 4.0).","operationId":"credits_ep_api_v1_craft_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Credits Ep Api V1 Craft Credits Get"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/badge/craft/{slug}.svg":{"get":{"tags":["Badges"],"summary":"Verdict Badge for a Craft App","description":"An SVG badge with the newest version and the update verdict (looks calm, wait a day, update now). Served from the collector's data, no key and no GitHub request. `![photocraft](https://your-host/api/v1/badge/craft/photocraft.svg)`","operationId":"verdict_badge_api_v1_badge_craft__slug__svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/svg+xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets":{"get":{"tags":["Insights"],"summary":"Find the Download for an OS and CPU","description":"Lists the files attached to the newest release, each tagged with the OS and CPU it is for. Pass `os` (and optionally `arch`) to get a `best` match: an exact CPU match first, then a universal build.","operationId":"release_assets_api_v1_assets_get","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"os","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(macos|windows|linux|freebsd|wasm)$"},{"type":"null"}],"description":"Operating system","title":"Os"},"description":"Operating system"},{"name":"arch","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(x86_64|aarch64|arm64|riscv64|x86|universal)$"},{"type":"null"}],"description":"CPU architecture (arm64 means aarch64)","title":"Arch"},"description":"CPU architecture (arm64 means aarch64)"},{"name":"include_prereleases","in":"query","required":false,"schema":{"type":"boolean","description":"Consider pre-releases","default":false,"title":"Include Prereleases"},"description":"Consider pre-releases"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/changelog":{"get":{"tags":["Insights"],"summary":"Release Notes Since Your Version","description":"Collects the notes of every release newer than `current`, so a jump from 18.2.0 to 19.0.0 does not hide what 18.3 and 18.4 changed. `breaking_changes` is true when any of the notes mention breaking changes, migrations or deprecations.","operationId":"changelog_api_v1_changelog_get","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"current","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Version you run","examples":["0.1.0"],"title":"Current"},"description":"Version you run"},{"name":"include_prereleases","in":"query","required":false,"schema":{"type":"boolean","description":"Consider pre-releases","default":false,"title":"Include Prereleases"},"description":"Consider pre-releases"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Most releases to include","default":20,"title":"Limit"},"description":"Most releases to include"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangelogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/repos/{owner}/{repo}/overview":{"get":{"tags":["Insights"],"summary":"Repository Overview","description":"Stars, forks, open issues, language, licence, last push and the newest release in one call.","operationId":"overview_api_v1_repos__owner___repo__overview_get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/repos/{owner}/{repo}/pulls":{"get":{"tags":["Insights"],"summary":"Pull Requests","description":"Recently updated pull requests, so you can see what is in progress before it ships.","operationId":"pulls_api_v1_repos__owner___repo__pulls_get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|closed|all)$","default":"open","title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/repos/{owner}/{repo}/issues":{"get":{"tags":["Insights"],"summary":"Issues","description":"Recently updated issues. GitHub mixes pull requests into its issue list; they are filtered out here.","operationId":"issues_api_v1_repos__owner___repo__issues_get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|closed|all)$","default":"open","title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/repos/{owner}/{repo}/compare":{"get":{"tags":["Insights"],"summary":"Unreleased Changes","description":"Compares two refs. By default it compares the latest release tag with the default branch, so `ahead_by` is the number of commits merged since the last release.","operationId":"compare_api_v1_repos__owner___repo__compare_get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"base","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}],"description":"Tag, branch or commit. Default: latest release tag","title":"Base"},"description":"Tag, branch or commit. Default: latest release tag"},{"name":"head","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}],"description":"Tag, branch or commit. Default: the default branch","title":"Head"},"description":"Tag, branch or commit. Default: the default branch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/badge/{owner}/{repo}.svg":{"get":{"tags":["Badges"],"summary":"Live Version Badge","description":"An SVG badge for READMEs: `![release](https://your-host/api/v1/badge/storytold/artcraft.svg)`. It is served from the showcase cache, so it costs no GitHub request, and it only knows the repositories shown on the homepage. Add `current` to show whether that version is up to date.","operationId":"badge_api_v1_badge__owner___repo__svg_get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"},{"name":"current","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Your version","title":"Current"},"description":"Your version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/svg+xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/watchlist":{"get":{"tags":["Watchlist"],"summary":"Your Tracked Repositories With Current Status","description":"The repositories you track, each checked against its newest release on your own GitHub token. Works for private repositories your token can read. Filter with `group` and `only` (`outdated`, `current` or `error`).","operationId":"watchlist_api_v1_watchlist_get","parameters":[{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9 _.-]*$"},{"type":"null"}],"description":"Only this group","title":"Group"},"description":"Only this group"},{"name":"only","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(outdated|current|error)$"},{"type":"null"}],"description":"Only outdated, up to date or failing repositories","title":"Only"},"description":"Only outdated, up to date or failing repositories"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]},"post":{"tags":["Watchlist"],"summary":"Track or Update a Repository","description":"Tracks a repository together with the version you run. Posting it again updates version, label and group. Per-account cap: 50 (owner 200). A repository your token cannot see is refused. Needs a `full` key or the website.","operationId":"watchlist_add_api_v1_watchlist_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]},"put":{"tags":["Watchlist"],"summary":"Track Many Repositories at Once","description":"Adds or updates up to 200 repositories in one call. With `replace: true` every tracked repository that is not in `items` is removed, so a file in your repository can be the single source of truth. Repositories that fail the GitHub check are listed in `rejected` and the rest is stored. A call costs one request per 5 repositories. Needs a `full` key or the website.","operationId":"watchlist_bulk_api_v1_watchlist_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchBulk"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/summary":{"get":{"tags":["Watchlist"],"summary":"One-Look Summary for Scripts and CI","description":"Counts instead of a list: how many tracked repositories are up to date, outdated or failing, per group, plus the outdated ones. `all_current` is true when nothing needs attention, so a pipeline can gate on a single field.","operationId":"watchlist_summary_api_v1_watchlist_summary_get","parameters":[{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9 _.-]*$"},{"type":"null"}],"description":"Only this group","title":"Group"},"description":"Only this group"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/tracks":{"get":{"tags":["Watchlist"],"summary":"Custom Tracks & Environment Breakdown","description":"Aggregates tracked repositories by custom track / environment (prod, staging, tools, etc.), providing update counts, health status, and repository lists for automated pipeline gating.","operationId":"watchlist_tracks_api_v1_watchlist_tracks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackListResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/track/{track_name}/acknowledge":{"post":{"tags":["Watchlist"],"summary":"Mark All Repositories in a Track as Updated","description":"Sets current version = latest for all outdated repositories in the specified track/group. Ideal for CI/CD post-deployment hooks to mark an entire environment current in one request.","operationId":"watchlist_track_acknowledge_api_v1_watchlist_track__track_name__acknowledge_post","parameters":[{"name":"track_name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":50,"title":"Track Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackAcknowledgeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/check":{"get":{"tags":["Watchlist"],"summary":"CI/CD Exit-Code Automation Poller","description":"Designed for CI/CD gates and health check scripts. Returns `exit_code: 0` if all tracked repositories in the given track/group are up to date, or `exit_code: 1` if updates are available or errors occurred, along with the list of outdated repositories.","operationId":"watchlist_check_api_v1_watchlist_check_get","parameters":[{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9 _.-]*$"},{"type":"null"}],"description":"Only this group","title":"Group"},"description":"Only this group"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/export":{"get":{"tags":["Watchlist"],"summary":"Multi-Format Export for Automations","description":"Exports your tracked repositories in multiple formats: `json`, `csv`, `yaml`, `markdown`, or `matrix` (GitHub Actions workflow strategy matrix).","operationId":"watchlist_export_api_v1_watchlist_export_get","parameters":[{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9 _.-]*$"},{"type":"null"}],"description":"Only this group","title":"Group"},"description":"Only this group"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv|yaml|markdown|matrix)$","description":"Export format","default":"json","title":"Format"},"description":"Export format"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/{owner}/{repo}/acknowledge":{"post":{"tags":["Watchlist"],"summary":"Mark a Repository as Updated","description":"Sets the version you run to the newest release, for the moment after a deployment. Needs a `full` key or the website.","operationId":"watchlist_acknowledge_api_v1_watchlist__owner___repo__acknowledge_post","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/watchlist/{owner}/{repo}":{"delete":{"tags":["Watchlist"],"summary":"Stop Tracking a Repository","description":"Needs a `full` key or the website.","operationId":"watchlist_remove_api_v1_watchlist__owner___repo__delete","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub owner or organisation","examples":["storytold"],"title":"Owner"},"description":"GitHub owner or organisation"},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"Repository name","examples":["artcraft"],"title":"Repo"},"description":"Repository name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/rate_limit":{"get":{"tags":["Automation"],"summary":"Real-Time Rate Limit Quota Status","description":"Returns live GitHub API rate limit metrics (5,000 req/hr authenticated or 60 req/hr anonymous), Apicraft account tier limits, and secondary rate limit avoidance guidance per GitHub best practices.","operationId":"rate_limit_status_api_v1_rate_limit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitStatusResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/tokens/guidance":{"get":{"tags":["Automation"],"summary":"Token Specifications & Best Practices","description":"Returns verified guidance based on GitHub official documentation on Personal Access Tokens, least-privilege fine-grained permissions, token revocation triggers, and rate limit architectures.","operationId":"tokens_guidance_api_v1_tokens_guidance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokensGuidanceResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/public/showcase":{"get":{"tags":["System & Status"],"summary":"Homepage Showcase Versions","description":"The newest version of each repository shown on the homepage. Refreshed in the background every 30 minutes and served from memory, so it needs no key and costs no GitHub request.","operationId":"showcase_versions_public_showcase_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseResponse"}}}}}}},"/public/status":{"get":{"tags":["System & Status"],"summary":"System Status With 90-Day Uptime","description":"Live state of the website, API, account database, sign-in, GitHub connection and homepage data, one uptime bar per day, and recent incidents. This is what the /status/ page shows. No key needed.","operationId":"status_payload_public_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Status Payload Public Status Get"}}}}}}},"/health":{"get":{"tags":["System & Status"],"summary":"Health Probe","description":"Liveness probe for load balancers and uptime monitors. Not rate limited, no key needed. For the full picture see `/public/status`.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/usage":{"get":{"tags":["Usage & Rate Limits"],"summary":"Your Rate Limit & Usage","description":"Your limits, the remaining quota in the tightest window, the reset countdown and your 7-day request history.","operationId":"usage_api_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/usage/history":{"get":{"tags":["Usage & Rate Limits"],"summary":"Your Full Request History","description":"Every API call your account made is stored (time, endpoint, query, status, duration) for 90 days; the daily totals are kept for good. Returns totals, a bar per day, your most called endpoints, status code counts and the newest calls. `via=apikey` shows only calls made with your key, `via=session` only what the website did for you. `format=csv` downloads the raw rows of the window (up to 100,000) instead. Reading the history is not itself logged.","operationId":"usage_history_api_v1_usage_history_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Window in days (the dashboard offers 7, 30 and 90)","default":30,"title":"Days"},"description":"Window in days (the dashboard offers 7, 30 and 90)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"How many of the newest calls to list","default":50,"title":"Limit"},"description":"How many of the newest calls to list"},{"name":"via","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|apikey|session)$","description":"Filter by how the call was authenticated","default":"all","title":"Via"},"description":"Filter by how the call was authenticated"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"json (default) or csv for the raw rows","default":"json","title":"Format"},"description":"json (default) or csv for the raw rows"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/check":{"get":{"tags":["Releases"],"summary":"Check Single Repository for Newer Releases","description":"Compares the provided `current` version against the latest release on GitHub, reporting `is_outdated` and the direct release URL. Runs on your saved GitHub token.","operationId":"check_single_release_api_v1_check_get","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub repository owner or organization","examples":["storytold"],"title":"Owner"},"description":"GitHub repository owner or organization"},{"name":"repo","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub repository name","examples":["artcraft"],"title":"Repo"},"description":"GitHub repository name"},{"name":"current","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Your current version string (e.g. 0.1.0 or v0.1.0)","examples":["0.1.0"],"title":"Current"},"description":"Your current version string (e.g. 0.1.0 or v0.1.0)"},{"name":"include_prereleases","in":"query","required":false,"schema":{"type":"boolean","description":"Consider alpha/beta/rc tags if true","default":false,"title":"Include Prereleases"},"description":"Consider alpha/beta/rc tags if true"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]},"post":{"tags":["Releases"],"summary":"Batch Check Multiple Repositories","description":"Performs concurrent checks for up to 25 repositories in a single request. Failing repositories return an error field without crashing the batch.","operationId":"check_batch_releases_api_v1_check_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/latest":{"get":{"tags":["Releases"],"summary":"Get Latest Release Information","description":"Fetches the newest release tag name, publication date, and GitHub release URL without version comparison.","operationId":"get_latest_release_api_v1_latest_get","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub repository owner","examples":["storytold"],"title":"Owner"},"description":"GitHub repository owner"},{"name":"repo","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_.-]+$","description":"GitHub repository name","examples":["artcraft"],"title":"Repo"},"description":"GitHub repository name"},{"name":"include_prereleases","in":"query","required":false,"schema":{"type":"boolean","description":"Include pre-releases if true","default":false,"title":"Include Prereleases"},"description":"Include pre-releases if true"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestReleaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}},"/api/v1/repos":{"get":{"tags":["Repositories & Icons"],"summary":"List All Craft Apps, Repositories and Icons","description":"Returns the catalog of storytold repositories shown on the homepage, with icon paths and the software each one replaces.","operationId":"list_repositories_api_v1_repos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoCatalogResponse"}}}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}]}}},"components":{"schemas":{"AccessBody":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","description":"One account per mailbox.","examples":["you@example.com"]},"password":{"type":"string","maxLength":128,"title":"Password","description":"At least 10 characters.","examples":["correct-horse-battery"]},"code":{"anyOf":[{"type":"string","pattern":"^\\d{3}\\s?\\d{3}$"},{"type":"null"}],"title":"Code","description":"The 6-digit code from your email (only when email codes are on)","examples":["482 913"]},"cf-turnstile-response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Turnstile-Response"}},"type":"object","required":["email","password"],"title":"AccessBody"},"ApiKeyRegenerateResponse":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"Freshly generated animal API key with embedded CRC32 checksum","examples":["ac_panda-lynx-940215-b7e289fa3c11d04481ca0f3b"]}},"type":"object","required":["api_key"],"title":"ApiKeyRegenerateResponse"},"AppDetail":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"disclaimer":{"type":"string","title":"Disclaimer","default":"Public GitHub data only. Signals, not a guarantee. Unofficial, not affiliated with ArtCraft or storytold."},"app":{"additionalProperties":true,"type":"object","title":"App"}},"type":"object","required":["updated_at","app"],"title":"AppDetail"},"AppsResponse":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"count":{"type":"integer","title":"Count"},"disclaimer":{"type":"string","title":"Disclaimer","default":"Public GitHub data only. Signals, not a guarantee. Unofficial, not affiliated with ArtCraft or storytold."},"readiness":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Readiness","description":"Present when the CraftSuite module is on: attribution for the `ready` numbers"},"apps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Apps","description":"One entry per watched app: latest release, update verdict, activity numbers, advisories, scorecard and (when on) readiness"}},"type":"object","required":["updated_at","count","apps"],"title":"AppsResponse"},"AssetItem":{"properties":{"name":{"type":"string","title":"Name","description":"File name of the release asset","examples":["artcraft-0.2.0-x86_64.msi"]},"kind":{"type":"string","title":"Kind","description":"Package type guessed from the extension","examples":["msi"]},"os":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os","description":"macos, windows, linux, freebsd or wasm when it can be told from the name","examples":["windows"]},"arch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arch","description":"x86_64, aarch64, riscv64, x86 or universal when it can be told from the name","examples":["x86_64"]},"size":{"type":"integer","title":"Size","description":"Size in bytes","examples":[48211032]},"download_count":{"type":"integer","title":"Download Count","description":"GitHub download counter","examples":[312]},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256","description":"SHA-256 digest reported by GitHub, when available"},"url":{"type":"string","title":"Url","description":"Direct download URL"}},"type":"object","required":["name","kind","size","download_count","url"],"title":"AssetItem"},"AssetsResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"tag":{"type":"string","title":"Tag","description":"Release tag the assets belong to","examples":["v0.2.0"]},"release_url":{"type":"string","title":"Release Url"},"os":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os","description":"Filter that was applied"},"arch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arch","description":"Filter that was applied"},"best":{"anyOf":[{"$ref":"#/components/schemas/AssetItem"},{"type":"null"}],"description":"Best match when os was given: exact architecture first, then universal builds"},"assets":{"items":{"$ref":"#/components/schemas/AssetItem"},"type":"array","title":"Assets"}},"type":"object","required":["owner","repo","tag","release_url","assets"],"title":"AssetsResponse"},"AuthOptions":{"properties":{"email_verification":{"type":"boolean","title":"Email Verification","description":"Whether log in, sign up and password reset ask for an emailed code"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url","description":"The public address of the API when it has its own hostname (https://api.example.com); code examples should use it"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url","description":"The public address of the website when the API has its own hostname"},"code_length":{"type":"integer","title":"Code Length","description":"Digits in an emailed code","default":6},"bmc_url":{"type":"string","title":"Bmc Url","description":"Where the Buy me a coffee pop-up points; empty hides it","default":""},"turnstile_sitekey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turnstile Sitekey","description":"Cloudflare Turnstile sitekey if configured"}},"type":"object","required":["email_verification"],"title":"AuthOptions"},"AuthSessionResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Request status flag","default":true},"email":{"type":"string","title":"Email","description":"Email of the signed-in account","examples":["you@example.com"]},"new_user":{"type":"boolean","title":"New User","description":"True if the account was created by this request","examples":[false]},"code_sent":{"type":"boolean","title":"Code Sent","description":"True when a one-time code was emailed and the same request must be repeated with `code`","default":false},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In","description":"Seconds the emailed code stays valid","examples":[600]},"resend_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resend After","description":"Seconds before another code can be requested","examples":[60]}},"type":"object","required":["email","new_user"],"title":"AuthSessionResponse"},"BatchCheckRequest":{"properties":{"repos":{"items":{"$ref":"#/components/schemas/RepoQueryItem"},"type":"array","maxItems":100,"minItems":1,"title":"Repos","description":"List of repositories and versions to check (at most 25; the owner account 100). Counts as one call per 5 repositories.","examples":[[{"current":"0.8.0","include_prereleases":false,"owner":"storytold","repo":"wordcraft"},{"current":"0.8.0","include_prereleases":false,"owner":"storytold","repo":"gridcraft"},{"current":"0.8.0","include_prereleases":false,"owner":"storytold","repo":"deckcraft"}]]}},"type":"object","required":["repos"],"title":"BatchCheckRequest"},"BatchCheckResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BatchItemResult"},"type":"array","title":"Results","description":"Results for each repository requested in the batch"},"rate_limit_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Remaining","description":"Remaining GitHub API calls for the backend service"}},"type":"object","required":["results"],"title":"BatchCheckResponse"},"BatchItemResult":{"properties":{"owner":{"type":"string","title":"Owner","description":"Repository owner"},"repo":{"type":"string","title":"Repo","description":"Repository name"},"current":{"type":"string","title":"Current","description":"Your current version"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest","description":"Newest available version"},"is_outdated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Outdated","description":"True if newer version exists"},"release_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Url","description":"Release page URL"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"Publication timestamp"},"prerelease":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Prerelease","description":"Prerelease flag"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url","description":"App icon path"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if this specific repository check failed"}},"type":"object","required":["owner","repo","current"],"title":"BatchItemResult"},"ChangelogEntry":{"properties":{"tag":{"type":"string","title":"Tag"},"name":{"type":"string","title":"Name"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"url":{"type":"string","title":"Url"},"breaking":{"type":"boolean","title":"Breaking","description":"True when the notes mention breaking changes, migrations or deprecations"},"body":{"type":"string","title":"Body"}},"type":"object","required":["tag","name","url","breaking","body"],"title":"ChangelogEntry"},"ChangelogResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"current":{"type":"string","title":"Current"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"},"count":{"type":"integer","title":"Count","description":"Number of releases newer than `current`"},"breaking_changes":{"type":"boolean","title":"Breaking Changes","description":"True if any of those releases looks breaking"},"entries":{"items":{"$ref":"#/components/schemas/ChangelogEntry"},"type":"array","title":"Entries"},"markdown":{"type":"string","title":"Markdown","description":"All notes joined into one Markdown document, newest first"}},"type":"object","required":["owner","repo","current","count","breaking_changes","entries","markdown"],"title":"ChangelogResponse"},"CommitItem":{"properties":{"sha":{"type":"string","title":"Sha"},"message":{"type":"string","title":"Message"},"author":{"type":"string","title":"Author"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"url":{"type":"string","title":"Url"}},"type":"object","required":["sha","message","author","url"],"title":"CommitItem"},"ContributorDetail":{"properties":{"rank":{"type":"integer","title":"Rank"},"of":{"type":"integer","title":"Of"},"contributor":{"additionalProperties":true,"type":"object","title":"Contributor"},"pull_requests":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pull Requests"},"commits_by_repo":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Commits By Repo"}},"type":"object","required":["rank","of","contributor","pull_requests","commits_by_repo"],"title":"ContributorDetail"},"ContributorsResponse":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"syncing_repos":{"type":"integer","title":"Syncing Repos","description":"Repositories whose full history is still being read; numbers grow until this is 0"},"total":{"type":"integer","title":"Total"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"credits":{"type":"string","title":"Credits","default":"Statistics after ArtCraft Contributors (artcraft.apollonet.dev)"}},"type":"object","required":["updated_at","syncing_repos","total","items"],"title":"ContributorsResponse"},"CraftStatus":{"properties":{"modules":{"additionalProperties":true,"type":"object","title":"Modules","description":"watch, contributors and craftsuite: enabled, available, running, last run, data age and item counts"},"github_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Remaining","description":"GitHub requests the server token had left after the last collector call"},"credits":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Credits"},"now":{"type":"string","title":"Now"}},"type":"object","required":["modules","credits","now"],"title":"CraftStatus"},"EmailChangeBody":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","description":"The new address","examples":["new@example.com"]},"password":{"type":"string","maxLength":128,"title":"Password","description":"Your current password"},"code":{"anyOf":[{"type":"string","pattern":"^\\d{3}\\s?\\d{3}$"},{"type":"null"}],"title":"Code","description":"The code emailed to the NEW address (only while email codes are on)","examples":["482 913"]}},"type":"object","required":["email","password"],"title":"EmailChangeBody"},"EventsResponse":{"properties":{"since":{"type":"string","title":"Since"},"count":{"type":"integer","title":"Count"},"events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Events"},"disclaimer":{"type":"string","title":"Disclaimer","default":"Public GitHub data only. Signals, not a guarantee. Unofficial, not affiliated with ArtCraft or storytold."}},"type":"object","required":["since","count","events"],"title":"EventsResponse"},"ForgotBody":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","examples":["you@example.com"]},"cf-turnstile-response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Turnstile-Response"}},"type":"object","required":["email"],"title":"ForgotBody"},"GitHubTokenBody":{"properties":{"token":{"type":"string","maxLength":255,"minLength":20,"title":"Token","description":"Your GitHub token. Public repositories need no permissions.","examples":["github_pat_11AAAA..."]}},"type":"object","required":["token"],"title":"GitHubTokenBody"},"GitHubTokenStatus":{"properties":{"set":{"type":"boolean","title":"Set","description":"True when a GitHub token is saved on the account"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"fine-grained, classic, oauth or app","examples":["fine-grained"]},"added_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Added At","description":"When the token was saved"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid","description":"Whether GitHub still accepts it right now"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Requests per hour GitHub grants this token","examples":[5000]},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"reset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reset At","description":"UTC time when the hourly window resets"},"message":{"type":"string","title":"Message","default":""}},"type":"object","required":["set"],"title":"GitHubTokenStatus"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Overall backend health status","default":"ok","examples":["ok"]},"service":{"type":"string","title":"Service","description":"Service identifier","examples":["apicraft"]},"accounts":{"type":"boolean","title":"Accounts","description":"Whether the account database is active","examples":[true]}},"type":"object","required":["service","accounts"],"title":"HealthResponse"},"HistoryDay":{"properties":{"day":{"type":"string","title":"Day","examples":["2026-10-26"]},"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors","description":"Calls that answered 400 or higher"},"apikey":{"type":"integer","title":"Apikey","description":"Calls made with an API key (the rest came from the website)","default":0}},"type":"object","required":["day","requests","errors"],"title":"HistoryDay"},"HistoryEndpoint":{"properties":{"path":{"type":"string","title":"Path","examples":["/api/v1/check"]},"count":{"type":"integer","title":"Count"},"errors":{"type":"integer","title":"Errors"},"avg_ms":{"type":"integer","title":"Avg Ms","description":"Average duration in milliseconds"},"p95_ms":{"type":"integer","title":"P95 Ms","description":"95 percent of the calls were faster than this","default":0}},"type":"object","required":["path","count","errors","avg_ms"],"title":"HistoryEndpoint"},"HistoryLatency":{"properties":{"avg":{"type":"integer","title":"Avg"},"p50":{"type":"integer","title":"P50"},"p95":{"type":"integer","title":"P95"},"max":{"type":"integer","title":"Max"}},"type":"object","required":["avg","p50","p95","max"],"title":"HistoryLatency"},"HistoryRequest":{"properties":{"time":{"type":"string","title":"Time","description":"UTC time of the call"},"via":{"type":"string","title":"Via","description":"apikey (your key) or session (the website while logged in)","examples":["apikey"]},"key":{"type":"string","title":"Key","description":"Which key made the call: Main key or the name of an automation key (empty for the website)","default":"","examples":["nightly-ci"]},"method":{"type":"string","title":"Method"},"path":{"type":"string","title":"Path"},"query":{"type":"string","title":"Query","description":"The query string of the call (never your key or token)"},"status":{"type":"integer","title":"Status"},"ms":{"type":"integer","title":"Ms"}},"type":"object","required":["time","via","method","path","query","status","ms"],"title":"HistoryRequest"},"HistorySource":{"properties":{"name":{"type":"string","title":"Name","description":"Website, Main key or the name of an automation key","examples":["nightly-ci"]},"via":{"type":"string","title":"Via"},"count":{"type":"integer","title":"Count"},"errors":{"type":"integer","title":"Errors"},"last_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last At"}},"type":"object","required":["name","via","count","errors"],"title":"HistorySource"},"IssueItem":{"properties":{"number":{"type":"integer","title":"Number"},"title":{"type":"string","title":"Title"},"state":{"type":"string","title":"State"},"author":{"type":"string","title":"Author"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels"},"comments":{"type":"integer","title":"Comments"},"created_at":{"type":"string","title":"Created At"},"html_url":{"type":"string","title":"Html Url"}},"type":"object","required":["number","title","state","author","labels","comments","created_at","html_url"],"title":"IssueItem"},"IssueListResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"count":{"type":"integer","title":"Count"},"issues":{"items":{"$ref":"#/components/schemas/IssueItem"},"type":"array","title":"Issues","description":"Real issues only; pull requests are filtered out"}},"type":"object","required":["owner","repo","count","issues"],"title":"IssueListResponse"},"KeyCreate":{"properties":{"name":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[A-Za-z0-9 _.-]+$","title":"Name","description":"What it is for","examples":["nightly-ci"]},"scope":{"type":"string","pattern":"^(read|full|craft)$","title":"Scope","description":"read (default: every GET plus batch check), full (also changes tracked repositories) or craft (only the Craft data under /api/v1/craft/ and your usage)","default":"read"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"The key stops working after this many days (leave out for no expiry)"},"daily_limit":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Daily Limit","description":"At most this many calls per day for this key, within your account limits"}},"type":"object","required":["name"],"title":"KeyCreate"},"KeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scope":{"type":"string","title":"Scope"},"api_key":{"type":"string","title":"Api Key","description":"The new key. It is shown once; only a hash is stored"}},"type":"object","required":["id","name","scope","api_key"],"title":"KeyCreated"},"KeyItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","examples":["nightly-ci"]},"scope":{"type":"string","title":"Scope","description":"read (GET requests and batch checks) or full (also changes your tracked repositories)","examples":["read"]},"prefix":{"type":"string","title":"Prefix","description":"Start of the key, so you can recognise it","examples":["ac_otter-heron"]},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"After this time the key is refused"},"expired":{"type":"boolean","title":"Expired","default":false},"daily_limit":{"type":"integer","title":"Daily Limit","description":"Calls per day this key may make (0 = only the account limits apply)","default":0}},"type":"object","required":["id","name","scope","prefix","created_at"],"title":"KeyItem"},"KeyList":{"properties":{"count":{"type":"integer","title":"Count"},"max_keys":{"type":"integer","title":"Max Keys"},"keys":{"items":{"$ref":"#/components/schemas/KeyItem"},"type":"array","title":"Keys"}},"type":"object","required":["count","max_keys","keys"],"title":"KeyList"},"KeyUpdate":{"properties":{"name":{"type":"string","maxLength":40,"minLength":1,"pattern":"^[A-Za-z0-9 _.-]+$","title":"Name"},"scope":{"type":"string","pattern":"^(read|full|craft)$","title":"Scope"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Expires In Days","description":"0 removes the expiry, N sets it N days from now, leave out to keep it"},"daily_limit":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Daily Limit","description":"0 removes the daily cap"}},"type":"object","required":["name","scope"],"title":"KeyUpdate"},"LatestReleaseResponse":{"properties":{"owner":{"type":"string","title":"Owner","description":"Repository owner","examples":["storytold"]},"repo":{"type":"string","title":"Repo","description":"Repository name","examples":["artcraft"]},"latest":{"type":"string","title":"Latest","description":"Latest release version tag (normalized)","examples":["0.2.0"]},"release_url":{"type":"string","title":"Release Url","description":"URL to the GitHub release page","examples":["https://github.com/storytold/artcraft/releases/tag/v0.2.0"]},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"ISO-8601 publication timestamp","examples":["2026-10-15T12:00:00Z"]},"prerelease":{"type":"boolean","title":"Prerelease","description":"Whether the latest release is marked as a prerelease","examples":[false]},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url","description":"Direct URL or path to the application icon","examples":["/icons/artcraft-logo.png"]},"rate_limit_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Remaining","description":"Remaining GitHub API quota for the backend token","examples":[4985]}},"type":"object","required":["owner","repo","latest","release_url","prerelease"],"title":"LatestReleaseResponse"},"OrgStats":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"syncing_repos":{"type":"integer","title":"Syncing Repos"},"kpis":{"additionalProperties":true,"type":"object","title":"Kpis"},"repos":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Repos"},"days":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Days","description":"The last 90 days: opened, closed without merge, merged (and per repository), active and new contributors"},"weeks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Weeks"},"heat":{"items":{"items":{"type":"integer"},"type":"array"},"type":"array","title":"Heat","description":"Merges by weekday (Monday first) and hour, UTC"},"merge_time":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Merge Time"},"recent_merges":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Merges"},"credits":{"type":"string","title":"Credits","default":"Statistics after ArtCraft Contributors (artcraft.apollonet.dev)"}},"type":"object","required":["updated_at","syncing_repos","kpis","repos","days","weeks","heat","merge_time","recent_merges"],"title":"OrgStats"},"OverviewResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"html_url":{"type":"string","title":"Html Url"},"default_branch":{"type":"string","title":"Default Branch"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"stars":{"type":"integer","title":"Stars"},"forks":{"type":"integer","title":"Forks"},"open_issues":{"type":"integer","title":"Open Issues","description":"Open issues plus open pull requests, as GitHub counts them"},"archived":{"type":"boolean","title":"Archived"},"pushed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pushed At"},"latest_release":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Release"},"latest_release_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Release Url"},"latest_release_published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Release Published At"}},"type":"object","required":["owner","repo","html_url","default_branch","stars","forks","open_issues","archived"],"title":"OverviewResponse"},"PasswordChangeBody":{"properties":{"current":{"type":"string","maxLength":128,"title":"Current","description":"Your current password"},"password":{"type":"string","maxLength":128,"title":"Password","description":"The new password, at least 10 characters"}},"type":"object","required":["current","password"],"title":"PasswordChangeBody"},"PullRequestItem":{"properties":{"number":{"type":"integer","title":"Number"},"title":{"type":"string","title":"Title"},"state":{"type":"string","title":"State"},"author":{"type":"string","title":"Author"},"draft":{"type":"boolean","title":"Draft"},"created_at":{"type":"string","title":"Created At"},"merged_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merged At"},"html_url":{"type":"string","title":"Html Url"}},"type":"object","required":["number","title","state","author","draft","created_at","html_url"],"title":"PullRequestItem"},"PullRequestListResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"count":{"type":"integer","title":"Count"},"pull_requests":{"items":{"$ref":"#/components/schemas/PullRequestItem"},"type":"array","title":"Pull Requests"}},"type":"object","required":["owner","repo","count","pull_requests"],"title":"PullRequestListResponse"},"RateLimitDetail":{"properties":{"limit":{"type":"integer","title":"Limit","description":"Hourly limit bucket"},"remaining":{"type":"integer","title":"Remaining","description":"Remaining requests in this window"},"reset":{"type":"integer","title":"Reset","description":"Epoch timestamp of reset"},"reset_at":{"type":"string","title":"Reset At","description":"ISO timestamp of reset"},"used":{"type":"integer","title":"Used","description":"Requests consumed in this window","default":0},"resource":{"type":"string","title":"Resource","description":"Rate limit family (core, search, graphql)","default":"core"}},"type":"object","required":["limit","remaining","reset","reset_at"],"title":"RateLimitDetail"},"RateLimitStatusResponse":{"properties":{"tier":{"type":"string","title":"Tier","description":"Apicraft account tier (user or master)"},"apicraft_limits":{"additionalProperties":true,"type":"object","title":"Apicraft Limits","description":"Account API and batch rate limits"},"auth_mode":{"type":"string","title":"Auth Mode","description":"authenticated (custom token), master (server token), or unauthenticated (public 60/hr)"},"github_rate_limit":{"$ref":"#/components/schemas/RateLimitDetail"},"guidance":{"type":"string","title":"Guidance","description":"Rate limit optimization best practices"}},"type":"object","required":["tier","apicraft_limits","auth_mode","github_rate_limit","guidance"],"title":"RateLimitStatusResponse"},"ReleaseCheckResponse":{"properties":{"owner":{"type":"string","title":"Owner","description":"Repository owner","examples":["storytold"]},"repo":{"type":"string","title":"Repo","description":"Repository name","examples":["artcraft"]},"current":{"type":"string","title":"Current","description":"Your current version (normalized)","examples":["0.1.0"]},"latest":{"type":"string","title":"Latest","description":"Newest available version on GitHub","examples":["0.2.0"]},"is_outdated":{"type":"boolean","title":"Is Outdated","description":"True if a newer release exists","examples":[true]},"release_url":{"type":"string","title":"Release Url","description":"Direct link to the newest GitHub release","examples":["https://github.com/storytold/artcraft/releases/tag/v0.2.0"]},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"ISO-8601 publication timestamp","examples":["2026-10-15T12:00:00Z"]},"prerelease":{"type":"boolean","title":"Prerelease","description":"Whether the newer release is a prerelease","examples":[false]},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url","description":"Direct URL or path to the application icon","examples":["/icons/artcraft-logo.png"]}},"type":"object","required":["owner","repo","current","latest","is_outdated","release_url","prerelease"],"title":"ReleaseCheckResponse"},"RepoCatalogItem":{"properties":{"owner":{"type":"string","title":"Owner","description":"Repository owner","examples":["storytold"]},"repo":{"type":"string","title":"Repo","description":"Repository name","examples":["wordcraft"]},"name":{"type":"string","title":"Name","description":"Display title","examples":["WordCraft"]},"group":{"type":"string","title":"Group","description":"Category group","examples":["office"]},"target":{"type":"string","title":"Target","description":"Software alternative","examples":["Microsoft Word"]},"desc":{"type":"string","title":"Desc","description":"Short summary","examples":["97% catalog parity. Reads and writes .docx."]},"icon_url":{"type":"string","title":"Icon Url","description":"URL to 1024px icon","examples":["/icons/wordcraft.png"]},"github_url":{"type":"string","title":"Github Url","description":"Repository GitHub URL","examples":["https://github.com/storytold/wordcraft"]}},"type":"object","required":["owner","repo","name","group","target","desc","icon_url","github_url"],"title":"RepoCatalogItem"},"RepoCatalogResponse":{"properties":{"disclaimer":{"type":"string","title":"Disclaimer","description":"Attribution and non-affiliation notice","examples":["Not affiliated with ArtCraft or storytold. Custom project by visoire."]},"artcraft_official_url":{"type":"string","title":"Artcraft Official Url","description":"Official ArtCraft website","examples":["https://getartcraft.com"]},"total":{"type":"integer","title":"Total","description":"Total repositories cataloged","examples":[22]},"repos":{"items":{"$ref":"#/components/schemas/RepoCatalogItem"},"type":"array","title":"Repos","description":"List of cataloged repositories"}},"type":"object","required":["disclaimer","artcraft_official_url","total","repos"],"title":"RepoCatalogResponse"},"RepoQueryItem":{"properties":{"owner":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-zA-Z0-9_.-]+$","title":"Owner","description":"GitHub repository owner or organization slug","examples":["storytold","facebook","vercel"]},"repo":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-zA-Z0-9_.-]+$","title":"Repo","description":"GitHub repository name","examples":["artcraft","react","next.js"]},"current":{"type":"string","maxLength":100,"minLength":1,"title":"Current","description":"Current version string deployed or running (leading 'v' stripped automatically)","examples":["0.1.0","v18.2.0","14.2.3"]},"include_prereleases":{"type":"boolean","title":"Include Prereleases","description":"Whether to consider alpha, beta, and release candidate tags when checking","default":false}},"type":"object","required":["owner","repo","current"],"title":"RepoQueryItem"},"ResetBody":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","description":"One account per mailbox.","examples":["you@example.com"]},"password":{"type":"string","maxLength":128,"title":"Password","description":"At least 10 characters.","examples":["correct-horse-battery"]},"code":{"type":"string","pattern":"^\\d{3}\\s?\\d{3}$","title":"Code","description":"The 6-digit code from your email","examples":["482 913"]}},"type":"object","required":["email","password","code"],"title":"ResetBody"},"ShowcaseItem":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"prerelease":{"type":"boolean","title":"Prerelease","default":false},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["owner","repo"],"title":"ShowcaseItem"},"ShowcaseResponse":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"When the server last refreshed these versions"},"items":{"items":{"$ref":"#/components/schemas/ShowcaseItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ShowcaseResponse"},"SimpleOkResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Operation success confirmation","default":true}},"type":"object","title":"SimpleOkResponse"},"TokensGuidanceResponse":{"properties":{"token_types":{"additionalProperties":true,"type":"object","title":"Token Types","description":"Overview of fine-grained PAT vs classic PAT vs OAuth/App tokens"},"permissions_needed":{"additionalProperties":true,"type":"object","title":"Permissions Needed","description":"Minimal permissions required per use case"},"rate_limits_info":{"additionalProperties":true,"type":"object","title":"Rate Limits Info","description":"Primary and secondary rate limit rules"},"revocation_rules":{"additionalProperties":true,"type":"object","title":"Revocation Rules","description":"When GitHub expires or revokes tokens"}},"type":"object","required":["token_types","permissions_needed","rate_limits_info","revocation_rules"],"title":"TokensGuidanceResponse"},"TrackAcknowledgeResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"track":{"type":"string","title":"Track","description":"Track name"},"updated_count":{"type":"integer","title":"Updated Count","description":"Number of repositories updated"},"updated_repositories":{"items":{"type":"string"},"type":"array","title":"Updated Repositories","description":"List of owner/repo updated"}},"type":"object","required":["track","updated_count","updated_repositories"],"title":"TrackAcknowledgeResponse"},"TrackItem":{"properties":{"name":{"type":"string","title":"Name","description":"Track or environment name, e.g. prod, staging, tools"},"total":{"type":"integer","title":"Total","description":"Total repositories assigned to this track"},"up_to_date":{"type":"integer","title":"Up To Date","description":"Repositories running the latest release"},"outdated":{"type":"integer","title":"Outdated","description":"Repositories with updates available"},"errors":{"type":"integer","title":"Errors","description":"Repositories that failed GitHub lookup"},"all_current":{"type":"boolean","title":"All Current","description":"True if every repository in this track is up to date"},"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories","description":"List of owner/repo pairs in this track"}},"type":"object","required":["name","total","up_to_date","outdated","errors","all_current"],"title":"TrackItem"},"TrackListResponse":{"properties":{"total_tracks":{"type":"integer","title":"Total Tracks","description":"Total distinct tracks defined"},"tracks":{"items":{"$ref":"#/components/schemas/TrackItem"},"type":"array","title":"Tracks","description":"Track summaries and statistics"}},"type":"object","required":["total_tracks","tracks"],"title":"TrackListResponse"},"TrackerResponse":{"properties":{"as_of":{"type":"string","title":"As Of"},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At"},"attribution":{"additionalProperties":true,"type":"object","title":"Attribution","description":"Required credit when you show or redistribute these numbers (CC BY 4.0)"},"summary":{"additionalProperties":true,"type":"object","title":"Summary","description":"Closest to ready, averages per suite (Adobe, Office, more), releases in 30 days, apps per stage and the biggest movers of the week"},"stages":{"additionalProperties":true,"type":"object","title":"Stages","description":"What pre-alpha, alpha and beta mean here"},"apps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Apps"},"weekly":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Weekly"}},"type":"object","required":["as_of","fetched_at","attribution","summary","stages","apps","weekly"],"title":"TrackerResponse"},"UsageHistoryResponse":{"properties":{"days":{"type":"integer","title":"Days","description":"Length of the window, 7, 30 or 90"},"retention_days":{"type":"integer","title":"Retention Days","description":"How long individual calls are stored"},"stored_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stored Since","description":"Oldest stored call"},"totals":{"additionalProperties":true,"type":"object","title":"Totals","description":"today, last7, last30 and all_time request counts (all time is kept for good)"},"daily":{"items":{"$ref":"#/components/schemas/HistoryDay"},"type":"array","title":"Daily"},"endpoints":{"items":{"$ref":"#/components/schemas/HistoryEndpoint"},"type":"array","title":"Endpoints","description":"The most called endpoints in the window"},"statuses":{"additionalProperties":true,"type":"object","title":"Statuses","description":"Count per HTTP status code"},"recent":{"items":{"$ref":"#/components/schemas/HistoryRequest"},"type":"array","title":"Recent","description":"Newest calls first"},"hours":{"items":{"type":"integer"},"type":"array","title":"Hours","description":"Calls per hour of the day, UTC, 24 numbers starting at 00:00"},"latency":{"$ref":"#/components/schemas/HistoryLatency","description":"Average, median, 95th percentile and slowest duration in milliseconds"},"sources":{"items":{"$ref":"#/components/schemas/HistorySource"},"type":"array","title":"Sources","description":"Calls per origin: the website, your main key and each automation key"}},"type":"object","required":["days","retention_days","totals","daily","endpoints","statuses","recent","hours","latency","sources"],"title":"UsageHistoryResponse"},"UsageResponse":{"properties":{"tier":{"type":"string","title":"Tier","description":"Account tier","examples":["user"]},"limits":{"additionalProperties":true,"type":"object","title":"Limits","description":"General and batch window specifications"},"rate_limit":{"additionalProperties":true,"type":"object","title":"Rate Limit","description":"Tightest window limit, remaining quota, and reset countdown"},"usage":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Usage","description":"7-day request volume"}},"type":"object","required":["tier","limits","rate_limit"],"title":"UsageResponse"},"UserProfileResponse":{"properties":{"email":{"type":"string","title":"Email","description":"Account email","examples":["you@example.com"]},"api_key":{"type":"string","title":"Api Key","description":"Personal animal API key","examples":["ac_otter-falcon-482913-a9f3c71be2d04a553d84fa12"]},"api_key_created_at":{"type":"string","title":"Api Key Created At","description":"Timestamp when the current key was issued","examples":["2026-10-25T20:00:00Z"]},"created_at":{"type":"string","title":"Created At","description":"Account creation timestamp","examples":["2026-10-20T14:30:00Z"]},"tier":{"type":"string","title":"Tier","description":"Assigned rate limit tier","examples":["user"]},"limits":{"additionalProperties":true,"type":"object","title":"Limits","description":"Rate limits of the account"},"usage":{"additionalProperties":true,"type":"object","title":"Usage","description":"Daily and 7-day request history"},"github_token":{"additionalProperties":true,"type":"object","title":"Github Token","description":"Whether a GitHub token is saved (never the token itself)"},"is_owner":{"type":"boolean","title":"Is Owner","description":"True for the owner account, which has the admin page","default":false}},"type":"object","required":["email","api_key","api_key_created_at","created_at","tier","limits","usage","github_token"],"title":"UserProfileResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionVerdict":{"properties":{"slug":{"type":"string","title":"Slug"},"tag":{"type":"string","title":"Tag"},"verdict":{"additionalProperties":true,"type":"object","title":"Verdict","description":"colour (green, yellow, red, grey), title, text. Never says safe or unsafe; it says what the public records show"},"releases":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Releases"},"disclaimer":{"type":"string","title":"Disclaimer","default":"Public GitHub data only. Signals, not a guarantee. Unofficial, not affiliated with ArtCraft or storytold."}},"type":"object","required":["slug","tag","verdict","releases"],"title":"VersionVerdict"},"WatchAdd":{"properties":{"owner":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-zA-Z0-9_.-]+$","title":"Owner","examples":["storytold"]},"repo":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-zA-Z0-9_.-]+$","title":"Repo","examples":["artcraft"]},"current":{"type":"string","maxLength":100,"minLength":1,"title":"Current","description":"Version you run; used to flag updates","default":"0.0.0","examples":["0.1.0"]},"prereleases":{"type":"boolean","title":"Prereleases","description":"Count pre-releases as updates","default":false},"label":{"type":"string","maxLength":40,"title":"Label","description":"A friendly name for lists and dashboards","default":"","examples":["Editor"]},"group":{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9 _.-]*$","title":"Group","description":"A group such as prod, staging or tools; filter with ?group=","default":"","examples":["prod"]}},"type":"object","required":["owner","repo"],"title":"WatchAdd"},"WatchBulk":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WatchAdd"},"type":"array","maxItems":200,"minItems":1,"title":"Items","description":"Repositories to track"},"replace":{"type":"boolean","title":"Replace","description":"True removes every tracked repository that is not in `items` (sync a manifest)","default":false}},"type":"object","required":["items"],"title":"WatchBulk"},"WatchRejected":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"error":{"type":"string","title":"Error"}},"type":"object","required":["owner","repo","error"],"title":"WatchRejected"},"WatchStatus":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"current":{"type":"string","title":"Current"},"label":{"type":"string","title":"Label","default":""},"group":{"type":"string","title":"Group","default":""},"prereleases":{"type":"boolean","title":"Prereleases","default":false},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"},"is_outdated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Outdated"},"release_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["owner","repo","current"],"title":"WatchStatus"},"WatchSummary":{"properties":{"total":{"type":"integer","title":"Total"},"up_to_date":{"type":"integer","title":"Up To Date"},"outdated":{"type":"integer","title":"Outdated"},"errors":{"type":"integer","title":"Errors"},"all_current":{"type":"boolean","title":"All Current","description":"True when nothing is outdated and nothing failed; handy as a CI gate"},"groups":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Groups","description":"Per group: total and outdated"},"outdated_items":{"items":{"$ref":"#/components/schemas/WatchStatus"},"type":"array","title":"Outdated Items"}},"type":"object","required":["total","up_to_date","outdated","errors","all_current","groups","outdated_items"],"title":"WatchSummary"},"WatchlistCheckResponse":{"properties":{"status":{"type":"string","title":"Status","description":"'ok' if all current, 'update_available' if any outdated, 'error' on failures"},"all_current":{"type":"boolean","title":"All Current","description":"True if no repository is outdated or broken"},"exit_code":{"type":"integer","title":"Exit Code","description":"Recommended process exit code: 0 for clean, 1 for updates needed or error","default":0},"total":{"type":"integer","title":"Total","description":"Total evaluated repositories"},"outdated_count":{"type":"integer","title":"Outdated Count","description":"Count of outdated repositories"},"outdated_repositories":{"items":{"$ref":"#/components/schemas/WatchStatus"},"type":"array","title":"Outdated Repositories","description":"Repositories requiring update"},"checked_at":{"type":"string","title":"Checked At","description":"ISO timestamp of evaluation"}},"type":"object","required":["status","all_current","total","outdated_count","checked_at"],"title":"WatchlistCheckResponse"},"WatchlistResponse":{"properties":{"count":{"type":"integer","title":"Count"},"max_items":{"type":"integer","title":"Max Items"},"items":{"items":{"$ref":"#/components/schemas/WatchStatus"},"type":"array","title":"Items"},"rejected":{"items":{"$ref":"#/components/schemas/WatchRejected"},"type":"array","title":"Rejected","description":"Bulk calls only: repositories that were not stored, with the reason"}},"type":"object","required":["count","max_items","items"],"title":"WatchlistResponse"},"app__craft__routes__CompareResponse":{"properties":{"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"sort":{"type":"string","title":"Sort"},"leaders":{"additionalProperties":true,"type":"object","title":"Leaders","description":"The app that leads each measure"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rows"},"disclaimer":{"type":"string","title":"Disclaimer","default":"Public GitHub data only. Signals, not a guarantee. Unofficial, not affiliated with ArtCraft or storytold."}},"type":"object","required":["updated_at","sort","leaders","rows"],"title":"CompareResponse"},"app__schemas__CompareResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"base":{"type":"string","title":"Base","description":"Starting point (the latest release tag unless you passed `base`)"},"head":{"type":"string","title":"Head","description":"End point (the default branch unless you passed `head`)"},"status":{"type":"string","title":"Status","description":"ahead, behind, identical or diverged","examples":["ahead"]},"ahead_by":{"type":"integer","title":"Ahead By","description":"Commits on head that are not in base: the unreleased work","examples":[14]},"behind_by":{"type":"integer","title":"Behind By"},"total_commits":{"type":"integer","title":"Total Commits"},"files_changed":{"type":"integer","title":"Files Changed"},"diff_url":{"type":"string","title":"Diff Url"},"commits":{"items":{"$ref":"#/components/schemas/CommitItem"},"type":"array","title":"Commits","description":"Up to 10 newest commits, newest first"}},"type":"object","required":["owner","repo","base","head","status","ahead_by","behind_by","total_commits","files_changed","diff_url","commits"],"title":"CompareResponse"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ac_ API key","description":"Your personal API key from the account page, for example `ac_otter-falcon-482913-...`."},"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative way to send the same key."}}},"tags":[{"name":"Releases","description":"Query and compare GitHub releases for single or batch repositories."},{"name":"Insights","description":"Read-only extras: download links per OS and CPU, changelog since your version, pull requests, issues, unreleased commits and a repository overview."},{"name":"Craft Watch","description":"Activity, update verdicts, events, contributors and (optionally) readiness of the Craft apps, collected in the background and served from memory. Credits: Craft Watch by Overprivileged, ArtCraft Contributors, CraftSuite (CC BY 4.0). Public data only, signals not a guarantee."},{"name":"Watchlist","description":"Track up to 50 repositories (private ones your token can read, too), group them into tracks, sync a whole list in one call and get a one-field summary for CI."},{"name":"Badges","description":"Live SVG version badges for the repositories shown on the homepage."},{"name":"Repositories & Icons","description":"Catalog of the tracked storytold repositories with icon URLs."},{"name":"Usage & Rate Limits","description":"Your limits and 7-day usage."},{"name":"Authentication & Accounts","description":"Email and password sign-in, session cookie, API key, automation keys and your saved GitHub token."},{"name":"System & Status","description":"Health probe, 90-day status and the homepage showcase. No key needed."}]}