BioTradingArena

API Reference

Complete reference for all BioTradingArena API endpoints.

Base URL: https://biotradingarena.com

Public Endpoints

These endpoints do not require authentication.

GET /api/catalysts

Returns all 645 catalyst cases.

GET /api/oncology

Returns oncology-specific cases (369 cases).

GET /api/strategies

Returns available prediction strategies.

GET /api/pubmed/:pmid

Fetches a PubMed article by PMID, including abstract and full paper text when available.

No authentication required — PubMed data is public.

Full text is fetched from PubMed Central (PMC) for open access articles. For papers with a DOI but no PMC entry, an open access URL is returned via Unpaywall when available.

Response:

{
  "pmid": "40910168",
  "title": "Characterization and Application of Novel Exercise Recovery Patterns...",
  "abstract": "Post-exercise oxygen uptake recovery (VO2Rec) is slow in...",
  "full_text": "## What Is New?\n\nThis study reports multiple novel measures...",
  "full_text_source": "pmc",
  "journal": "Circulation",
  "pubdate": "2025 Oct 7",
  "doi": "10.1161/CIRCULATIONAHA.124.073585",
  "pmc_id": "PMC12493091",
  "pubmed_url": "https://pubmed.ncbi.nlm.nih.gov/40910168/",
  "authors": ["Campain J", "Griskowitz C", "Newlands C"],
  "has_full_text": true
}
FieldTypeDescription
full_textstring|nullFull paper text from PMC, or OA link from Unpaywall, or null
full_text_sourcestring|null"pmc", "unpaywall", or null
has_full_textbooleanWhether actual full text content is available

GET /api/catalysts/:id/papers

Returns all PubMed papers linked to a catalyst, enriched with abstracts and full text.

No authentication required.

Query Parameters:

ParameterTypeDefaultDescription
full_textstring"true"Set to "false" to skip PMC full text fetching (faster)

Response:

{
  "catalyst_id": "CYTK_2025-12-19_MYQORZO",
  "ticker": "CYTK",
  "drug": "MYQORZO (aficamten)",
  "paper_count": 5,
  "full_text_count": 3,
  "papers": [
    {
      "pmid": "40910168",
      "title": "Characterization and Application of Novel Exercise Recovery...",
      "journal": "Circulation",
      "pubdate": "2025 Oct 7",
      "doi": "10.1161/CIRCULATIONAHA.124.073585",
      "pmc_id": "PMC12493091",
      "abstract": "Post-exercise oxygen uptake recovery...",
      "full_text": "## What Is New?\n\nThis study reports...",
      "full_text_source": "pmc",
      "has_full_text": true
    }
  ]
}

Benchmark Endpoints

These endpoints require authentication via Authorization: Bearer <api_key>.

GET /api/benchmark/cases

Fetch benchmark cases with all input data for evaluation.

Query Parameters:

ParameterTypeDefaultDescription
subsetstringoncologyoncology, non_oncology, or all
limitintegerallMax cases (up to 1000)
offsetinteger0Pagination offset

Response:

{
  "total": 369,
  "count": 369,
  "subset": "oncology",
  "impact_categories": ["very_negative", "negative", "slightly_negative", "neutral", "slightly_positive", "positive", "very_positive"],
  "cases": [...]
}

POST /api/benchmark/verify

Score your predictions without saving them. Returns detailed per-case results.

Request Body:

{
  "predictions": [
    {
      "case_id": "onc_0001",
      "predicted_impact": "positive",
      "confidence": 0.85
    }
  ]
}
FieldRequiredDescription
predictionsYesArray of predictions (max 1000)
predictions[].case_idYesCase identifier
predictions[].predicted_impactYesOne of the 7 impact categories
predictions[].confidenceNoConfidence score (0-1)
predictions[].reasoningNoYour model's reasoning

Response:

{
  "metrics": {
    "cases_evaluated": 369,
    "exact_match_accuracy": 28.5,
    "directional_accuracy": 62.3,
    "close_accuracy": 55.0,
    "avg_confidence": 0.72
  },
  "direction_confusion_matrix": {
    "positive": { "positive": 45, "neutral": 5, "negative": 2 },
    "neutral": { "positive": 8, "neutral": 12, "negative": 6 },
    "negative": { "positive": 3, "neutral": 7, "negative": 35 }
  },
  "results": [
    {
      "case_id": "onc_0001",
      "predicted_impact": "positive",
      "actual_impact": "positive",
      "percent_change": 12.5,
      "exact_match": true,
      "close_match": true,
      "direction_correct": true
    }
  ]
}

POST /api/benchmark/submit

Submit predictions to the leaderboard. Predictions are scored and saved.

Request Body:

{
  "strategy_name": "My Strategy v1",
  "description": "Brief description of approach",
  "model": "gpt-4o",
  "predictions": [
    {
      "case_id": "onc_0001",
      "predicted_impact": "positive",
      "predicted_score": 12.0,
      "confidence": 0.85
    }
  ]
}
FieldRequiredDescription
strategy_nameYesName for your strategy (max 100 chars)
descriptionNoDescription (max 500 chars)
modelNoModel name (max 100 chars)
predictionsYesArray of predictions (max 1000)
predictions[].case_idYesCase identifier
predictions[].predicted_impactNo*Categorical prediction
predictions[].predicted_scoreNo*Numeric % change prediction
predictions[].confidenceNoConfidence score (0-1)

*At least one of predicted_impact or predicted_score is required per prediction.

Response:

{
  "submission_id": "sub_abc123_xyz789",
  "strategy_name": "My Strategy v1",
  "submitted_by": "user@example.com",
  "cases_evaluated": 369,
  "metrics": {
    "exact_match_accuracy": 28.5,
    "directional_accuracy": 62.3,
    "close_accuracy": 55.0,
    "avg_confidence": 0.72,
    "mae": 8.45
  },
  "leaderboard_rank": 3,
  "total_submissions": 12,
  "message": "Submission accepted! Your strategy ranks #3 out of 12 on the leaderboard."
}

Error Codes

StatusMeaning
400Bad request — invalid or missing fields
401Unauthorized — missing or invalid API key
500Internal server error
503Auth not configured on the server