COLOSSEUM_COPILOT_API_BASE (default: https://copilot.colosseum.com/api/v1).
All requests require a Bearer token:
Rate limits
All limits are per-user (keyed by your Colosseum account). Exceeding a limit returns429 with a Retry-After header.
| Category | Limit | Applies to |
|---|---|---|
| Search | 30 req/min | /search/projects, /search/archives |
| Analysis | 10 req/min | /analyze, /compare |
| Concurrency | 2 in-flight | All data endpoints |
| Source suggestions | 5 req/hr | /source-suggestions |
Retry-After header. Most agent runtimes handle this automatically.
Endpoints
GET /colosseum_copilot/filters
Fetch available filters and canonical hackathon chronology. Use to translate hackathon or track names into valid slugs/keys before searching, and to getstartDate values for chronology-sensitive answers.
tracks[]:{ key, name, hackathonSlug, projectCount }hackathons[]:{ slug, name, startDate, projectCount, winnerCount }— ordered chronologically (oldest first)acceleratorBatches[]:{ key, name, companyCount }prizeTypes[]: prize category namesprizePlacements[]: placement ranksproblemTags[]:{ tag, count }(top 25 by frequency)solutionTags[]:{ tag, count }(top 25 by frequency)primitives[]:{ tag, count }(top 25 by frequency)techStack[]:{ tag, count }(top 25 by frequency)targetUsers[]:{ tag, count }(top 25 by frequency)clusters[]:{ key, label, projectCount }(key formatv<N>-c<N>)archiveSources[]:{ key, label, documentCount? }(documentCountis optional)
POST /colosseum_copilot/search/projects
Primary similarity search for hackathon projects.limit 8–12, includeFacets false.
Request parameters:
| Param | Type | Default | Description |
|---|---|---|---|
query | string | "" | Natural language query (optional, max 500 chars; omit for filter-only browsing) |
hackathons | string[] | - | Filter by hackathon slugs, max 10 (e.g., ["cypherpunk", "breakout"]) |
trackKeys | string[] | - | Filter by track keys, max 10 (format <hackathonSlug>/<trackSlug>) |
limit | int | 10 | Max results to return (max 25) |
offset | int | 0 | Pagination offset (applied after ranking) |
diversify | boolean | true | Cross-hackathon diversity ranking. Set false for narrow deep-dives |
includeFacets | boolean | false | Enable facet computation (adds overhead) |
includeDiagnostics | boolean | false | Include search diagnostics in response |
filters object):
| Param | Type | Description |
|---|---|---|
winnersOnly | boolean | Only prize-winning projects |
acceleratorOnly | boolean | Only accelerator portfolio companies |
acceleratorBatchKeys | string[] | Specific batches, max 10 (format accelerator/<batchSlug>) |
prizePlacements | int[] | Prize placement ranks |
prizeTypes | string[] | Prize categories, max 10 |
isUniversityProject | boolean | University-affiliated projects |
isSolanaMobile | boolean | Solana Mobile projects |
techStack | string[] | Tech stack tags, max 10 |
primitives | string[] | Primitive/protocol tags, max 10 |
problemTags | string[] | Problem domain tags, max 10 |
solutionTags | string[] | Solution approach tags, max 10 |
targetUsers | string[] | Target user segments, max 10 |
clusterKeys | string[] | Cluster keys, max 10 (format v<N>-c<N>) |
GET /filters.
Facet parameters:
| Param | Type | Default | Description |
|---|---|---|---|
facets | string[] | - | Dimensions: hackathons, tracks, prizes, problemTags, solutionTags, primitives, techStack, clusters. If omitted and includeFacets=true, all dimensions are computed |
facetTopK | int | 8 | Max buckets per dimension (1–20) |
| Field | Type | Description |
|---|---|---|
results | object[] | Array of project results (see below) |
filtersApplied | object | { hackathons?: string[], trackKeys?: string[], filters?: object } |
totalFound | int | Total matching projects |
hasMore | boolean | Whether more results are available |
facets | object? | Facet buckets by dimension (only present when includeFacets=true) |
diagnostics | object? | Search diagnostics (only present when includeDiagnostics=true) |
results[]):
| Field | Type | Nullable | Description |
|---|---|---|---|
slug | string | Project slug | |
name | string | Project name | |
oneLiner | string | yes | Short project description |
similarity | number | Match score | |
hackathon | object | { name, slug, startDate } | |
tracks | object[] | [{ name, key }] | |
links | object | { github, demo, presentation, technicalDemo, twitter, colosseum } (all fields nullable) | |
evidence | string[] | Short snippets showing why this matched (max 2) | |
prize | object | yes | { type, name?, placement?, amount?, trackName? } (inner fields nullable) |
metrics | object | { likesCount, commentsCount, updatesCount } | |
team | object | { count } | |
crowdedness | int | yes | Cluster size as a crowdedness proxy |
tags | object | yes | { problemTags[], solutionTags[], primitives[], techStack[], targetUsers[] } |
cluster | object | yes | { key, label } |
accelerator | object | yes | { companySlug?, companyName?, batchKey, batchName } (companySlug/companyName nullable) |
{ key, label, count, sampleProjectSlugs[] }
Diagnostics object (when includeDiagnostics=true):
| Field | Type | Description |
|---|---|---|
modeUsed | string | vector, text, hybrid, or filters |
fallbackUsed | boolean | Whether a fallback search tier was used |
fallbackReason | string? | Reason for fallback (if applicable) |
vectorCandidates | int | Candidates from vector search |
textCandidates | int | Candidates from text search |
tagCandidates | int | Candidates from semantic tag search |
diversityDropped | int | Results removed by diversity filter |
totalFoundIsEstimate | boolean | Whether totalFound is an estimate |
effectiveFilters | object | Filters actually applied after resolution |
queryExpanded | string | Query after synonym expansion |
POST /colosseum_copilot/search/archives
Search archival documents for conceptual precedents. Auto-cascades through tiers (vector → chunk text → document text) when a tier returns no results.limit 4–6, maxChunksPerDoc 2, minSimilarity 0.2.
Request parameters:
| Param | Type | Default | Description |
|---|---|---|---|
query | string | - | Search query, required (min 1, max 500 chars). 3–6 focused keywords recommended |
sources | string[] | - | Filter by source keys, max 20. Use GET /filters for valid values |
limit | int | 5 | Max documents returned (max 10) |
offset | int | 0 | Pagination offset (per document, not per chunk) |
maxChunksPerDoc | int | 2 | Chunks per document (min 1, max 4). Up to maxChunksPerDoc chunks per document in vector/chunk_text tiers; doc_text returns one snippet per document |
maxDocsPerSource | int | 3 | Cap results from any single source (0 for unlimited, max 10) |
intent | string | docs | docs for precision, ideation for broader recall |
minSimilarity | float | 0.2 | Minimum cosine similarity (0–1). Lower for niche queries |
| Field | Type | Description |
|---|---|---|
results | object[] | Array of archive results (see below) |
filtersApplied | object | { sources?: string[] } |
searchTier | string | Which tier produced results: vector, chunk_text, or doc_text |
totalFound | int | Total matching documents |
totalMatched | int | Total matched before pagination |
hasMore | boolean | Whether more results are available |
results[]):
| Field | Type | Nullable | Description |
|---|---|---|---|
documentId | string (UUID) | Archive document identifier | |
title | string | Document title | |
author | string | yes | Document author |
source | string | Source key | |
url | string | yes | Document URL |
publishedAt | string | yes | ISO date string |
similarity | number | Cosine similarity score | |
snippet | string | Relevant excerpt from the document | |
chunkIndex | int | Chunk position within the document |
vector tier results. For chunk_text and doc_text tiers, prioritize snippet relevance over score magnitude.
Query tips:
- Keep to 3–6 focused keywords. Too short is vague; too long dilutes embedding similarity.
- If results are all pre-2010 for a modern query, re-query with ecosystem-specific terms.
- If empty, try conceptual synonyms (e.g.,
"prediction markets"→"futarchy").
GET /colosseum_copilot/archives/:documentId
Fetch a paged archive document slice.| Param | Type | Default | Description |
|---|---|---|---|
documentId | string (UUID) | - | Archive document identifier (required, path parameter) |
offset | int | 0 | Character offset to start from (min 0) |
maxChars | int | 8000 | Maximum characters to return (min 200, max 20000) |
offset + maxChars to page through long documents. Check hasMore and use nextOffset for the next page.
Response:
| Field | Type | Nullable | Description |
|---|---|---|---|
documentId | string (UUID) | Archive document identifier | |
title | string | Document title | |
author | string | yes | Document author |
source | string | Source key | |
url | string | yes | Document URL |
publishedAt | string | yes | ISO date string |
content | string | Document content slice | |
restricted | boolean | Whether content is truncated due to licensing | |
offset | int | Starting character offset of this slice | |
maxChars | int | Requested max characters | |
totalChars | int | Total document length in characters | |
nextOffset | int | yes | Offset for the next page (null if no more content) |
hasMore | boolean | Whether more content is available |
GET /colosseum_copilot/projects/by-slug/:slug
Fetch full project details by slug.| Field | Type | Nullable | Description |
|---|---|---|---|
slug | string | Project slug | |
name | string | Project name | |
description | string | yes | Full project description |
oneLiner | string | yes | Short project description |
hackathon | object | { name, slug, startDate } | |
tracks | object[] | [{ name, key }] | |
links | object | { github, demo, presentation, technicalDemo, twitter, colosseum } (all fields nullable) | |
team | object | { count, members[] } where each member has { displayName?, username?, githubHandle?, twitterHandle? } (all nullable) | |
isWinner | boolean | Whether the project won a prize | |
accelerator | object | yes | { companySlug?, companyName?, batchKey, batchName } (companySlug/companyName nullable) |
createdAt | string | ISO date string | |
tags | object | yes | { problemTags[], solutionTags[], primitives[], techStack[], targetUsers[] } |
cluster | object | yes | { key, label } |
metrics | object | yes | { likesCount, commentsCount, updatesCount } |
prize | object | yes | { type, name?, placement?, amount?, trackName? } (inner fields nullable) |
Cohort definition
The/analyze and /compare endpoints accept a shared cohort definition to scope which projects are included:
| Field | Type | Description |
|---|---|---|
hackathons | string[] | Filter by hackathon slugs |
trackKeys | string[] | Filter by track keys (format <hackathonSlug>/<trackSlug>) |
winnersOnly | boolean | Only prize-winning projects |
acceleratorOnly | boolean | Only accelerator portfolio companies |
acceleratorBatchKeys | string[] | Specific batches (format accelerator/<batchSlug>) |
prizePlacements | int[] | Prize placement ranks |
clusterKeys | string[] | Cluster keys (format v<N>-c<N>) |
{} includes all projects.
POST /colosseum_copilot/analyze
Summarize tag/track distributions for a cohort.| Param | Type | Default | Description |
|---|---|---|---|
cohort | object | - | Cohort definition (see above), required |
dimensions | string[] | - | Dimensions to analyze: tracks, problemTags, solutionTags, primitives, techStack, targetUsers, clusters |
topK | int | 10 | Max buckets per dimension (1–20) |
samplePerBucket | int | 2 | Sample project slugs per bucket (0–5) |
| Field | Type | Description |
|---|---|---|
totals | object | { projects, winners } (counts for the cohort) |
buckets | object | Keyed by dimension name, each an array of { key, label, count, share, sampleProjectSlugs[] } |
POST /colosseum_copilot/compare
Compare two cohorts across the same dimensions.| Param | Type | Default | Description |
|---|---|---|---|
cohortA | object | - | First cohort definition (see above), required |
cohortB | object | - | Second cohort definition (see above), required |
dimensions | string[] | - | Dimensions to compare: tracks, problemTags, solutionTags, primitives, techStack, targetUsers, clusters |
topK | int | 10 | Max items per dimension (1–20) |
| Field | Type | Description |
|---|---|---|
totalsA | object | { projects, winners } (counts for cohort A) |
totalsB | object | { projects, winners } (counts for cohort B) |
results | object | Keyed by dimension name, each an array of comparison items |
| Field | Type | Description |
|---|---|---|
key | string | Dimension value key |
label | string | Human-readable label |
countA | int | Count in cohort A |
shareA | number | Share in cohort A (0–1) |
countB | int | Count in cohort B |
shareB | number | Share in cohort B (0–1) |
lift | number | Relative difference (shareA / shareB) |
delta | number | Absolute difference (shareA − shareB) |
examplesA | string[] | Sample project slugs from cohort A |
examplesB | string[] | Sample project slugs from cohort B |
GET /colosseum_copilot/clusters/:key
Fetch cluster details.| Field | Type | Description |
|---|---|---|
key | string | Cluster key (format v<N>-c<N>) |
label | string | Cluster label |
summary | string | LLM-generated cluster description |
projectCount | int | Total projects in cluster |
winnerCount | int | Prize-winning projects in cluster |
representativeProjects | object[] | [{ slug, name, oneLiner, isWinner }] |
topTags | object | { problemTags: [{ tag, count }], primitives: [{ tag, count }], techStack: [{ tag, count }] } |
POST /colosseum_copilot/source-suggestions
Suggest a new source for the archive corpus.| Param | Type | Required | Description |
|---|---|---|---|
url | string | Yes | URL of the source to suggest (must be a valid URL) |
name | string | No | Name or title of the source (max 200 chars) |
reason | string | No | Why this source would be valuable (max 500 chars) |
201 Created
Error handling
All errors return:| Status | Code | Retryable | Meaning |
|---|---|---|---|
| 400 | INVALID_QUERY | No | Bad params or unknown fields |
| 401 | UNAUTHORIZED | No | Missing or invalid PAT |
| 403 | FORBIDDEN | No | Access denied for this resource |
| 404 | NOT_FOUND | No | Resource not found |
| 429 | RATE_LIMITED | Yes | Rate or concurrency limit exceeded |
| 500 | SERVICE_UNAVAILABLE | Yes | Unexpected server error |
| 503 | SERVICE_UNAVAILABLE | Yes | Redis or infrastructure unavailable |
429: check the Retry-After header for seconds to wait.