Artifact a91efe364c89b76ffdd03933ffb5d5f4fe90e36e3b2a9e9fc5d119a3d60c7567:
- File
docs/api.md
— part of check-in
[5cc9306b59]
at
2026-08-24 21:40:18
on branch hit-meta
— search: results say what tells them apart
"use after free" on tk returned three rows identical on screen — same repository, same title, same snippet — because the same fix landed on three branches and the row carried nothing that differed. The only way to find out which one you wanted was to open all three.
Rows now carry the hash, date, author and branch for a check-in; the status and date for a ticket; the date and author for wiki, forum and technote. A doc or a file is identified by its path and gets nothing, rather than a date nobody asked for.
Decorated by primary key, for the page actually shown: the FTS query groups over a match set that can be thousands of rows, so joining there would decorate all of them to render fifty. On the fleet, decorated AFTER the merge trims — every repository is asked for the full limit so the merge can pick freely, and decorating before it meant 25 indexes times 50 rows to render 50.
One definition of the line, shared by both search pages. They are separate templates, which is why the first version of this reached only the per-repo one. (user: dmestas, size: 36760) [annotate] [blame] [check-ins using] [more...]
# quarry API Generated from the op registry by `quarry docs` — edit the ops, not this file; regenerate with `make docs`. Every op also appears in the OpenAPI document (`quarry spec`). Query inputs ride the query string; the same names work as JSON. ## account.add `POST /api/v1/accounts` — command, admin Create a forge account. The password is hashed with argon2id and never stored or returned in plaintext. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `password` | string | `required,max=1024` | | `admin` | boolean | — | Output fields: - `name` (string) - `admin` (boolean) ## account.delete `POST /api/v1/accounts/delete` — command, admin Delete an account and all of its grants. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | Output fields: - `name` (string) ## account.grant `POST /api/v1/accounts/grant` — command, admin Grant an account read, write or admin on one repository. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `repo` | string | `required,max=64` | | `role` | string | `required,oneof=read\|write\|admin` | Output fields: - `name` (string) - `repo` (string) - `role` (string) ## account.list `GET /api/v1/accounts` — query, admin List forge accounts and their per-repository grants. Output fields: - `accounts` (array of object {Account: object {name: string, admin: boolean, created: string}, grants: array of object {repo: string, role: string}}) - `count` (integer) ## account.passwd `POST /api/v1/accounts/passwd` — command, admin Set an account's password. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `password` | string | `required,max=1024` | Output fields: - `name` (string) ## account.revoke `POST /api/v1/accounts/revoke` — command, admin Remove an account's grant on one repository. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `repo` | string | `required,max=64` | Output fields: - `name` (string) - `repo` (string) - `role` (string) ## archive.get `GET /api/v1/r/{repo}/archive/{version}` — query, anonymous Download a check-in's files as a reproducible archive (tar.gz or zip). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `format` | string | `oneof=tar\|zip` | Output fields: - `name` (string) - `size` (integer) - `version` (string) - `content` (string) ## artifact.resolve `GET /api/v1/r/{repo}/info/{prefix}` — query, anonymous Resolve an artifact hash prefix to its kind and canonical reference — fossil's /info dispatch. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `prefix` | string | `required,min=4,max=64` | Output fields: - `kind` (string) - `ref` (string) ## attachment.get `GET /api/v1/r/{repo}/attachment/{hash}` — query, anonymous Fetch one attachment's content by its content-artifact hash. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `name` (string) - `size` (integer) - `content` (string) ## branch.list `GET /api/v1/r/{repo}/branch` — query, anonymous List branches with their tip check-in, most recently active first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `branches` (array of object {name: string, tip: string, date: string, closed: boolean}) - `count` (integer) ## checkin.diff `GET /api/v1/r/{repo}/checkin/{hash}/diff` — query, anonymous Diff one check-in against its primary parent. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | | `file` | string | `max=4096` | | `offset` | integer | `min=0` | | `maxLines` | integer | `min=0` | | `branch` | boolean | — | | `from` | string | `max=64` | | `unified` | boolean | — | Output fields: - `from` (string) - `to` (string) - `files` (array of object {status: string, name: string}) - `structured` (array of object {path: string, prevPath: string, change: string, hunks: array of object {oldStart: integer, newStart: integer, header: string, lines: array of object {kind: string, oldNum: integer, newNum: integer, tokens: array of object {class: string, text: string, mark: boolean}}}, added: integer, deleted: integer, before: integer, omitted: integer}) - `unified` (string) - `note` (string) - `omittedLines` (integer) - `nextOffset` (integer) - `totalLines` (integer) - `lastOffset` (integer) - `offset` (integer) ## checkin.get `GET /api/v1/r/{repo}/checkin/{hash}` — query, anonymous Describe one check-in: metadata, parents, and its file set. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | | `files` | string | `max=4` | Output fields: - `hash` (string) - `ci` (string) - `branch` (string) - `date` (string) - `user` (string) - `comment` (string) - `parents` (array of string) - `files` (array of object {blob: string, name: string, size: integer, perm: string, binary: boolean}) - `discussedIn` (array of object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}) - `tags` (array of string) - `commentOrig` (string) - `hidden` (boolean) - `closed` (boolean) - `fork` (string) - `context` (array of object {kind: string, hash: string, ref: string, date: string, user: string, comment: string, branch: string, isLeaf: boolean, isMerge: boolean, parents: array of string, ci: string, commentOrig: string, hidden: boolean, closed: boolean, excerpt: string}) ## checkin.manifest `GET /api/v1/r/{repo}/checkin/{hash}/manifest` — query, anonymous One check-in's manifest artifact, as cards. The file list is counted, not returned — it is 99% of the bytes and the tree browser already renders it. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `hash` (string) - `size` (integer) - `cards` (array of object {letter: string, text: string, note: string}) - `files` (integer) ## checkin.tags `GET /api/v1/r/{repo}/checkin/{hash}/tags` — query, anonymous The full tag history of a check-in — every tag artifact that touched it, oldest first, with which rows still stand. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `hash` (string) - `date` (string) - `user` (string) - `comment` (string) - `commentOrig` (string) - `branch` (string) - `hidden` (boolean) - `closed` (boolean) - `events` (array of object {date: string, src: string, name: string, sign: string, value: string, standing: boolean}) ## ci.list `GET /api/v1/r/{repo}/ci` — query, anonymous List a repository's CI runs, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `runs` (array of object {runId: string, checkin: string, workflow: string, pipeline: string, status: string, started: string}) - `count` (integer) ## doc.get `GET /api/v1/r/{repo}/doc/{hash}/{path...}` — query, anonymous Render one file from the tree as embedded documentation, chosen by extension. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=1,max=64` | | `path` | string | `required,max=512` | Output fields: - `hash` (string) - `path` (string) - `size` (integer) - `mimetype` (string) - `html` (string) - `outline` (array of object {level: integer, id: string, text: string}) - `contentType` (string) - `content` (string) ## doc.list `GET /api/v1/r/{repo}/doc` — query, anonymous List the documents in a check-in's conventional documentation directories. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=64` | Output fields: - `version` (string) - `docs` (array of object {path: string, size: integer, date: string, user: string}) ## file.get `GET /api/v1/r/{repo}/file/{hash}/{path...}` — query, anonymous Fetch one file's content at a check-in. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | | `path` | string | `required,max=512` | Output fields: - `hash` (string) - `path` (string) - `size` (integer) - `binary` (boolean) - `content` (string) - `html` (string) - `renderable` (boolean) ## file.history `GET /api/v1/r/{repo}/history/{version}/{path...}` — query, anonymous List the check-ins that changed one file, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `path` | string | `required,max=1024` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `path` (string) - `version` (string) - `changes` (array of object {hash: string, date: string, user: string, comment: string}) - `count` (integer) ## fleet.status `GET /api/v1/fleet` — query, admin Report every served store's ingest health. Output fields: - `repos` (array of object {name: string, code: string, checkins: integer, indexing: boolean, health: object {lastOk: string, roundSeconds: number, lastCount: integer, total: integer, fallbacks: integer, gaps: integer, lastErr: string, lastErrAt: string, failures: integer, stalled: boolean, retryAt: string}}) - `count` (integer) - `unhealthy` (integer) - `errors` (array of object {message: string, surface: string, path: string, count: integer, first: object {}, last: object {}}) - `errorTotal` (integer) ## fleet.sync `POST /api/v1/fleet/sync` — command, admin Run an ingest round now — one store, or every store when `repo` is empty. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | Output fields: - `results` (array of object {repo: string, artifacts: integer, err: string}) - `failed` (integer) ## forum.get `GET /api/v1/r/{repo}/forum/{root}` — query, anonymous Fetch one forum thread: every post, rendered, in reading order. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `root` | string | `required,min=4,max=64` | Output fields: - `root` (string) - `title` (string) - `excerpt` (string) - `posts` (array of object {hash: string, parent: string, date: string, user: string, html: string, score: integer, yourVote: integer, hidden: boolean, hiddenReason: string, poll: object {present: boolean, question: string, options: array of string, counts: array of integer, percents: array of integer, total: integer, yourChoice: integer, closed: boolean, closes: string}}) - `yourSub` (string) ## forum.list `GET /api/v1/r/{repo}/forum` — query, anonymous List a repository's forum threads, most-recently-active first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `sort` | string | `max=8` | Output fields: - `threads` (array of object {ForumThread: object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}, score: integer, category: string, spark: array of integer, dormant: boolean}) - `announcements` (array of object {ForumThread: object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}, score: integer, category: string, spark: array of integer, dormant: boolean}) - `count` (integer) ## forum.post `POST /api/v1/r/{repo}/forum` — command, token Open a new forum thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `title` | string | `required,max=200` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string) - `staged` (boolean) ## forum.reply `POST /api/v1/r/{repo}/forum/{root}` — command, token Reply to a forum post within its thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `root` | string | `required,min=4,max=64` | | `to` | string | `max=64` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string) - `staged` (boolean) ## landing.accept `POST /api/v1/r/{repo}/landing/{id}/accept` — command, token Land the branch on its target and settle the record. Writes a merge check-in, so it needs the check-in capability rather than the forum one. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## landing.comment `POST /api/v1/r/{repo}/landing/{id}/comment` — command, token Add a remark to a landing's discussion. An ordinary forum reply. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## landing.get `GET /api/v1/r/{repo}/landing/{id}` — query, anonymous One landing: the record, its discussion, and whether the caller may accept it. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | Output fields: - `landing` (object {id: string, branch: string, target: string, title: string, author: string, opened: string, updated: string, state: string, settled_by: string}) - `posts` (array of object {transition: string, root: boolean}) - `canAccept` (boolean) - `mergeable` (string) - `conflicts` (array of string) ## landing.list `GET /api/v1/r/{repo}/landing` — query, anonymous Landings in this repository: branches proposed to land on a target, newest activity first. A landing is a forum thread, so it reads on the forum capability. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `state` | string | `max=16` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `landings` (array of object {id: string, branch: string, target: string, title: string, author: string, opened: string, updated: string, state: string, settled_by: string}) - `open` (integer) - `count` (integer) ## landing.open `POST /api/v1/r/{repo}/landing` — command, token Propose a branch to land on a target. Mints a forum thread — no new artifact kind — so a stock fossil clone reads it as an ordinary discussion. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `branch` | string | `required,max=120` | | `target` | string | `max=120` | | `message` | string | `required,max=65536` | Output fields: - `id` (string) ## landing.reject `POST /api/v1/r/{repo}/landing/{id}/reject` — command, token Settle a landing without merging. Writes no check-in, so it needs only the capability to speak in the thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## markup.preview `POST /api/v1/r/{repo}/markup-preview` — command, token Render markdown exactly as saving it would — the composer's preview IS the production renderer, so what you see is what readers get. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `body` | string | `max=1048576` | Output fields: - `html` (string) ## me.feed `GET /api/v1/me/feed` — query, token The signed-in dashboard: the caller's granted repositories ordered by activity, the merged activity feed across them, and the caller's own recorded work. Input: | field | type | rules | |---|---|---| | `kind` | string | `max=2` | | `offset` | integer | `min=0,max=1000` | | `find` | string | `max=64` | Output fields: - `user` (string) - `repos` (array of object {name: string, description: string, lastActivity: string, open: integer}) - `feed` (array of object {repo: string, kind: string, ref: string, hash: string, date: string, user: string, comment: string}) - `kinds` (array of object {kind: string, count: integer}) - `total` (integer) - `depth` (integer) - `mine` (array of object {repo: string, kind: string, ref: string, hash: string, date: string, user: string, comment: string}) ## meta.docs `GET /api/v1/docs` — query, anonymous The API reference, generated from this registry and rendered. Output fields: - `markdown` (string) - `html` (string) ## meta.version `GET /api/v1/version` — query, anonymous Report the quarry build version. Output fields: - `version` (string) ## mirror.detach `POST /api/v1/mirrors/detach` — command, admin Detach a store from its upstream: quarry becomes the source of truth and accepts writes; the upstream is kept as provenance (`detachedFrom`). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `repo` (string) ## mirror.list `GET /api/v1/mirrors` — query, admin List configured upstream mirrors and their recent history. Output fields: - `mirrors` (array of object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) - `count` (integer) ## mirror.run `POST /api/v1/mirrors/run` — command, admin Pull from upstream now — one store, or every configured mirror when `repo` is empty. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | Output fields: - `results` (array of object {repo: string, changed: boolean, err: string}) - `failed` (integer) - `changed` (integer) ## mirror.set `POST /api/v1/mirrors` — command, admin Configure a store's upstream and pull interval. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `url` | string | `required,max=2048` | | `every` | integer | `min=0,max=604800,default=3600` | Output fields: - `mirror` (object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) ## mirror.writes `POST /api/v1/mirrors/writes` — command, admin Allow or refuse local writes (push, tickets, wiki, forum) on a mirror. Refused by default: a write landing on a tracking store forks it by accident. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `accept` | boolean | — | Output fields: - `mirror` (object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) ## people.list `GET /api/v1/people` — query, anonymous List contributors across every repository the caller may read. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | | `q` | string | `max=100` | | `offset` | integer | `min=0,max=1000000` | | `limit` | integer | `min=0,max=500,default=100` | Output fields: - `people` (array of object {user: string, events: integer, first: string, last: string, repos: array of string}) - `count` (integer) - `total` (integer) ## repo.about `GET /api/v1/r/{repo}/about` — query, anonymous The repository's About aggregate: description, homepage and topics (.quarry/repo.json), the landing page's document tabs, the latest release tag, and the contributor count. One op so the panel costs one invoke and the JSON API sees the same panel. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `doc` | string | `max=512` | Output fields: - `docPath` (string) - `docLabel` (string) - `docHtml` (string) - `description` (string) - `homepage` (string) - `topics` (array of string) - `docs` (array of object {path: string, label: string}) - `latestTag` (string) - `latestTagTip` (string) - `latestTagDate` (string) - `tagCount` (integer) - `contributors` (integer) - `licenseName` (string) - `announceRoot` (string) - `announceTitle` (string) - `announceDate` (string) - `noteEvent` (string) - `noteTitle` (string) - `noteDate` (string) - `noteUser` (string) - `noteExcerpt` (string) - `noteCount` (integer) - `problem` (string) ## repo.add `POST /api/v1/repos` — command, admin Serve a repository: an existing store at `path`, a new empty one (`create`), or a clone of `clone`. Cloning also records a mirror unless `noMirror`. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `path` | string | `max=4096` | | `description` | string | `max=300` | | `private` | boolean | — | | `create` | boolean | — | | `clone` | string | `max=2048` | | `readme` | boolean | — | | `license` | string | `max=16` | | `ignore` | boolean | — | | `noMirror` | boolean | — | | `mirrorEvery` | integer | `min=0,max=604800` | Output fields: - `name` (string) - `path` (string) - `mirrored` (boolean) ## repo.counts `GET /api/v1/r/{repo}/counts` — query, anonymous Count a repository's content by section — what the navigation shows. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `indexBehind` (boolean) - `checkins` (integer) - `wikiPages` (integer) - `tickets` (integer) - `forumThreads` (integer) - `openLandings` (integer) - `technotes` (integer) - `contributors` (integer) - `tags` (integer) ## repo.delete `POST /api/v1/repos/delete` — command, admin Destroy a repository: its store, its index and everything keyed to it. `confirm` must equal `name`. Only repositories quarry created can be deleted. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `confirm` | string | `required,max=64` | Output fields: - `name` (string) ## repo.get `GET /api/v1/r/{repo}/info` — query, anonymous Describe one repository: its settings and headline counts. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `name` (string) - `contributors` (integer) - `mirroredAt` (string) - `mirror` (object {tracking: boolean, url: string, every: integer, lastOk: string, lastAt: string, lastErr: string, failures: integer, acceptWrites: boolean, state: string}) - `detachedFrom` (string) - `deletable` (boolean) - `homepage` (string) - `topics` (string) - `fossilClone` (boolean) - `lastActive` (string) - `description` (string) - `private` (boolean) - `checkins` (integer) - `tipDate` (string) - `tipComment` (string) - `indexing` (boolean) ## repo.list `GET /api/v1/repos` — query, anonymous List the served repositories with their tip check-in. Input: | field | type | rules | |---|---|---| | `q` | string | `max=64` | | `sort` | string | `oneof=active\|name\|size` | | `limit` | integer | `min=0,max=500` | | `kind` | string | `oneof=\|mirror\|native` | Output fields: - `repos` (array of object {name: string, contributors: integer, mirroredAt: string, mirror: object {tracking: boolean, url: string, every: integer, lastOk: string, lastAt: string, lastErr: string, failures: integer, acceptWrites: boolean, state: string}, detachedFrom: string, deletable: boolean, homepage: string, topics: string, fossilClone: boolean, lastActive: string, description: string, private: boolean, checkins: integer, tipDate: string, tipComment: string, indexing: boolean}) - `count` (integer) - `total` (integer) - `served` (integer) ## repo.reindex `POST /api/v1/r/{repo}/reindex` — command, admin Wipe this repository's derived index and replay it from the store, in process, while the forge serves. The sanctioned repair for any index that disagrees with its store. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `artifacts` (integer) ## repo.remove `POST /api/v1/repos/remove` — command, admin Stop serving a repository. The store on disk is left untouched. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | Output fields: - `name` (string) ## repo.update `POST /api/v1/repos/update` — command, admin Set a repository's settings: description and visibility. Fields are applied whole. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `description` | string | `max=300` | | `private` | boolean | — | | `homepage` | string | `max=300` | | `topics` | string | `max=600` | Output fields: - `name` (string) - `description` (string) - `private` (boolean) - `homepage` (string) - `topics` (string) ## search.all `GET /api/v1/search` — query, anonymous Full-text search across every repository the caller may read. Input: | field | type | rules | |---|---|---| | `q` | string | `required,max=200` | | `kind` | string | `oneof=checkin\|wiki\|ticket\|forum\|technote\|doc\|file` | | `repo` | string | `max=64` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `results` (array of object {repo: string, SearchResult: object {kind: string, ref: string, label: string, snippet: string, date: string, user: string, branch: string, status: string, hash: string}}) - `count` (integer) - `searched` (integer) - `by_repo` (array of object {repo: string, count: integer}) ## search.query `GET /api/v1/r/{repo}/search` — query, anonymous Full-text search over a repository's check-ins, wiki, and tickets. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `q` | string | `required,max=200` | | `kind` | string | `oneof=checkin\|wiki\|ticket\|forum\|technote\|doc\|file` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `results` (array of object {kind: string, ref: string, label: string, snippet: string, date: string, user: string, branch: string, status: string, hash: string}) - `count` (integer) ## tag.list `GET /api/v1/r/{repo}/tag` — query, anonymous List release tags — symbolic names that are not branches. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=500,default=100` | Output fields: - `tags` (array of object {name: string, tip: string, date: string}) - `count` (integer) ## technote.add `POST /api/v1/r/{repo}/technote` — command, token Record a technote; passing an existing event id records an edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | | `comment` | string | `max=200` | | `event` | string | `max=64` | | `time` | string | `max=32` | Output fields: - `event` (string) - `hash` (string) ## technote.get `GET /api/v1/r/{repo}/technote/{event}` — query, anonymous Fetch one technote, rendered, by event-id prefix; rev selects one edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `event` | string | `required,max=64` | | `rev` | string | `max=64` | Output fields: - `event` (string) - `hash` (string) - `date` (string) - `edited` (string) - `user` (string) - `comment` (string) - `body` (string) - `html` (string) - `revisions` (integer) - `historical` (boolean) ## technote.history `GET /api/v1/r/{repo}/technote/{event}/history` — query, anonymous List every recorded edit of one technote, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `event` | string | `required,max=64` | Output fields: - `event` (string) - `comment` (string) - `edits` (array of object {hash: string, date: string, edited: string, user: string, comment: string}) - `count` (integer) ## technote.list `GET /api/v1/r/{repo}/technote` — query, anonymous List a repository's technotes at their latest edit, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `notes` (array of object {hash: string, event: string, date: string, user: string, mimetype: string, comment: string, body: string, excerpt: string, revisions: integer}) - `count` (integer) ## ticket.across `GET /api/v1/me/tickets` — query, token Every tracker the caller can reach, as one listing: the same report axes as ticket.list asked of all granted repositories at once, with repository as one more browse axis. Input: | field | type | rules | |---|---|---| | `limit` | integer | `min=0,max=200,default=50` | | `state` | string | `oneof=open\|closed\|all` | | `repo` | string | `max=64` | | `type` | string | `max=64` | | `severity` | string | `max=64` | | `priority` | string | `max=64` | | `subsystem` | string | `max=64` | | `status` | string | `max=64` | | `author` | string | `max=64` | | `title` | string | `max=128` | | `order` | string | `max=32` | | `awaiting` | boolean | — | Output fields: - `tickets` (array of object {repo: string}) - `count` (integer) - `open` (integer) - `closed` (integer) - `repos` (array of object {value: string, open: integer}) - `subsystems` (array of object {value: string, open: integer}) - `authors` (array of object {value: string, open: integer}) - `truncated` (boolean) ## ticket.config `GET /api/v1/r/{repo}/ticket-config` — query, anonymous The repository's ticket vocabulary: .quarry/tickets.json at the tip of trunk, merged over fossil's defaults. List order is sort order. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `vocab` (array of object {field: string, words: array of string}) - `source` (string) - `problem` (string) ## ticket.get `GET /api/v1/r/{repo}/ticket/{id}` — query, anonymous Fetch one ticket: folded state plus change history. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=40` | Output fields: - `ticket` (object {id: string, created: string, updated: string, fields: array of object {name: string, value: string}, description: string, descriptionMimetype: string, comments: array of object {hash: string, date: string, login: string, username: string, mimetype: string, body: string}, changes: array of object {hash: string, date: string, user: string, fields: array of object {name: string, value: string}}}) - `descriptionHtml` (string) - `comments` (array of object {date: string, login: string, username: string, html: string}) - `attachments` (array of object {hash: string, name: string, src: string, date: string, user: string}) ## ticket.list `GET /api/v1/r/{repo}/ticket` — query, anonymous List a repository's tickets with their folded current state. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | | `before` | string | `max=96` | | `state` | string | `oneof=open\|closed\|all` | | `type` | string | `max=64` | | `severity` | string | `max=64` | | `priority` | string | `max=64` | | `subsystem` | string | `max=64` | | `status` | string | `max=64` | | `author` | string | `max=64` | | `title` | string | `max=128` | | `offset` | integer | `min=0,max=100000` | | `order` | string | `max=32` | Output fields: - `tickets` (array of object {id: string, title: string, status: string, updated: string, created: string, type: string, severity: string, priority: string, subsystem: string, resolution: string, author: string, lastUser: string, comments: integer}) - `count` (integer) - `open` (integer) - `closed` (integer) - `subsystems` (array of object {value: string, open: integer}) - `authors` (array of object {value: string, open: integer}) - `next` (string) ## ticket.new `POST /api/v1/r/{repo}/ticket` — command, token Open a new ticket. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `title` | string | `required,max=200` | | `status` | string | `max=40` | | `comment` | string | `max=65536` | | `type` | string | `max=40` | | `severity` | string | `max=40` | | `priority` | string | `max=40` | | `subsystem` | string | `max=80` | | `foundin` | string | `max=80` | Output fields: - `id` (string) - `hash` (string) ## ticket.set `POST /api/v1/r/{repo}/ticket/{id}` — command, token Record a ticket change; empty fields are left untouched. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=40` | | `title` | string | `max=200` | | `status` | string | `max=40` | | `resolution` | string | `max=40` | | `comment` | string | `max=65536` | | `description` | string | `max=65536` | | `type` | string | `max=40` | | `severity` | string | `max=40` | | `priority` | string | `max=40` | | `subsystem` | string | `max=80` | | `foundin` | string | `max=80` | Output fields: - `hash` (string) ## timeline.list `GET /api/v1/r/{repo}/timeline` — query, anonymous List a repository's events — check-ins, wiki edits, ticket changes — newest first, paged by `before`. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | | `before` | string | `max=96` | | `branch` | string | `max=64` | | `tag` | string | `max=64` | | `user` | string | `max=64` | | `y` | string | `oneof=all\|ci\|w\|t\|e\|f` | Output fields: - `entries` (array of object {kind: string, hash: string, ref: string, date: string, user: string, comment: string, branch: string, isLeaf: boolean, isMerge: boolean, parents: array of string, ci: string, commentOrig: string, hidden: boolean, closed: boolean, excerpt: string}) - `defaultBranch` (string) - `count` (integer) - `next` (string) - `indexBehind` (boolean) ## tree.list `GET /api/v1/r/{repo}/tree/{version}/{path...}` — query, anonymous List one directory of a check-in, with the directory's README rendered. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `path` | string | `max=1024` | Output fields: - `version` (string) - `ref` (string) - `path` (string) - `entries` (array of object {name: string, path: string, dir: boolean, blob: string, files: integer, size: integer, exec: boolean, link: boolean, binary: boolean, lastHash: string, lastDate: string, lastComment: string}) - `readme` (string) - `readmeIn` (string) ## wiki.get `GET /api/v1/r/{repo}/wiki/{name}` — query, anonymous Fetch one wiki page, rendered — latest, or the revision named by rev. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | | `rev` | string | `max=64` | Output fields: - `hash` (string) - `title` (string) - `date` (string) - `user` (string) - `mimetype` (string) - `source` (string) - `html` (string) - `outline` (array of object {level: integer, id: string, text: string}) - `deleted` (boolean) ## wiki.history `GET /api/v1/r/{repo}/wiki/{name}/history` — query, anonymous List every recorded edit of one wiki page, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | Output fields: - `title` (string) - `edits` (array of object {hash: string, date: string, user: string}) - `count` (integer) ## wiki.list `GET /api/v1/r/{repo}/wiki` — query, anonymous List a repository's wiki pages with their latest edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `pages` (array of object {title: string, date: string, user: string, revisions: integer}) - `count` (integer) - `orphans` (array of string) - `wanted` (array of object {title: string, links: integer, from: array of string}) - `home` (string) ## wiki.save `POST /api/v1/r/{repo}/wiki/{name}` — command, token Record a wiki page edit (creates the page on first save). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string)