Skip to content
source

Public API — v0.0.1

API documentation

Free public read of every verified entry, ontology cross-reference, public key, and signature event. CORS-enabled. Edge-cached. No API key required.

Inverted economics

Public read is free forever. Hospital EHRs, chatbots, research workflows can integrate without paying anything. Institutional write (POST contributions back, bulk dataset export, dataset DOI minting) is paid — revenue flows back to the contributing department per their reviewed entries. Today only the read surface exists; no institutional tier is live yet.

Endpoints

GET/api/drugsOpen ↗public

List every verified entry — nothing is filtered by review status. The response also carries a per-tier summary (verified / community / expert).

Example

curl https://source.cuvetsmo.com/api/drugs

Response shape

{
  "apiVersion": "0.0.1",
  "lastUpdated": "<iso>",
  "count": 1,
  "data": [ { "slug": "meloxicam", ... } ]
}
GET/api/drugs/{slug}public

Single drug entry by slug — every clinical section, dosages by species and route, and the full citation list.

Example

curl https://source.cuvetsmo.com/api/drugs/meloxicam

Response shape

{
  "apiVersion": "0.0.1",
  "lastUpdated": "<iso>",
  "data": { "slug": "meloxicam", ... }
}
GET/api/catalogOpen ↗public

The whole catalog in one request — every entry with clinical sections, dosages, citations, codes, and verification tier. Free; no key.

Example

curl https://source.cuvetsmo.com/api/catalog

Response shape

{
  "count": N,
  "drugs": [ { "slug": "meloxicam", "dosages": [...], "citations": [...], "verificationTier": "sourced", ... } ]
}
GET/api/catalog/csvOpen ↗public

Same catalog as RFC 4180 CSV, one row per drug × dosage (species, indication, route, dose, citation count). Opens directly in Excel / Sheets.

Example

curl -O https://source.cuvetsmo.com/api/catalog/csv

Response shape

Content-Type: text/csv; charset=utf-8
Content-Disposition: attachment; filename="cuvetsmo-source-catalog.csv"
GET/api/by-codeOpen ↗public

Filter by ontology code. Supports ATC prefix-match and RxNorm exact match.

Rate limit: 1000 / IP / day (advisory — not enforced today)

Example

curl 'https://source.cuvetsmo.com/api/by-code?system=atc&code=M01AC06'

Response shape

{
  "query": { "system": "atc", "code": "M01AC06" },
  "count": 1,
  "data": [ { "slug": "meloxicam", "codes": {...} } ]
}
GET/api/keys/{kid}public

Public signing key as JSON Web Key. Use for client-side signature verification.

Example

curl https://source.cuvetsmo.com/api/keys/cuvetsmo-board

Response shape

{
  "apiVersion": "0.0.1",
  "data": {
    "kty": "OKP", "crv": "Ed25519", "x": "<base64url>",
    "fingerprint": "ed25519:<hex>",
    "displayName": "CUVETSMO Editorial Board"
  }
}
GET/api/logOpen ↗public

Append-only transparency log of every signature event. Audit trail for the curious.

Rate limit: 100 / IP / day (advisory — large payload)

Example

curl https://source.cuvetsmo.com/api/log

Response shape

{
  "apiVersion": "0.0.1",
  "count": N,
  "entries": [ { "entryType": "drug-signature", "drugSlug": "meloxicam", ... } ]
}
GET/api/healthOpen ↗public

Citation-probe health summary — coverage stats, dead URLs, source breakdown. Lets external monitoring detect citation rot.

Example

curl https://source.cuvetsmo.com/api/health

Response shape

{
  "apiVersion": "0.0.1",
  "summary": {
    "totalCitations": N, "probed": N, "healthy": N,
    "unhealthy": N, "pctProbed": N, "pctHealthy": N
  },
  "bySource": { "dailymed": {...}, "atc": {...}, ... },
  "unhealthyEntries": [ { "cid": "...", "url": "...", "latestStatus": 404 } ]
}
GET/api/datasetOpen ↗institutional

Institutional bulk-export placeholder: returns 402 today. The whole catalog is already free at /api/catalog (JSON) and /api/catalog/csv.

Example

curl -i https://source.cuvetsmo.com/api/dataset

Response shape

HTTP/2 402
{
  "error": { "code": "institutional-tier-required", ... },
  "contact": { "email": "palm@cuvetsmo.com", ... }
}

Rate limits + response headers

Rate-limit headers are advisory today. Nothing is enforced yet, so integrations built now keep working if enforcement is ever turned on:

X-Source-Tier: public
X-Source-Limit-RPD: 1000
X-Source-Cost: 1
X-Source-Enforcement: phase-0-soft

Tier public = anonymous. Tier institutional = paid. Tier admin= maintainers only. When enforcement flips on, exceeding RPD returns HTTP 429 with the same shape as the 402 dataset response.

CORS

All GET endpoints set Access-Control-Allow-Origin: *. You can fetch from any origin (browser, curl, Node, Python, Go). There is no write API today; contributions go through the public GitHub repository.

Sample integration

// Browser — fetch + verify a single entry
const drug = await fetch('https://source.cuvetsmo.com/api/drugs/meloxicam').then(r => r.json())
const key = await fetch(`https://source.cuvetsmo.com/api/keys/${drug.data.signatures[0].signerKeyId.split(':')[1].slice(0,99)}`)
// For real verification, fetch by signerId not by fingerprint slice
// see /verify/[slug] for the proper pattern