Skip to main content
All endpoints are prefixed with your COLOSSEUM_COPILOT_API_BASE (default: https://copilot.colosseum.com/api/v1). All requests require a Bearer token:
-H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT"

Rate limits

All limits are per-user (keyed by your Colosseum account). Exceeding a limit returns 429 with a Retry-After header.
CategoryLimitApplies to
Search30 req/min/search/projects, /search/archives
Analysis10 req/min/analyze, /compare
Concurrency2 in-flightAll data endpoints
Source suggestions5 req/hr/source-suggestions
When rate limited (429), honor the 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 get startDate values for chronology-sensitive answers.
curl "$COLOSSEUM_COPILOT_API_BASE/filters" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT"
Response includes:
  • tracks[]: { key, name, hackathonSlug, projectCount }
  • hackathons[]: { slug, name, startDate, projectCount, winnerCount } — ordered chronologically (oldest first)
  • acceleratorBatches[]: { key, name, companyCount }
  • prizeTypes[]: prize category names
  • prizePlacements[]: placement ranks
  • problemTags[]: { 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 format v<N>-c<N>)
  • archiveSources[]: { key, label, documentCount? } (documentCount is optional)

POST /colosseum_copilot/search/projects

Primary similarity search for hackathon projects.
curl -X POST "$COLOSSEUM_COPILOT_API_BASE/search/projects" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "privacy wallet for stablecoin users",
    "limit": 10,
    "filters": {
      "winnersOnly": false,
      "acceleratorOnly": false
    }
  }'
Recommended defaults: limit 8–12, includeFacets false. Request parameters:
ParamTypeDefaultDescription
querystring""Natural language query (optional, max 500 chars; omit for filter-only browsing)
hackathonsstring[]-Filter by hackathon slugs, max 10 (e.g., ["cypherpunk", "breakout"])
trackKeysstring[]-Filter by track keys, max 10 (format <hackathonSlug>/<trackSlug>)
limitint10Max results to return (max 25)
offsetint0Pagination offset (applied after ranking)
diversifybooleantrueCross-hackathon diversity ranking. Set false for narrow deep-dives
includeFacetsbooleanfalseEnable facet computation (adds overhead)
includeDiagnosticsbooleanfalseInclude search diagnostics in response
Filter parameters (filters object):
ParamTypeDescription
winnersOnlybooleanOnly prize-winning projects
acceleratorOnlybooleanOnly accelerator portfolio companies
acceleratorBatchKeysstring[]Specific batches, max 10 (format accelerator/<batchSlug>)
prizePlacementsint[]Prize placement ranks
prizeTypesstring[]Prize categories, max 10
isUniversityProjectbooleanUniversity-affiliated projects
isSolanaMobilebooleanSolana Mobile projects
techStackstring[]Tech stack tags, max 10
primitivesstring[]Primitive/protocol tags, max 10
problemTagsstring[]Problem domain tags, max 10
solutionTagsstring[]Solution approach tags, max 10
targetUsersstring[]Target user segments, max 10
clusterKeysstring[]Cluster keys, max 10 (format v<N>-c<N>)
Discover valid filter values via GET /filters. Facet parameters:
ParamTypeDefaultDescription
facetsstring[]-Dimensions: hackathons, tracks, prizes, problemTags, solutionTags, primitives, techStack, clusters. If omitted and includeFacets=true, all dimensions are computed
facetTopKint8Max buckets per dimension (1–20)
Response:
FieldTypeDescription
resultsobject[]Array of project results (see below)
filtersAppliedobject{ hackathons?: string[], trackKeys?: string[], filters?: object }
totalFoundintTotal matching projects
hasMorebooleanWhether more results are available
facetsobject?Facet buckets by dimension (only present when includeFacets=true)
diagnosticsobject?Search diagnostics (only present when includeDiagnostics=true)
Result object (results[]):
FieldTypeNullableDescription
slugstringProject slug
namestringProject name
oneLinerstringyesShort project description
similaritynumberMatch score
hackathonobject{ name, slug, startDate }
tracksobject[][{ name, key }]
linksobject{ github, demo, presentation, technicalDemo, twitter, colosseum } (all fields nullable)
evidencestring[]Short snippets showing why this matched (max 2)
prizeobjectyes{ type, name?, placement?, amount?, trackName? } (inner fields nullable)
metricsobject{ likesCount, commentsCount, updatesCount }
teamobject{ count }
crowdednessintyesCluster size as a crowdedness proxy
tagsobjectyes{ problemTags[], solutionTags[], primitives[], techStack[], targetUsers[] }
clusterobjectyes{ key, label }
acceleratorobjectyes{ companySlug?, companyName?, batchKey, batchName } (companySlug/companyName nullable)
Facet bucket shape: { key, label, count, sampleProjectSlugs[] } Diagnostics object (when includeDiagnostics=true):
FieldTypeDescription
modeUsedstringvector, text, hybrid, or filters
fallbackUsedbooleanWhether a fallback search tier was used
fallbackReasonstring?Reason for fallback (if applicable)
vectorCandidatesintCandidates from vector search
textCandidatesintCandidates from text search
tagCandidatesintCandidates from semantic tag search
diversityDroppedintResults removed by diversity filter
totalFoundIsEstimatebooleanWhether totalFound is an estimate
effectiveFiltersobjectFilters actually applied after resolution
queryExpandedstringQuery after synonym expansion
Score interpretation: Scores reflect hybrid RRF fusion across vector, text, and semantic tag channels. Use relative ranking within a result set rather than absolute thresholds.

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.
curl -X POST "$COLOSSEUM_COPILOT_API_BASE/search/archives" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "prediction markets governance",
    "limit": 5,
    "maxChunksPerDoc": 2
  }'
