Matches in other apps
zpe-screens
mount /screens · base https://zpe.vc/screens · v1.0.1 · 2 operations · 1 write · 0 need no account · wip
the document this app serves now. Contract: https://zpe.vc/screens/_/api/v1/openapi.json · sha256 e2356be5b7e0
GET
/_/api/v1/screens
Search captures by the text on the page, host, path and time
getScreens
Search captures by the text on the page, host, path and time
Parameters
| name | in | required | type | notes |
|---|---|---|---|---|
host | query | no | string | A host as the app registry spells it, e.g. `zpe.vc`. |
limit | query | no | integer | How many rows to return, 1 to 200. Defaults to 50, newest first. |
path | query | no | string | The page's path, starting with `/`. Exact match, so two captures of the same page are one timeline. |
q | query | no | string | Words to match against the rendered text. Every word must appear, and each one matches as a prefix. FTS5 operators cannot survive the parser, so a search is words and not a query language. |
since | query | no | string | Only captures at or after this instant: epoch milliseconds or an ISO date. |
Request body
None: this operation takes its arguments in the path and the query.
Responses
| status | meaning | body |
|---|---|---|
200 | The captures the question names, newest first | object |
400 | The query string could not be read: `q` held no words, `host` or `path` was malformed, `since` was not a date, or `limit` was outside 1 to 200 | object |
401 | No key and no door session was sent, or the key sent does not open this account | object |
403 | The key is not granted this app for reads, or the door named no account to scope the read to | object |
429 | This key has spent its request ceiling; the refusal says when to retry | object |
500 | This app failed while answering | object |
503 | The door did not answer, so the credential could not be checked | object |
Example
Search captures by the text on the page, host, path and time, with a token from the door.
curl -X GET 'https://zpe.vc/screens/_/api/v1/screens?host=string&limit=0&path=string&q=string&since=string' \ -H 'Authorization: Bearer $ZPE_TOKEN'
{
"query": {
"q": null,
"host": null,
"path": null,
"since": null,
"limit": 0
},
"count": 0,
"rows": [
{
"id": 0,
"host": "string",
"path": "string",
"final_url": null,
"viewport": "string",
"commit_id": "string",
"deploy_id": "string",
"captured_at": 0,
"captured_at_iso": "2026-10-31T09:00:00Z",
"sha256": "string",
"image_bytes": 0,
"image_url": "string",
"text_excerpt": "string",
"text_length": 0,
"previous": null,
"changed_since_previous": null,
"match_snippet": "string"
}
]
}The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.
POST
/_/api/v1/screens
Store one capture, bound to the commit it came from
postScreens
Store one capture, bound to the commit it came from
Parameters
No parameters.
Request body application/json · required
| field | type | required | notes |
|---|---|---|---|
image | string | yes | The image as a data URL (`data:image/webp;base64,…`) or bare base64. The R2 object key is the sha256 of these bytes, so a second identical capture costs no second object. |
content_type | string | no | The image's type. Defaults to the data URL's, or `image/webp`. |
host | string | yes | The host the page was served from, lower case, no scheme and no path. |
path | string | yes | The page's path on that host. Must start with `/`; the first capture of a path compares against nothing. |
commit | string | yes | The full commit the page was deployed from. REQUIRED: a capture with no commit cannot answer "what did this page say before this change", and the route refuses it by name. |
viewport | string | yes | The capture's viewport, `<width>x<height>`, e.g. `1440x900`. |
text | string | no | The page's rendered text. The whole of it is indexed for search; the row carries an excerpt. |
deploy_id | string | no | The deployment's id, when the sweep knows it. |
final_url | string | no | Where the browser ended up. The sweep refuses a `/build` landing rather than storing it. |
captured_at | integer | string | no | When the capture was taken: epoch milliseconds or an ISO date. Defaults to now. |
Responses
| status | meaning | body |
|---|---|---|
200 | The library already held this capture, and answers the row it holds | object |
201 | A new capture was stored | object |
400 | The request could not be read | object |
401 | The credential is missing or does not open this account | object |
403 | This account may not do that | object |
404 | Nothing is here | object |
429 | Too many requests | object |
Example
Store one capture, bound to the commit it came from, with a token from the door.
curl -X POST 'https://zpe.vc/screens/_/api/v1/screens' \
-H 'Authorization: Bearer $ZPE_TOKEN' \
-H 'content-type: application/json' \
-d '{
"image": "string",
"content_type": "string",
"host": "string",
"path": "string",
"commit": "string",
"viewport": "string",
"text": "string",
"deploy_id": "string",
"final_url": "string",
"captured_at": null
}'{
"id": 0,
"sha256": "string",
"r2_key": "string",
"image_bytes": 0,
"captured_at": 0,
"object_written": false,
"row_created": false
}The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.