Recipe: What trials are recruiting for X

The task

A patient, caregiver, or researcher wants to know which clinical trials are currently enrolling for a condition or drug — not every trial ever registered, just the ones a real person could actually join today.

Tool used: ct_search. One call, with the status filter set explicitly.

Copy-paste prompt

Find clinical trials that are currently recruiting for "<condition or drug>" using
Pipeworx's clinical trials tool. Only include trials with status RECRUITING — exclude
completed, terminated, or active-but-closed-to-new-patients trials. For each result give
me the NCT ID, title, phase, sponsor, and a link to the study page.

What a good answer looks like

ct_search({ query: "pancreatic cancer", status: "RECRUITING", limit: 5 })

returns (live call, 2026-08-10 — trimmed to 2 of 5):

{
  "query_used": "pancreatic cancer",
  "filters_applied": { "status": "RECRUITING", "phase": null, "sponsor": null },
  "total_count": 1150,
  "studies": [
    {
      "nct_id": "NCT05746182",
      "title": "Genetic Predisposition Testing Program for Pancreatic Neuroendocrine Neoplasms",
      "status": "RECRUITING",
      "phase": null,
      "sponsor": "University of California, San Francisco",
      "start_date": "2023-04-07"
    },
    {
      "nct_id": "NCT06242470",
      "title": "A Study of MGC026 in Participants With Advanced Solid Tumors",
      "status": "RECRUITING",
      "phase": "PHASE1",
      "sponsor": "MacroGenics",
      "start_date": "2024-03-06"
    }
  ]
}

A trustworthy answer:

  • echoes filters_applied.status back as "RECRUITING" — not null — so you can confirm the filter actually took effect, not just that you asked for it
  • shows every returned study with status: "RECRUITING" literally on the record, not inferred from the query wording
  • gives you total_count (the full match count) separately from how many rows you actually got back, so “5 results” doesn’t get misread as “only 5 trials exist”

The plausible-sounding failure: omitting status doesn’t default to recruiting-only — it returns every status, unfiltered, and still looks like a normal answer. Here’s the same query with status left off:

ct_search({ query: "test", limit: 3 })
// → filters_applied: { "status": null, "phase": null, "sponsor": null }
// → studies: [
//     { "nct_id": "NCT06243289", "status": "TERMINATED", ... },
//     { "nct_id": "NCT01137240", "status": "COMPLETED", ... },
//     { "nct_id": "NCT04156789", "status": "COMPLETED", ... }
//   ]

Nothing about that response looks broken — real NCT IDs, real titles, a normal-shaped list. But a caregiver told “here are trials for X” and handed a TERMINATED or COMPLETED study has been actively misled: there is nowhere to enroll. ct_search has no default status filter; you supply one or you get everything. Always pass status: "RECRUITING" explicitly — never rely on the query text (“recruiting pancreatic cancer trials”) to imply it, since the query field only searches title/condition/intervention text, not status.

Step-by-step tool calls

1. Search with the status filter set

ct_search({ query: "<condition or drug>", status: "RECRUITING", limit: 10 })

Combine statuses with a comma union if you want a broader “still open” view — e.g. status: "RECRUITING,NOT_YET_RECRUITING" includes trials that have posted but haven’t started screening patients yet.

2. Or search by location instead of keyword

For “trials near me” rather than “trials for X”, use ct_trials_by_location — it defaults status to RECRUITING when you don’t pass one, which is the opposite default behavior from ct_search in the same pack:

ct_trials_by_location({ condition: "breast cancer", location: "Boston", limit: 10 })
// → status defaults to RECRUITING (see the tool's own description)

Don’t assume this default carries over to ct_search — it doesn’t. Two tools, two different unset-status behaviors, in the same pack.

3. Get full detail on one trial

ct_get_study({ nct_id: "NCT05746182" })
// → eligibility criteria, primary outcomes, sponsor, site locations

Eligibility criteria are where “can this patient actually enroll” gets decided — ct_search results don’t carry them; you need the per-study call.

4. Distinguish “recruiting” from “still running but closed to new patients”

RECRUITING and ACTIVE_NOT_RECRUITING are different statuses for a reason: a trial can be fully enrolled and still ongoing (following existing participants) while no longer accepting new ones. If your prompt says “can I join,” filter to RECRUITING only — don’t fold ACTIVE_NOT_RECRUITING into the same bucket, even though both sound like “the trial is active.”

Caveats

  • ct_search’s status filter is opt-in, not a default. See the plausible-failure section above — this is the one trap that makes an otherwise-correct-looking answer actively wrong.
  • RECRUITINGACTIVE_NOT_RECRUITING. The full status vocabulary is RECRUITING, ACTIVE_NOT_RECRUITING, COMPLETED, TERMINATED, WITHDRAWN, ENROLLING_BY_INVITATION, SUSPENDED, NOT_YET_RECRUITING. Only the first (and arguably the last, with a caveat that it hasn’t opened yet) answers “can a new patient join today.”
  • ct_count_by_condition’s description promises a status/phase breakdown; the live tool doesn’t return one — it returns a single filtered total_count for whatever status/phase you passed (e.g. {"total_count": 5024} for “pancreatic cancer” with no filter). Filed as fleet #215. Don’t rely on it for a per-status landscape count today — call ct_search once per status value instead if you need the breakdown.
  • total_count can be large relative to limit. “1,150 recruiting trials for pancreatic cancer” doesn’t mean the 5 you fetched are the most relevant 5 — there’s no relevance ranking beyond ClinicalTrials.gov’s own ordering. Narrow with phase or sponsor if the caller cares which trials, not just whether any exist.
  • This is ClinicalTrials.gov (US-centric, though it lists many international sites) — not a substitute for eligibility screening. Enrollment criteria are strict and site-specific; a trial appearing in results doesn’t mean a specific patient qualifies.

Last reviewed August 10, 2026