Recommended defaults: limit 4–6, maxChunksPerDoc 2, minSimilarity 0.2. Request parameters:
ParamTypeDefaultDescription
querystring-Search query, required (min 1, max 500 chars). 3–6 focused keywords recommended
sourcesstring[]-Filter by source keys, max 20. Use GET /filters for valid values
limitint5Max documents returned (max 10)
offsetint0Pagination offset (per document, not per chunk)
maxChunksPerDocint2Chunks per document (min 1, max 4). Up to maxChunksPerDoc chunks per document in vector/chunk_text tiers; doc_text returns one snippet per document
maxDocsPerSourceint3Cap results from any single source (0 for unlimited, max 10)
intentstringdocsdocs for precision, ideation for broader recall
minSimilarityfloat0.2Minimum cosine similarity (0–1). Lower for niche queries
Response:
FieldTypeDescription
resultsobject[]Array of archive results (see below)
filtersAppliedobject{ sources?: string[] }
searchTierstringWhich tier produced results: vector, chunk_text, or doc_text
totalFoundintTotal matching documents
totalMatchedintTotal matched before pagination
hasMorebooleanWhether more results are available
Result object (results[]):
FieldTypeNullableDescription
documentIdstring (UUID)Archive document identifier
titlestringDocument title
authorstringyesDocument author
sourcestringSource key
urlstringyesDocument URL
publishedAtstringyesISO date string
similaritynumberCosine similarity score
snippetstringRelevant excerpt from the document
chunkIndexintChunk position within the document
Score interpretation: Similarity above 0.4 is a strong topical match. 0.2–0.4 is worth reading but verify relevance. Below 0.2 is usually tangential. These thresholds apply to 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.
curl "$COLOSSEUM_COPILOT_API_BASE/archives/DOCUMENT_UUID?offset=0&maxChars=8000" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT"
Parameters:
ParamTypeDefaultDescription
documentIdstring (UUID)-Archive document identifier (required, path parameter)
offsetint0Character offset to start from (min 0)
maxCharsint8000Maximum characters to return (min 200, max 20000)
Use offset + maxChars to page through long documents. Check hasMore and use nextOffset for the next page. Response:
FieldTypeNullableDescription
documentIdstring (UUID)Archive document identifier
titlestringDocument title
authorstringyesDocument author
sourcestringSource key
urlstringyesDocument URL
publishedAtstringyesISO date string
contentstringDocument content slice
restrictedbooleanWhether content is truncated due to licensing
offsetintStarting character offset of this slice
maxCharsintRequested max characters
totalCharsintTotal document length in characters
nextOffsetintyesOffset for the next page (null if no more content)
hasMorebooleanWhether more content is available

GET /colosseum_copilot/projects/by-slug/:slug

Fetch full project details by slug.
curl "$COLOSSEUM_COPILOT_API_BASE/projects/by-slug/your-project-slug" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT"
Use for 1–2 top results when evidence from search results is insufficient. Response:
FieldTypeNullableDescription
slugstringProject slug
namestringProject name
descriptionstringyesFull project description
oneLinerstringyesShort project description
hackathonobject{ name, slug, startDate }
tracksobject[][{ name, key }]
linksobject{ github, demo, presentation, technicalDemo, twitter, colosseum } (all fields nullable)
teamobject{ count, members[] } where each member has { displayName?, username?, githubHandle?, twitterHandle? } (all nullable)
isWinnerbooleanWhether the project won a prize
acceleratorobjectyes{ companySlug?, companyName?, batchKey, batchName } (companySlug/companyName nullable)
createdAtstringISO date string
tagsobjectyes{ problemTags[], solutionTags[], primitives[], techStack[], targetUsers[] }
clusterobjectyes{ key, label }
metricsobjectyes{ likesCount, commentsCount, updatesCount }
prizeobjectyes{ 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:
FieldTypeDescription
hackathonsstring[]Filter by hackathon slugs
trackKeysstring[]Filter by track keys (format <hackathonSlug>/<trackSlug>)
winnersOnlybooleanOnly prize-winning projects
acceleratorOnlybooleanOnly accelerator portfolio companies
acceleratorBatchKeysstring[]Specific batches (format accelerator/<batchSlug>)
prizePlacementsint[]Prize placement ranks
clusterKeysstring[]Cluster keys (format v<N>-c<N>)
All fields are optional. An empty cohort {} includes all projects.

POST /colosseum_copilot/analyze

Summarize tag/track distributions for a cohort.
curl -X POST "$COLOSSEUM_COPILOT_API_BASE/analyze" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "cohort": { "hackathons": ["breakout", "radar"], "winnersOnly": true },
    "dimensions": ["tracks", "problemTags"],
    "topK": 5,
    "samplePerBucket": 1
  }'
