A API de contratos governamentais, com paridade total.
Every screen on Sell to State is backed by a documented REST endpoint under /api/v1. Search, drill into a buyer or supplier, export CSV, and keep saved lists — with one API key and the same paywall the MCP server and CLI share.
# Início rápido em 60 segundos
# 1. Create a key in the dashboard # Account → API keys # 2. Verify it curl -s https://app.selltostate.com/api/v1/whoami \ -H "x-api-key: sts_xxxxxxxx" # 3. Search curl -s "https://app.selltostate.com/api/v1/search\ ?scope=tenders&q=cybersecurity" \ -H "x-api-key: sts_xxxxxxxx"
Same key works for the MCP server and the selltostate CLI.
Autenticação e o paywall 402
Two credential types resolve to one entitlement check. Humans and backends send an API key as x-api-key: sts_…. Autonomous agents self-register over RFC 7591 DCR and present Authorization: Bearer client:<id>.
Until your subject has an active subscription, every data call returns 402 with a payment_link (humans) and a machine_payment affordance (agents can pay off-session via POST /api/v1/pay and continue without a browser). GET /api/v1/whoami is the exception — it returns 200 with active:false so you can decide to pay before doing work.
Plan caps: monthly and annual = 5,000 rows/page; the 3-day pass = 10,000 rows in total. Rate limit: 120 data calls/min per credential (faceted search has its own 300/min budget). Saved lists and saved searches are owner-scoped — they require a user x-api-key; an OIDC client token gets 403.
Endpoints.
All under /api/v1. Full params, schemas and "Try it" live in the reference.
/api/v1/whoami Autenticação + direito de acesso + escopos. Retorna 200 active:false (não 402) para uma chave válida mas sem assinatura — verifique antes de gastar. /api/v1/search Busca facetada no Typesense em um único escopo (tenders | buyers | suppliers | sectors): resultados + contagens de facetas + paginação. /api/v1/awards Linhas de adjudicação paginadas e filtráveis, ordenadas por valor. CSV disponível em /api/v1/awards.csv. /api/v1/buyers/{slug} Detalhes do órgão contratante: resumo, tendência de gastos por ano, distribuição por setor, principais fornecedores. /api/v1/suppliers/{slug} Detalhes do fornecedor: resumo, tendência de adjudicações por ano, distribuição por setor, principais órgãos contratantes. /api/v1/sectors/{slug} Detalhes do setor: resumo, tendência por ano, parceiros ativos (?kind=buyers|suppliers). /api/v1/tenders/{id} Uma única adjudicação por id numérico ou id público da licitação, mais adjudicações relacionadas. /api/v1/lists* Listas salvas de adjudicações. Vinculadas ao proprietário — exige um x-api-key de usuário. /api/v1/saved-searches* Buscas salvas. Vinculadas ao proprietário — exige um x-api-key de usuário. Exemplos.
Python — buscar adjudicações
import requests
H = {"x-api-key": "sts_xxxxxxxx"}
r = requests.get(
"https://app.selltostate.com/api/v1/search",
params={"scope": "tenders", "q": "cybersecurity", "year_min": 2023},
headers=H,
)
if r.status_code == 402:
print("subscribe:", r.json()["payment_link"]); raise SystemExit
data = r.json()
print(data["found"], "matches")
for hit in data["hits"]:
print(hit) Node — detalhes do órgão contratante + exportação em CSV
const H = { "x-api-key": process.env.STS_API_KEY };
const buyer = await fetch(
"https://app.selltostate.com/api/v1/buyers/ministry-of-education",
{ headers: H },
).then((r) => r.json());
console.log(buyer.buyer, buyer.yearly);
// Stream the entitlement-capped CSV
const csv = await fetch(
"https://app.selltostate.com/api/v1/awards.csv?supplier=ACME",
{ headers: H },
).then((r) => r.text()); Listas salvas (chave de usuário)
# Create a list, add a tender, read it back
LID=$(curl -s -X POST https://app.selltostate.com/api/v1/lists \
-H "x-api-key: sts_xxxxxxxx" -H "content-type: application/json" \
-d '{"name":"Cyber FY24"}' | jq -r .id)
curl -s -X POST https://app.selltostate.com/api/v1/lists/$LID/items \
-H "x-api-key: sts_xxxxxxxx" -H "content-type: application/json" \
-d '{"tender_no":"MOE000ETT24300001"}' Poll for new tenders.
A job in your scheduler, Zapier or n8n can ask for the tenders added to Sell to State since its last run.
Keep the time of each run and send it as added_after. Remove duplicates by slug.
LAST=$(cat last_run 2>/dev/null || echo 0) NOW=$(date +%s) curl -s "https://app.selltostate.com/api/v1/search?scope=tenders&country=united-kingdom&q=software&sort=added_desc&added_after=$LAST&per_page=50" -H "x-api-key: sts_xxxxxxxx" echo "$NOW" > last_run
| Param | Values |
|---|---|
sort | added_desc (newest in Sell to State first), published_desc (newest publish date first), deadline, relevance |
added_after | Unix seconds. Only tenders added after this time. |
published_days | 1, 7, 30, 90, 365 |
The search limit is 300 calls a minute per key. A poll every 5 minutes or more is enough for tenders. Integrations
Obtenha uma chave de API.
Pick a plan, create a key under Account → API keys, and you're querying in minutes. The full reference — every parameter, response schema, and a live "Try it" — is at docs.selltostate.com.
Start for free →