Getting started
This is the proposed v1 contract. The public API will be backed by the ChronoSeek subnet once validator and gateway implementation is complete.
https://api.chronoseek.org/v1Authentication examples below are part of the preview contract; public API keys are not being issued yet.
Authentication
Authenticate every request with a bearer token in the Authorization header. Requests without a valid key return 401.
Authorization: Bearer cs_live_9f2e…Quickstart
Find a moment in a hosted video with one call.
curl -X POST https://api.chronoseek.org/v1/seek \
-H "Authorization: Bearer $CHRONOSEEK_KEY" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://example.com/match.mp4",
"query": "the moment the goalkeeper saves the shot"
}'POST /v1/seek
Search one video for one described moment.
| Field | Type | Description |
|---|---|---|
video_url | string | Public or signed URL of the video. MP4, WebM, MOV, HLS. |
video_id | string | ID of a previously indexed video. Use instead of video_url for long footage. |
query | string | Plain-language description of the moment. Be concrete: actions, objects, sounds. |
top_k | int | Candidate moments to return. Default 3, max 10. |
min_confidence | float | Drop candidates below this score. Default 0.3. |
The response
The primary result is first; candidatesholds the runner-up moments so you can offer "did you mean this scene?" navigation.
{
"timestamp": "00:47:12.480",
"timestamp_seconds": 2832.48,
"confidence": 0.97,
"window": ["00:47:09.100", "00:47:18.220"],
"candidates": [
{ "t": "00:47:12.480", "confidence": 0.97, "miner_uid": 26 },
{ "t": "00:12:48.960", "confidence": 0.44, "miner_uid": 9 }
],
"miners_queried": 42,
"latency_ms": 812
}window is the span the network agrees contains the full action — seek there when you want context, to timestamp when you want the frame.
Indexing long videos
For footage over ~30 minutes, index once and query many times. Indexing runs asynchronously; poll the job or register a webhook.
curl -X POST https://api.chronoseek.org/v1/videos \
-H "Authorization: Bearer $CHRONOSEEK_KEY" \
-d '{ "video_url": "https://example.com/full-match.mp4" }'
# → { "video_id": "vid_8f31c2", "status": "indexing" }
# then query it forever:
# POST /v1/seek { "video_id": "vid_8f31c2", "query": "…" }Errors
| Code | Meaning | What to do |
|---|---|---|
400 | Malformed request | Check required fields; exactly one of video_url / video_id. |
401 | Invalid API key | Regenerate the key from your account page. |
404 | Video not reachable | The URL must be publicly fetchable or a signed link. |
422 | No confident moment | The network found nothing above min_confidence. Rephrase with concrete detail. |
429 | Rate limited | Back off per Retry-After; see limits below. |
Rate limits
| Plan | Seeks / min | Indexing hours / day |
|---|---|---|
| Developer | 20 | 2 |
| Scale | 300 | 50 |
| Network partner | custom | custom |
Every response carries X-RateLimit-Remaining. Need more? Follow the GitHub organization or run your own validator for priority access.