Request parameters:
ParamTypeDefaultDescription
cohortobject-Cohort definition (see above), required
dimensionsstring[]-Dimensions to analyze: tracks, problemTags, solutionTags, primitives, techStack, targetUsers, clusters
topKint10Max buckets per dimension (1–20)
samplePerBucketint2Sample project slugs per bucket (0–5)
Response:
FieldTypeDescription
totalsobject{ projects, winners } (counts for the cohort)
bucketsobjectKeyed by dimension name, each an array of { key, label, count, share, sampleProjectSlugs[] }

POST /colosseum_copilot/compare

Compare two cohorts across the same dimensions.
curl -X POST "$COLOSSEUM_COPILOT_API_BASE/compare" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "cohortA": { "hackathons": ["breakout"], "winnersOnly": true },
    "cohortB": { "hackathons": ["breakout"], "winnersOnly": false },
    "dimensions": ["tracks", "problemTags"],
    "topK": 5
  }'
Request parameters:
ParamTypeDefaultDescription
cohortAobject-First cohort definition (see above), required
cohortBobject-Second cohort definition (see above), required
dimensionsstring[]-Dimensions to compare: tracks, problemTags, solutionTags, primitives, techStack, targetUsers, clusters
topKint10Max items per dimension (1–20)
Response:
FieldTypeDescription
totalsAobject{ projects, winners } (counts for cohort A)
totalsBobject{ projects, winners } (counts for cohort B)
resultsobjectKeyed by dimension name, each an array of comparison items
Comparison item shape:
FieldTypeDescription
keystringDimension value key
labelstringHuman-readable label
countAintCount in cohort A
shareAnumberShare in cohort A (0–1)
countBintCount in cohort B
shareBnumberShare in cohort B (0–1)
liftnumberRelative difference (shareA / shareB)
deltanumberAbsolute difference (shareA − shareB)
examplesAstring[]Sample project slugs from cohort A
examplesBstring[]Sample project slugs from cohort B

GET /colosseum_copilot/clusters/:key

Fetch cluster details.
curl "$COLOSSEUM_COPILOT_API_BASE/clusters/v1-c12" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT"
Response:
FieldTypeDescription
keystringCluster key (format v<N>-c<N>)
labelstringCluster label
summarystringLLM-generated cluster description
projectCountintTotal projects in cluster
winnerCountintPrize-winning projects in cluster
representativeProjectsobject[][{ slug, name, oneLiner, isWinner }]
topTagsobject{ problemTags: [{ tag, count }], primitives: [{ tag, count }], techStack: [{ tag, count }] }

POST /colosseum_copilot/source-suggestions

Suggest a new source for the archive corpus.
curl -X POST "$COLOSSEUM_COPILOT_API_BASE/source-suggestions" \
  -H "Authorization: Bearer $COLOSSEUM_COPILOT_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/solana-mev-research",
    "name": "MEV Research Blog",
    "reason": "Great technical analysis of Solana MEV strategies"
  }'
Parameters:
ParamTypeRequiredDescription
urlstringYesURL of the source to suggest (must be a valid URL)
namestringNoName or title of the source (max 200 chars)
reasonstringNoWhy this source would be valuable (max 500 chars)
Response: 201 Created
{ "id": "<uuid>", "message": "Thanks! We'll review your suggestion." }
Every submission is reviewed by the team. Approved sources are added to the archive pipeline.

Error handling

All errors return:
{ "error": "<message>", "code": "<ERROR_CODE>", "retryable": <boolean> }
StatusCodeRetryableMeaning
400INVALID_QUERYNoBad params or unknown fields
401UNAUTHORIZEDNoMissing or invalid PAT
403FORBIDDENNoAccess denied for this resource
404NOT_FOUNDNoResource not found
429RATE_LIMITEDYesRate or concurrency limit exceeded
500SERVICE_UNAVAILABLEYesUnexpected server error
503SERVICE_UNAVAILABLEYesRedis or infrastructure unavailable
For 429: check the Retry-After header for seconds to wait.