Back to Scout
API Reference

Public endpoints

Every endpoint Scout calls is public, read-only, no auth, edge- cached (5 minutes for ecosystem data, 24 hours for the SDF skill proxy). Hit them from your agent, your dashboard, your Dune query, or anywhere else.

GET/api/status

Service health + endpoint enumeration

Returns
  • ·Service status

Self-describe / health endpoint — service ok + versions, per-source freshness and counts (`sources[]`), recent usage, and an enumeration of every /api/* endpoint. Cheap, no params. Use to check how fresh/large the data is or to discover endpoints. Not for the data itself → call the matching search operation.

GET/api/quality

Stellar Light's OWN data-quality self-report — this source's known limitations, per-surface health, guard state

Returns
  • ·The quality self-report

Scout / Stellar Light's SELF-REPORT, for calibrating how much to rely on THIS service's answers — not a general trust, health, or quality tool. knownLimitations is DERIVED from our measurements and says what to do INSTEAD — read it first. gapMatrix names what THIS directory is missing WHERE, with real slugs; missFunnel replays this service's open recall findings to say at which STAGE each dies. Also: per-surface open findings, the row-score definition, status-basis mix, repo coverage, every guard with its promise and whether it holds, and the trend. Counts carry denominators. No parameters.

GET/api/verify

Verify a claim (audited / live / maintained / issued) against indexed evidence — verdict + evidence + confidence

Query params
NameTypeDescription
claimstringNatural-language audit claim in the closed grammar: 'is <project> audited', 'was <project> audited by <firm>'. Anything else 400s with the supported forms — refusal over guessing.
typeaudited | live | maintained | issuedStructured alternative to claim.
subjectstringProject name, slug, alias, or former name (required with type=).
auditorstringRestrict to reports by this firm (case/spacing-insensitive substring). A filtered miss names who DID audit in auditorsOnRecord.
sincestringOnly reports with engagement/publication on or after this date (YYYY-MM or YYYY-MM-DD).
Returns
  • ·Verdict with evidence (also served for unresolved subjects)

Claim in → verdict out, dated evidence attached. Types: audited (audit registry), live (the status record + provenance tier — Pre-Release CONTRADICTS a live claim, source attached), maintained (indexed code activity + curated knowledgeNotes), issued ('is EURC issued by Circle' — the stablecoin registry; a multi-issuer ticker names EVERY issuer, so attribution is checkable, never conflated). Verdicts assert OUR corpus, never the world: supported / contradicted / unsupported (statement carries the denominator) / unresolved. Answers carry the full subject card.

GET/api/projects/resolve

Resolve a historical project name to what it is now

Query params
NameTypeDescription
qstringThe name, slug, or stellarlight project URL encountered. Matched against slugs, then aliases, then normalized names.
Returns
  • ·Resolution, including an explicit miss

Reconciles a name found in an old post, changelog, README or repo against the current directory: returns the record it names, where to look NOW if that record was superseded, and the evidence behind any inactive status. **Use when:** you hit a project name that matches nothing current and need to know whether it was renamed, replaced, or is simply untracked. **Not for:** searching for projects by topic (→ searchProjects). A miss means NOT TRACKED HERE — never that the name never existed, never that it is defunct.

GET/api/changes

Change feed: which rows moved since a given time

Query params
NameTypeDescription
sincestringISO date (YYYY-MM-DD) or datetime; rows with changes strictly after this instant are returned. 400 on malformed, pre-2020, or future values.
surfacesstringCSV subset of projects,repos,partners (default all three).
limitintegerMax rows PER SURFACE, newest-first (1–500, default 100). meta.truncated.<surface> signals more.
Returns
  • ·Changed rows, newest-first per surface

Reconciliation feed for consumers holding cached or remembered claims (agent memory, institutional cache): every project/repo/partner row whose data changed after `since`, newest-first per surface, with `facets` naming which dated fact families moved (status, scf-awards, code-facts, toml; ["row"] = undated change, re-read the row). **Use when:** you stored our answers earlier and want to refresh only what moved. **Not for:** what the change WAS (re-read the row via its search endpoint) or contract/API changes (→ /api/changelog). Absence = unchanged since `since`, never an existence claim.

GET/api/changelog

Recent changes to the API, MCP tools, and client

Query params
NameTypeDescription
sincestringOnly entries on/after this ISO date (YYYY-MM-DD).
limitintegerMax entries to return, latest-first (1–100).
Returns
  • ·Changelog feed (latest-first)

A curated, latest-first feed of contract-affecting changes — new/removed endpoints & tools, param/enum changes, description rewrites. Point an agent here to see what changed lately without reading git history. **Use when:** you cached the API surface earlier and want to know what moved before relying on it, or you're debugging a field/param that changed. **Not for:** the actual ecosystem data → use the relevant search endpoint; current health / source freshness / version → use /api/status.

GET/api/projects/search

Search Stellar projects — look up a project by name, or find prior art / competitors

Query params
NameTypeDescription
qstringKeyword query (free text)
categoryInfrastructure | Tooling | User-Facing App | Asset | Protocol/Contract | Anchor | Partner IntegrationFilter by category
typeWallet | DEX | Lending | Bridge | Infrastructure | Payments | Anchor | SDK | Indexer | Explorer | Analytics | AI | Gaming | Education | Security | NFT | RWA | Stablecoin | Social Impact | RPC | Faucet | Card Issuing | Exchange | Oracle | YieldFilter to projects whose `types[]` includes this product type — server-side exact membership, e.g. `type=Wallet` enumerates Wallet-typed records (combine with `q` and/or `status` to scope further, or use alone to list a type). Distinct from `category` (a project has ONE category but can carry several types). Unknown values return 400 with validTypes.
scfAwardedbooleanFilter to SCF-funded projects only
statusDevelopment | Pre-Release | Live | InactiveFilter by lifecycle status (e.g. status=Inactive lists retired/defunct projects; status=Live restricts to operating ones). Compose with scfAwarded for accountability/diligence — `?scfAwarded=1&status=Inactive` is the roster of SCF-funded projects that have since gone inactive, and `meta.counts.total` is how many. Unknown values return 400 with validStatuses.
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
offsetintegerNumber of matching rows to skip before returning (pagination). Page until offset + meta.counts.returned >= meta.counts.total.
fieldsstringComma-separated top-level field names to return per row (e.g. fields=name,slug,tvlUSD), shrinking the payload. Case-insensitive. Each row's identity keys (id/slug/fullName/githubUsername/url/source, where present) are always included; unknown names are ignored, not rejected. Applies only to the rows array — meta is unaffected. Nested objects are selected whole (no dot-paths).
viewfull | compactRow shape. `full` (the default) returns every row field, unchanged. `compact` is for callers whose tool output is capped: each row is rebuilt from a fixed key list (identity, rank and score, and the fields that answer the usual question), and list fields left out come back as counts. A default projects/search page for q=lending measured 87,157 characters full and 23,091 compact (2026-10-23). Every compact row carries the same keys, null where there is no value; a field missing from a compact row was left out, not found empty. `meta.view` (first in meta) says the page is compact and where the left-out detail is read: repeat the request without view, or without view and with fields=<names>. The key lists are in the CompactView schema. Cannot be combined with fields (400). Any other value answers 400 with validValues.
Returns
  • ·Project search results

Search the curated directory of Stellar projects/products — what has been BUILT, by whom, with SCF funding, lifecycle status, `builtBy`, links, indexed repos, and verified on-chain metrics (`onchain`) inline. THE way to LOOK UP a specific project by its name (a named protocol/app/wallet/tool) AND to discover 'who/what already exists for X'; the `type` filter gives exact product-type rosters (Wallet, DEX, Oracle, Lending, Payments, Stablecoin, RWA…). Not for docs, standards, or how-to/reference knowledge → use searchResearch.

GET/api/repos/search

Search the Stellar GitHub repo / code-reference index

Query params
NameTypeDescription
qstringKeyword query (free text)
languagestringFilter by primary language (case-insensitive substring, e.g. 'Rust', 'TypeScript')
minScoreintegerOnly return repos with repoScore ≥ this (0–100). Use 40+ for high-signal references.
activityactive | maintained | dormant | archived | unknownFilter by observable activity state (each row also carries it as activityState). 'archived' is the owner's own verdict; 'dormant' means a KNOWN commit older than 180 days — an observation, not a death verdict; 'unknown' means no commit date held. Unknown values return 400 with the valid list.
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
offsetintegerNumber of matching rows to skip before returning (pagination). Page until offset + meta.counts.returned >= meta.counts.total.
fieldsstringComma-separated top-level field names to return per row (e.g. fields=name,slug,tvlUSD), shrinking the payload. Case-insensitive. Each row's identity keys (id/slug/fullName/githubUsername/url/source, where present) are always included; unknown names are ignored, not rejected. Applies only to the rows array — meta is unaffected. Nested objects are selected whole (no dot-paths).
viewfull | compactRow shape. `full` (the default) returns every row field, unchanged. `compact` is for callers whose tool output is capped: each row is rebuilt from a fixed key list (identity, rank and score, and the fields that answer the usual question), and list fields left out come back as counts. A default projects/search page for q=lending measured 87,157 characters full and 23,091 compact (2026-10-23). Every compact row carries the same keys, null where there is no value; a field missing from a compact row was left out, not found empty. `meta.view` (first in meta) says the page is compact and where the left-out detail is read: repeat the request without view, or without view and with fields=<names>. The key lists are in the CompactView schema. Cannot be combined with fields (400). Any other value answers 400 with validValues.
Returns
  • ·Repo search results graded by repoScore

Search the indexed Stellar ecosystem GitHub code repos — actual source graded by repoScore (0-100: freshness + traction + ecosystem authority), filterable by `language`/`minScore`. Use for 'show me the code/repos for X' or 'find a Rust/Soroban implementation of X' — prior-art source to read, fork, or cite. Not for products/companies and their funding/status → use searchProjects.

GET/api/repos/explain

Deep code answer about a Stellar repo (routing × DeepWiki)

Query params
NameTypeDescription
qstringThe deep code question (e.g. 'where are transaction result codes defined').
repostringOptional owner/name to pin the repo (e.g. stellar/stellar-core). Omit to auto-route.
Returns
  • ·Routed repo + DeepWiki-grounded answer

Source-grounded ANSWER to a deep code question about a Stellar internal or any indexed ecosystem repo — 'how does X implement/calculate Y in its code'. Routes the question to the authoritative repo (stellar-core, Horizon/go, RPC, SDKs, SEP reference impls) or the graded repo index, then DeepWiki answers from that repo's source files. Degrades to the routed repo + deepWikiUrl when DeepWiki is unavailable. Not for discovering which repos/projects exist → use searchRepos.

GET/api/hackathons

List Stellar hackathons

Query params
NameTypeDescription
statusupcoming | active | completedFilter by event status
organizerstringFilter by organizer slug
qstringFree-text name lookup — matches event name/title and organizer (case-insensitive substring). Resolves a NAMED event without paging the catalog (e.g. q=blend, q=agents).
sourcecurated | dorahacksRestrict to one feed (curated vs DoraHacks)
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
Returns
  • ·Hackathon list

Browse/LIST Stellar hackathon events — a merged, de-duplicated curated + live DoraHacks feed (dates, status, organizer, prize pools), sorted upcoming→active→completed then newest-first. The entry point for event slugs; zero-result forward-looking queries return `meta.fallbackChannels` (surface them, don't dead-end). Not for one event's winners/submissions/tracks → use getHackathon.

GET/api/hackathons/{slug}

Get one hackathon's full detail

Query params
NameTypeDescription
slugstringHackathon slug
Returns
  • ·Hackathon detail

Full detail for ONE hackathon by slug: every submission with placement, prize and track; `winners`, per-track aggregates and a `stats` funnel. DoraHacks events serve the stored copy: the event page, `rules` (submission requirements, and judging criteria where the organizer published them) and a `profile` of the submissions (categories, libraries, activity after the event, what they became). Needs an exact slug; resolve via getHackathons first. Not for listing events → use getHackathons.

GET/api/hackathons/compare

Compare 2–5 hackathons side-by-side

Query params
NameTypeDescription
slugsarray2–5 hackathon slugs, comma-separated (?slugs=a,b)
Returns
  • ·Comparison rollup

Side-by-side comparison of 2–5 hackathons by slug: prize pool, submissions, winners, prize per winner and, for every event with stored submissions, a `profile` (top categories, Stellar packages, repo activity after the event) counted like analyzeHackathonSubmissions. `deltas.facetShifts` names the category and package shares that moved most between the events. Curated events add cohort durability. Unresolved slugs return source:'not-found'; resolve slugs via getHackathons. Ecosystem-wide totals → use analyzeEcosystem.

GET/api/hackathons/builds

Search what was BUILT at Stellar hackathons (prior-art over prototypes)

Query params
NameTypeDescription
qstringTopic to search build names, descriptions and the packages their repos declare (prior-art lookup). A build is listed when it covers half of q's words, or when its name holds one of them unless most of q's words occur as a whole word in no submission (text or declared packages). A word of four letters or more also matches inside a longer word. When any of q's words occurs as a whole word in no submission, meta.warnings names those words and says what the listed builds are, and says when a build whose name matched was held back (meta.counts.withheldByName). With no hackathon parameter, an event named in full in q (its title, in any case, accents and punctuation aside, or its slug, hyphens included, in any case) becomes the hackathon filter and leaves q (meta.inferredFilter). The rest of q is searched inside that event; a rest made only of words the search skips (stopwords and generic words such as app, token, crypto, money, stellar, github) and words that ask for the event's entries (winners, builds, projects, places, awards, rankings) lists the event as the filter alone does. When the rest matches none of the event's rows and none of them holds a description, meta.warnings says so. A name start several events share infers nothing; meta.warnings names those events. Any hackathon parameter turns this off: send hackathon= with no value to search the words as text in every event.
modekeyword | meaning | hybridHow q matches (default: hybrid). keyword: the query's words, stems and synonyms. meaning: vector similarity over each submission's name, summary and write-up, for ideas phrased differently from how teams described them. hybrid: both, blended. If search by meaning cannot run, keyword results are served and meta.warnings says so (meta.mode.served).
winnersOnly1 | true | yes | on | 0 | false | no | offSet to 1 for prize winners only: the winners DoraHacks assigned and those a page off DoraHacks names (getHackathon shows these with winnerSource), by words and by meaning alike. Accepts 1/true/yes/on (and 0/false/no/off for explicit off); any other value returns 400 with the accepted forms, never silently ignored.
hackathonstringOnly these events: up to 10, comma-separated, each an event's slug or its exact title, any case. An event getHackathons lists whose submissions are not stored matches nothing, and meta.warnings says so; a value that names no event getHackathons lists answers 400 with validHackathons, the slugs of every event with stored submissions. A submission can enter several events; under this filter each row is that event's own entry, with its own placement.
trackstringFilter by hackathon track (substring match).
categoryWallet | DEX | Lending | Bridge | Infrastructure | Payments | Anchor | SDK | Indexer | Explorer | Analytics | AI | Gaming | Education | Security | NFT | RWA | Stablecoin | Social Impact | RPC | Faucet | Card Issuing | Exchange | Oracle | YieldOnly submissions sorted into this directory project type. Submissions not categorized yet are left out, so the set is a floor.
packagestringOnly builds whose repo declares this Stellar package, exact name (passkey-kit, soroban-sdk, @x402/stellar). Builds whose repo was not read are left out, so the set is a floor, not everyone who used it.
limitintegerMax builds (default 20, max 100).
offsetintegerSkip this many matched builds (default 0). To read every match, page with limit and offset until offset + meta.counts.returned reaches meta.counts.matched; pages share one ranking.
Returns
  • ·Matching hackathon builds

Topic search across every stored Stellar hackathon submission ('buidl') on DoraHacks: the PROTOTYPE layer of prior art. Answers 'has anyone built X at a hackathon?' with each build's event, placement, repo/demo links, `project` (the directory project listing its exact repo) and `stack`. meta.stack counts the Stellar SDKs the matched repos declare: winnersOnly=1 = which SDKs winners use. Winners first among equals; in hybrid mode a reranker orders the top 50. Unit: submissions (counts.entries = event entries). Absence is a whitespace signal, not proof. For SHIPPED products → use searchProjects.

GET/api/hackathons/builds/{id}

One Stellar hackathon submission in full

Query params
NameTypeDescription
idstringThe submission id from searchHackathonBuilds (dorahacks-buidl-<n>, or curated-<event>-<name> for an event off DoraHacks such as HackMeridian) or the bare number from its dorahacks.io/buidl/<n> link.
Returns
  • ·The stored submission.

One stored Stellar hackathon submission in full: the write-up its team published (markdown, claims not proof), the DoraHacks summary, self-reported tags, the event (hackathon.slug opens getHackathon), placement and prize, links, `project` (the directory project listing its exact repo; absent = not checked, null = none), `stack` (the Stellar packages its repo declares) and when we read each. Pass the `id` from searchHackathonBuilds or hackathonBrief, or the number in any dorahacks.io/buidl link. For submissions on a topic → use searchHackathonBuilds.

GET/api/hackathons/analyze

Trends and counts across Stellar hackathon submissions, with lift

Query params
NameTypeDescription
facetcategory | package | library | activity | project | projectStatus | scf | placement | track | event | yearWhat to count (default category). category: directory project types. library: the Stellar libraries a repo builds on (renamed and sibling packages folded together). package: the exact packages a repo declares. activity: commits on the submitted repo 90+ days after the event, archived, or repo not found. project: became a directory project (a floor). projectStatus: that project's directory status today. scf: whether SCF funded it. placement: winner or not. track, event, year.
byevent | year | placement | trackSplit the counts: event (a trend, oldest event first), year, placement or track. Each group carries `field`, its size before q.
valuestringReport only this value (Payments, soroban-sdk), as a row even at zero. With by=event: the trend of one value. With facet=library a package name counts as the library it belongs to (soroban-sdk = Soroban Rust SDK). A value no stored submission carries adds a meta.warnings line naming the values seen: its 0 is a miss, not a measured count.
topintegerMost values to report per set (default 10, or 5 with by; max 30).
qstringTopic: count only the submissions that match it, the way searchHackathonBuilds matches, except that a declared package does not match here. A word only a declared package uses still counts as used when deciding whether most of q's words occur in no submission, which holds back builds matched by name alone. Empty = every submission.
modekeyword | meaning | hybridHow q matches (default: keyword). keyword: the query's words, stems and synonyms. meaning: vector similarity over each submission's name, summary and write-up, for ideas phrased differently from how teams described them. hybrid: both, blended. If search by meaning cannot run, keyword results are served and meta.warnings says so (meta.mode.served).
winnersOnly1 | true | yes | on | 0 | false | no | offSet to 1 for prize winners only: the winners DoraHacks assigned and those a page off DoraHacks names (getHackathon shows these with winnerSource), by words and by meaning alike. Accepts 1/true/yes/on (and 0/false/no/off for explicit off); any other value returns 400 with the accepted forms, never silently ignored.
hackathonstringOnly these events: up to 10, comma-separated, each an event's slug or its exact title, any case. An event getHackathons lists whose submissions are not stored matches nothing, and meta.warnings says so; a value that names no event getHackathons lists answers 400 with validHackathons, the slugs of every event with stored submissions. A submission can enter several events; under this filter each row is that event's own entry, with its own placement.
trackstringFilter by hackathon track (substring match).
categoryWallet | DEX | Lending | Bridge | Infrastructure | Payments | Anchor | SDK | Indexer | Explorer | Analytics | AI | Gaming | Education | Security | NFT | RWA | Stablecoin | Social Impact | RPC | Faucet | Card Issuing | Exchange | Oracle | YieldOnly submissions sorted into this directory project type. Submissions not categorized yet are left out, so the set is a floor.
packagestringOnly builds whose repo declares this Stellar package, exact name (passkey-kit, soroban-sdk, @x402/stellar). Builds whose repo was not read are left out, so the set is a floor, not everyone who used it.
Returns
  • ·The facet counted over the filtered submissions.

Counts over every stored Stellar hackathon submission, during and after its event. `facet`: category (project types), library or package (Stellar SDKs declared), activity (commits 90+ days after), project (became a directory project), projectStatus (its status today) and its grant funding, placement, event or year. `by=event` or `by=year` makes a trend; every answer compares winners with the rest (lift). Shares are over known values. Unit: event entries (a submission in two events counts twice). Same filters as searchHackathonBuilds; for the builds themselves → use searchHackathonBuilds.

GET/api/hackathons/review

Review a hackathon project from its GitHub or DoraHacks link

Query params
NameTypeDescription
linkstringThe submission's GitHub repo (owner/name or its URL) or its DoraHacks link or id. A repo submitted more than once resolves to its placed entry, then the newest.
Returns
  • ·The review.

Feedback on one Stellar hackathon submission from its GitHub repo or DoraHacks link, no sign-in: its stored facts (Stellar packages, category, repo activity after the event, the directory project it became with status and SCF funding), checks that each state a fact (ok null = could not be checked), the submissions closest in meaning, and the SCF pitch view over its summary (live round, funded peers, competitors, prior art). Evidence, not a verdict. For an idea with no link → use vetIdea or scfPitch.

GET/api/builders

Search Stellar builders

Query params
NameTypeDescription
qstringFree-text filter over bio / role / projects (accepts `skill`/`tech` as aliases)
locationstringFilter by location substring (e.g. 'Lagos', 'Brazil')
skillstringFilter by skill/tech mentioned in bio
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
offsetintegerNumber of matching rows to skip before returning (pagination). Page until offset + meta.counts.returned >= meta.counts.total.
fieldsstringComma-separated top-level field names to return per row (e.g. fields=name,slug,tvlUSD), shrinking the payload. Case-insensitive. Each row's identity keys (id/slug/fullName/githubUsername/url/source, where present) are always included; unknown names are ignored, not rejected. Applies only to the rows array — meta is unaffected. Nested objects are selected whole (no dot-paths).
Returns
  • ·Builder list

The Stellar PEOPLE directory — builder profiles synced from Stellar Passport (bio, role, location, shipped projects[]), searchable by `q`/`skill` and `location`. Use to find a person to recruit, hire, or collaborate with. Not for the company/product behind a project ('who built X') → use searchProjects. Profiles carry NO populated SCF-tier/award data.

GET/api/people

SDF team / people index

Query params
NameTypeDescription
qstringName / role / org text filter (e.g. 'justin rice', 'ecosystem', 'openai'). All tokens must match.
sectionstringRestrict to one roster section. Accepts 'Leadership', 'Board of directors', 'Advisors' (and aliases 'board'/'advisor').
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
offsetintegerNumber of matching rows to skip before returning (pagination). Page until offset + meta.counts.returned >= meta.counts.total.
Returns
  • ·SDF roster

The Stellar Development Foundation org/people index — leadership, board of directors, and advisors (name → role → org), quoted from stellar.org/foundation/team with provenance. Use for 'who is <person>', 'what is <person>'s role at SDF', 'who leads <area>', 'who's on the SDF board'. Distinct from getBuilders (GitHub-contributor profiles) — an SDF VP or board member is NOT a 'builder'. Not for doc/spec authorship → use searchResearch.

GET/api/partners

List ecosystem partners

Query params
NameTypeDescription
typeanchor | on-off-ramp | infrastructure | tooling | protocol | wallet | audit-firm | legal | agency | asset-issuer | otherFilter by partner type. on-off-ramp also takes anchors whose rampTypes record a ramp (most ramp providers are typed anchor); an anchor with no ramp recorded is left out and a meta.warnings line says so, so type=anchor is the full anchor list.
sectorstringFilter by sector served (defi, payments, rwa, stablecoins, …)
regionglobal | north-america | latam | europe | africa | mena | asia | oceaniaFilter by region served — a closed vocabulary of continents/blocs. Labels and case normalise ("North America" → north-america); values outside the vocabulary return 400 with `validRegions`. A country or currency is NOT a region: put it in q (e.g. ?q=nigeria) — coverage.countries is matched from query text.
rampsstringFilter by fiat-ramp capability: `on-ramp` (fiat → Stellar), `off-ramp` (Stellar → fiat), or `on-ramp,off-ramp` to require both. Unknown values return 400 with `validRamps`. Combine with `region`/`q` for corridor lookups (e.g. ramps=on-ramp&q=mexico).
accepting1 | 01 = only partners currently accepting new clients; 0 = only partners NOT accepting (an empty page here is the honest answer when every published partner accepts). Omit for no filter. `meta.filters.accepting` echoes the applied value, null when omitted.
all1Set to 1 to bypass the directory quality bar. By default results include only complete, non-archived profiles (tagline + a contact path), pilot partners first; all=1 returns every published partner including placeholder-thin profiles.
qstringKeyword query (free text)
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
fieldsstringComma-separated top-level field names to return per row (e.g. fields=name,slug,tvlUSD), shrinking the payload. Case-insensitive. Each row's identity keys (id/slug/fullName/githubUsername/url/source, where present) are always included; unknown names are ignored, not rejected. Applies only to the rows array — meta is unaffected. Nested objects are selected whole (no dot-paths).
Returns
  • ·Partner directory

Published Stellar ecosystem partner directory — service providers a builder hires or integrates: anchors, on and off ramps (fiat on-ramp/off-ramp providers), KYC, infrastructure, tooling, protocols, wallets, audit firms. Partner-claimed facts ride WITH system-verified signals + `freshness` (down-rank/skip `excludeFromMatching`). Filter by `type`/`sector`/`region`/`ramps`/`accepting`/`q`. Not for built products/projects → use searchProjects.

GET/api/partners/{slug}

Get one partner's full profile

Query params
NameTypeDescription
slugstringPartner slug
Returns
  • ·Partner profile

Full published profile for one partner by slug, including verified signals + freshness. 404 for unknown or unpublished slugs. **Use when:** you already know a partner's slug (from /api/partners) and need their full public profile — services, sectors, regions, docs, contact, freshness. **Not for:** discovering partners for a need → use /api/partners with ?type/?sector/?region/?q; a project/product rather than a service provider → use /api/projects/search.

POST/api/partners/match

AI-rank partners against a plain-language need

Returns
  • ·Ranked matches with reasons

Describe a builder need in plain language (e.g. 'I need a USDC off-ramp in Mexico with SEP-24') and get the published partners RANKED by fit, each with a one-line reason. Grounded: only real published partners are ranked — nothing is invented. Requires the service to have AI configured; returns 503 `unavailable:true` otherwise (fall back to GET /api/partners filters). **Use when:** an agent needs a scored shortlist for a concrete integration need. **Not for:** browsing the full directory → GET /api/partners; interactive human chat → the /partners/chat page (backed by /api/partners/assistant).

POST/api/partners/assistant

Conversational partner concierge (find OR get listed)

Returns
  • ·Assistant reply (+ matches when a need was searched)

Chat backend for /partners/chat. Send the running message history; intent-routed: a builder need returns real matched partners in `matches[]` (never hallucinated), a company describing itself gets interviewed (`canList:true` → offer profile extraction). Returns `{reply, matches?, intent, canList}`; 503 without AI. Not for one-shot programmatic ranking → use matchPartners.

POST/api/partners/onboard

AI onboarding helpers: interview chat + profile extraction

Returns
  • ·`{reply}` (chat mode) or `{fields}` (extract mode)

Two modes for the get-listed flow. `{mode:'chat', messages}` → interview-style reply for a company describing itself. `{mode:'extract', messages}` → structures the transcript into partner-profile `fields` (tagline, services, sectors, regions, contact…; null where nothing was stated — nothing invented). 503 `unavailable:true` without AI configured. **Use when:** turning a get-listed conversation into structured profile fields (then submit via POST /api/partners/submit-listing). **Not for:** finding partners → /api/partners/match or /assistant.

POST/api/partners/submit-listing

Submit a new-partner listing (or claim an existing one)

Returns
  • ·`{ok:true, mode:'draft'|'claim'}`

Submits a company for directory listing. New companies become a DRAFT partner account reviewed by the Stellar Light team before publication (publishing emails the contact an account invite). If the company is already listed, the submission is recorded as a CLAIM REQUEST on the existing profile instead — no duplicates. Returns `{ok:true, mode:'draft'|'claim'}`. Rate-limited; contactEmail becomes the account login. **Use when:** completing a get-listed flow (fields usually come from /api/partners/onboard extract). **Not for:** editing an existing claimed profile → the partner dashboard.

GET/api/rfps

List Stellar RFPs (SCF-funded sponsor briefs)

Query params
NameTypeDescription
statusopen | closed`open` = the brief is still soliciting build proposals. It is NOT a fundability claim: whether SCF accepts a submission today depends on meta.scfRound.submissionWindow and currentPhase. `closed` = a prior round, surfaced for context.
quarterstringFilter by quarter slug (e.g. 'q1-2026')
qstringKeyword query (free text)
categorystringFilter by RFP category (e.g. 'defi', 'payments', 'infrastructure'). An unrecognized value returns 400 with the valid category list.
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
offsetintegerNumber of matching rows to skip before returning (pagination). Page until offset + meta.counts.returned >= meta.counts.total.
Returns
  • ·RFP list

Curated Stellar RFPs / sponsor briefs (mirrors /ideas) — `open` means the sponsor brief is still soliciting; it does NOT prove the SCF proposal window accepts submissions today (check meta.scfRound.submissionWindow + currentPhase for that). Closed briefs are past rounds. Response carries open/closed counts, the activeQuarter, and the live SCF round + submission window (`meta.scfRound`). Answers 'what does the ecosystem want built' and where the paid work is: jobs, bounties, freelance briefs for Stellar contributors. Not for how-to-apply / SCF Handbook knowledge → use searchResearch.

GET/api/scf-pitch

SCF pitch prep — live round, funded peers, gap, prior art, angles in one call

Query params
NameTypeDescription
qstringShort idea description, 3-200 chars.
Returns
  • ·The pitch-prep report.

The 'help me prep a Stellar Community Fund pitch' composite: LIVE round state (open submissions + deadline, never asserting a negative on fetch failure), the vertical's already-funded ACTIVE projects with recorded award totals (differentiation targets), the vet-idea view (competitors, supply-side gap, prior art), and deterministic pitch angles that each name the fact they stand on. No prose generation. Unknown params 400.

GET/api/hackathon-brief

Hackathon brief — vet + starter repos with trust + live contracts + funding + what not to claim, in one call

Query params
NameTypeDescription
qstringShort idea description, 3-200 chars (e.g. 'confidential token payroll').
Returns
  • ·The hackathon brief.

One call for a hackathon team's first hour: vet (same as vet-idea: competitors, maturity, gap, judged prior art), builds (prototype-layer prior art, hybrid search), startFrom (top non-archived competitor repos with a trust SUMMARY; full contractInterface at fullReport), liveContracts (verified mainnet contracts for the idea's closest code domain; empty = no verified contract on record, never nothing on mainnet), funding (live SCF round + funded peers), whatNotToClaim (cautions derived from this brief's own facts). No verdicts; rails and RFPs not bundled. Unknown params 400.

GET/api/vet-idea

Vet a build idea — competitors, maturity, prior art, gap, funding in one call

Query params
NameTypeDescription
qstringShort idea description, 3-200 chars (e.g. 'lending protocol for RWAs').
Returns
  • ·The vet-idea report.

The 'I want to build X on Stellar' composite: competitor repos (full search stack) + active directory projects in the detected vertical, their maturity from verified evidence (audit registry, live on-chain usage), hackathon prior art from our index (dead prior art is a signal), the vertical's supply-side gap verdict (same computation as analyze?dimension=gaps), and SCF funding presence. Every block carries its basis; no verdict synthesis. vertical=null means the idea doesn't map onto the measurable vertical axis, not that no market exists. Unknown params 400.

GET/api/repos/trust

Trust report for one Stellar GitHub repo: maintained, audited, used on mainnet

Query params
NameTypeDescription
repostringowner/name, e.g. reflector-network/reflector-contract
Returns
  • ·The trust report.

One evidence-grounded answer to 'should I depend on this repo?': scanned code truth (proof, depth, domains, the FULL extracted contract interface), live on-chain usage, audit reports with drift since the latest one, succession both directions, and activity — joined server-side. `signals` is a closed deterministic vocabulary of facts that hold; no synthetic scores. Verify generated calls against codeTruth.contractInterface before invoking a contract. 404 for unindexed repos — absence is not nonexistence. Unknown params 400.

GET/api/contracts

Evidence-gated registry of verified mainnet Soroban contracts

Query params
NameTypeDescription
qstringSubstring over repo fullName, project slug/name, or contract id.
domaindefi-lending | defi-amm | defi-yield | oracle | payments-x402 | wallet-infra | anchor-ramp | indexerFilter by code-evidenced domain (closed set; unknown values 400).
limitinteger
offsetinteger
Returns
  • ·Verified contract rows, most-evidenced first.

Contracts as first-class entities: one row per mainnet contract with VERIFIED evidence — the scanner echo-checked a README-claimed contract id live on-chain, or weekly on-chain enrichment attributed real activity to the repo. Each row joins code truth (stellarProof, codeDepth, interface preview, codeDomains), live usage stats (codeInUse), per-project audit records, and succession. Absence here is NOT a claim a contract doesn't exist — coverage grows as scans reach repos. Most-evidenced first: live usage > verified id > depth. Unknown params 400.

GET/api/sources/locate

Locate where a flag, command, option default, function or interface is defined in Stellar's source

Query params
NameTypeDescription
qstringWhat to locate: a symbol, flag, option, config key, stellar-cli command or topic words (at most 300 characters), e.g. --enable-core-manual-close, getTransactions default limit or stellar contract invoke. A repo named in q (stellar-rpc, quickstart, OpenZeppelin) strongly lifts its pointers; a typed stellar-cli command lifts the module that implements it.
repostellar/stellar-core | stellar/rs-soroban-sdk | stellar/rs-soroban-env | stellar/js-stellar-sdk | stellar/stellar-rpc | stellar/quickstart | stellar/stellar-cli | stellar/soroban-examples | OpenZeppelin/stellar-contractsOnly this allowlisted repo, as owner/name (e.g. stellar/quickstart). Anything else answers 400 with the valid values.
kindfile | symbol | headingOnly this locator kind.
pageintegerPage of 10 pointers: a whole number from 1 to 2000 written as plain digits.
Returns
  • ·Ranked pointers. pointers [] with total 0 = searched, no match; pointers null = not indexed yet (meta.note says which).

Scored pointers into allowlisted repos (stellar-core, rs-soroban-sdk, rs-soroban-env, js-stellar-sdk, stellar-rpc, quickstart, stellar-cli, soroban-examples, OpenZeppelin/stellar-contracts): the file, symbol or heading, line, commit and blob sha where a CLI flag or command, config option default, SDK or host function, contract interface or trait implementation is defined, why it matched, and a pinned GitHub URL. Pointers, never file content: fetch verificationUrl to read. pointers [] = no match in the indexed repos; null = could not search.

GET/api/audits

Enumerable registry of Stellar security-audit reports

Query params
NameTypeDescription
projectstringDirectory project slug (exact), e.g. blend
auditorstringAuditor firm, case/homoglyph-insensitive exact match (e.g. OtterSec)
qstringSubstring match on title / protocol / project name
sincestringOnly reports published on/after this date (YYYY-MM-DD)
limitintegerMax rows (default 100, max 100)
offsetintegerPagination offset
Returns
  • ·Audit registry rows (meta.counts.total = corpus size; meta.counts.matched = after filters)

One row per security-audit report from stellarsecurityportal.com — the structured, enumerable half of the audit corpus (full report text is chunk-served by searchResearch with source=audit). Rows carry a normalized auditor, publication date, and a hand-verified link to the directory project (`projectSlug`). Semantics: a project ABSENT here has no audit on record at our source — NOT a claim it is unaudited; `findingsTotal`/`severityCounts` null = not extracted, NOT zero. Unknown query params are rejected with 400, never silently ignored.

GET/api/research

Vector search over the Stellar research corpus

Query params
NameTypeDescription
qstringNatural-language search query. Required unless the `query` alias is supplied — requests with neither return 400.
querystringAlias of `q` (agents commonly send the term under this name; both are accepted, `q` wins when both are present).
sourcesdf-blog | scf-handbook | sep | cap | dev-docs | paper | scf-proposal | lumenloop | lumenloop-research | repo-docs | audit | incident | security-program | sdf-org | ec-developer-report | releaseOptional source filter. A declared source that holds no documents yet answers an empty vector page with meta.sourceEmpty true and meta.sourceDocCount 0 (an empty source, not a miss); every source-scoped call carries meta.sourceDocCount. Use 'scf-proposal' for what an SCF project proposed in its own words (one document per submission on communityfund.stellar.org, every status: the proposal's sections plus round, status, award type and requested budget), 'scf-handbook' for the program's rules, 'audit' for security questions, 'incident' for exploit/post-mortem history, 'security-program' for bug-bounty / vulnerability-disclosure program status (which program is current, where to report), 'sdf-org' for SDF's canonical organizational pages (mandate, legal structure/terms, foundation, team, enterprise fund, quarterly-reports index), 'ec-developer-report' for ecosystem stats, 'paper' for foundational protocol questions, 'release' for stellar-core/CLI/SDK release notes (what shipped, when, protocol upgrade tags). Several sources in one call: see `sources` (a comma here is read the same way).
auditorstringAudit-metadata filter: exact auditor firm (case/homoglyph-insensitive, e.g. OtterSec, Certora). Using any audit-metadata filter scopes RETRIEVAL to source=audit (an explicit contradictory source= is rejected with 400). For report-level enumeration prefer listAudits.
protocolstringAudit-metadata filter: audited protocol/codebase name (substring match). Narrows results to audit-source chunks.
severitycritical | high | medium | low | informational | unknownAudit-metadata filter, case-insensitive. CAVEAT: severity labels the MATCHED CHUNK's section (inferred from PDF-derived headings), not the report or a specific finding — an architecture chunk can carry 'high' while the findings table reads 'unknown' — do not treat a filtered result set as a complete list of findings at that severity. Unknown values are rejected with a 400.
limitintegerMax results (default 8, max 25)
sourcesarraySeveral declared sources in one call, comma-separated (e.g. cap,sep,dev-docs); a comma in `source` is read the same way. Each source is searched exactly as `source=<one>&limit=<perSource>` would search it, and all rows come back in ONE ranking across sources: identifier-named documents first, then confidence, the rule each source already uses for its own rows. A reader that keeps only the first rows gets the best of every source, not the first sources named. Each row names its source. meta.bySource carries each source's status, returned count, matchMode, sourceDocCount and resultsHash. The rows are the single-source call's rows; scores can differ in the fourth decimal between any two calls that embed the query separately (two single-source calls on different instances do too), which can swap near-tied rows, so compare row ids across separate calls. A source that cannot be read is named in meta.warnings and bySource while the others answer; no source readable is a 503. Counts as one request against the rate limit. No sourceAdvisory on this form.
perSourceintegerRows per source when several sources are requested (default 8, max 25; `limit` is read when absent). With one source it is the same as `limit`.
fieldsstringComma-separated top-level field names to return per row (e.g. fields=name,slug,tvlUSD), shrinking the payload. Case-insensitive. Each row's identity keys (id/slug/fullName/githubUsername/url/source, where present) are always included; unknown names are ignored, not rejected. Applies only to the rows array — meta is unaffected. Nested objects are selected whole (no dot-paths).
Returns
  • ·Research results

Semantic search over the Stellar knowledge corpus — SDF blog, SCF Handbook, SEPs/standards, dev docs, papers, audits, incident reports. Returns cited text chunks with source, section, URL, confidence, and provenance dates (`publishedAt` = the source's own stated date; `observedAt` = when ingest last crawled the page; audits add auditor/severity — filterable; report-level enumeration → listAudits). THE surface for 'how does X work', 'what does the SEP/spec/audit say', and how-to/feasibility questions. Not for products and their funding/status → use searchProjects.

GET/api/skills

List AI skills for Stellar builders

Query params
NameTypeDescription
qstringFree-text filter over skill name, tagline, description and tags (all terms must match). Omit to list everything. Previously accepted and ignored — a query returned the full catalog.
sourcesdf | stellarlight | lumenloop | external | communityFilter by source
kindskill-md | mcp-server | sdk | cli | agent-kit | toolFilter by skill kind
Returns
  • ·Skills catalog

Catalog of installable Stellar AI skills/tools: both sections of SDF's skills.stellar.org registry (source=sdf for the SDF-authored set, source=community for Community Built entries, listed but not reviewed by SDF) merged with curated entries and approved submissions. Each entry carries `install`, `kind` (skill-md | mcp-server | sdk | cli | agent-kit | tool) and repo/docs links; filter by `source`/`kind`. meta.registry says what the registry listed, resolved and could not fetch. Answers 'what Stellar AI skills / MCP servers can I install'. Not for ONE named skill's full content → use getSkill.

GET/api/skills/{name}

Get one skill's full content

Query params
NameTypeDescription
namestringSkill slug (e.g. 'smart-contracts', 'stellar-scout', 'rozo-intent-pay')
Returns
  • ·Skill detail with content

Full detail for ONE skill by slug or display name — metadata plus, for entries listed on skills.stellar.org (SDF authored and community-built), the complete raw SKILL.md text (`.skill.content`, fetched live from where the registry links it). 404s with a hint to list /api/skills when unknown. Use when you know the skill and need its actual instructions or install command. Not for discovering which skills exist → use listSkills.

GET/api/clusters

Topic clusters with crowdedness scores

Query params
NameTypeDescription
dimensioncategory | typesCluster by category (coarse 7-cat) or types (finer)
minSizeintegerOnly include clusters with at least N projects
Returns
  • ·Cluster list

Groups the active Stellar project directory into topic clusters scored on crowdedness (1–10, log-scaled) — the market-map view of saturated vs underbuilt lanes, i.e. WHERE TO BUILD. Per cluster: size, SCF funding, hackathon winners, sample projects; `dimension=category|types`. Answers 'what's crowded / where is whitespace'. Not for looking up a named project → use searchProjects.

GET/api/analyze

Cross-event Stellar ecosystem analytics rollup

Query params
NameTypeDescription
dimensionall | hackathons | categories | funding | tvl | gaps | developers | toolchainWhich slice to return
Returns
  • ·Analytics rollup

The cross-ecosystem macro rollup — totals no single-event tool answers. Slice via `dimension=hackathons|categories|funding|tvl|gaps|developers|toolchain`: hackathon + SCF-funding totals, category distribution, DeFi TVL (dated), `gaps` (per-vertical whitespace — what should I build), `developers` (Electric Capital monthly-active devs + trend), and `toolchain` (Soroban-SDK version-status distribution + deprecated-toolchain roster + CI/test presence). gaps/developers/toolchain are SUPPLY/commit-side and as-of dated — never demand or a headcount.

GET/api/leaderboard

Stellar ecosystem developer activity

Query params
NameTypeDescription
sortactivity | stars | issues | tvl | supplyOrder the project leaderboard. An unrecognized value returns 400 with the valid list. sort=tvl orders by DefiLlama-verified tvlUSD; sort=supply orders by issued-asset circulating supply (assetSupply). For both, null = untracked → those rows sort last, never treated as 0.
range7d | 30d | 90d | 1y | allActivity time-window for the leaderboard. An unrecognized value returns 400.
categorystringFilter the leaderboard to one project category (e.g. 'Tooling', 'Infrastructure'). An unrecognized value returns 400 with the valid list.
typearrayFilter to one or more granular project types — the same `types[]` taxonomy on project-search rows and echoed on each leaderboard row. Repeatable (`?type=DEX&type=Lending`) and comma-separable (`?type=DEX,Lending`); membership is EITHER (a project typed DEX OR Lending is kept), so you can build an explicit DEX/Lending-style grouping. Exact whole-element match, NOT substring. Unknown values return 400 with validTypes. Applied at the DB layer before ranking and limiting; `meta.filters.type` echoes the applied scope.
formatjson | csvResponse format.
limitintegerMax results per page. The default and cap VARY by endpoint (e.g. projects/search 20/100, builders 50/200, leaderboard 50/300, research 8/25). A value below 1 or above the cap is clamped, not rejected.
Returns
  • ·Leaderboard + ecosystem stats

Ranked list of the top / most active Stellar projects by GitHub activity (`sort=activity|stars|issues|tvl` over a `range`; `category` filter; `format=csv`) with per-project GitHub rollups, plus an Electric Capital dev-count macro block. `meta.metricDefinitions` defines each served metric — activity = 90-day commit volume across Stellar-evidenced repos (github.commits90d; null = index gap, sorts last), ties by recency; issues = open backlog (not activity); tvl = DefiLlama-verified TVL (null = untracked, never zero). Ranks PROJECTS, not people → use getBuilders.

GET/api/feedback

Get the feedback request schema (discovery)

Returns
  • ·Feedback request schema

Returns the expected POST body shape + valid `kind` values, so an agent can self-discover how to submit feedback without guessing. No side effects. **Use when:** you're about to POST feedback and want the schema first — kind enum, required fields, size limits. **Not for:** actually submitting feedback → POST /api/feedback; browsing what's been reported → not exposed (curator queue is private).

POST/api/feedback

Submit feedback on Scout's output

Send a feedback report when the skill returns wrong / missing / misleading information. Lands in the curator queue. Rate-limited to 6/min/IP (IP hashed with PAYLOAD_SECRET, never stored raw). **Use when:** a Scout query returned something wrong / stale / empty that you believe SHOULD exist — file it so the corpus/endpoint gets fixed. **Not for:** discovering the schema first → GET /api/feedback; reading data (this is a write endpoint) → use the relevant search endpoint.

GET/api/rwa

Tokenized real-world assets verified on Stellar

Query params
NameTypeDescription
statelive | issued-single-holder | deployed-no-supply | not-foundFilter by product state. live = minted with at least two holders (someone other than the issuer holds it); issued-single-holder = minted, exactly one holder (the issuer or its custodian) and no secondary activity — a real security, not a live market; deployed-no-supply = nothing minted: a Soroban contract with zero supply and zero events, or a classic asset the issuer declares whose trustlines exist but whose supply is zero (Etherfuse CETESZ, Franklin FOCGX); not-found = a listing that no longer resolves on mainnet. live and issued-single-holder are decided by holder count (balance > 0): two or more, or exactly one.
leveltoml-bidirectional | entity-toml | contract-metadata | on-chain-home-domain | on-chain-onlyFilter by verificationLevel (see methodology).
kindclassic | sorobanclassic = a Stellar asset (code + issuer); soroban = a contract token (invisible to Horizon /assets).
projectstringDirectory project slug — the rows that feed that project's `products`.
limitintegerMax rows (default 100, max 100).
Returns
  • ·Verified RWA tokens, sorted by rwa.xyz USD value (rows without one last).

Every tokenized real-world asset rwa.xyz lists on Stellar (97 tokens, 52 issuers), each re-verified on-chain: classic assets from the issuer's own stellar.toml plus Horizon where the toml declares them (else on-chain-only), Soroban tokens from the contract's own metadata via RPC. state is live | issued-single-holder | deployed-no-supply | not-found; rows carry verificationLevel, evidenceUrl, verifiedAt, and pairedWith for a tranche deployed twice. Includes the fiat stablecoins rwa.xyz classes as RWA (productKind=stablecoin). Curated registry: absence means untracked, never 'not on Stellar'.

GET/api/stablecoins

Stellar stablecoins ranked by USD market cap

Query params
NameTypeDescription
sortmarketcap | supply | holders | volumeRanking order. marketcap (default, USD-comparable) | supply (raw peg units — comparable only within one peg) | holders | volume. Unrecognized values return 400.
pegstringFilter to one fiat peg (e.g. USD, EUR, JPY, ARS). Case-insensitive. Omit for all pegs.
limitintegerMax rows (default 50, max 100).
Returns
  • ·Ranked stablecoins

Every tracked Stellar stablecoin, ranked by USD market cap by default (sort=marketcap|supply|holders|volume; peg filter). Rows carry marketCapUSD (comparable), raw supply + its peg (NOT comparable across pegs — GYEN supply is yen, ARST is pesos), holders, price, full issuer account, and `basis` (live | curated-static | unmeasured) so an estimate is never mistaken for a live measurement. Measured every 6h from Horizon, Stellar Expert and live peg FX; null = not measured, never zero.

Source

All endpoints live in Stellar-Light/stellarlight. The skill manifest that documents them is in Stellar-Light/stellar-scout.