APITube Help Center

How to Track Disease Outbreaks

Build an outbreak surveillance feed by pairing the disease.name entity filter with the health-crisis event type

Tasha Tatum

Written by Tasha Tatum

July 4, 2026

Updated July 6, 2026

Open this example in the API Playground ↗

How to track disease outbreaks

To track a disease outbreak, query /v1/news/everything and combine the disease.name entity filter (the tagged illness) with event.type=health-crisis (articles the pipeline classified as a health crisis), then scope the feed to a country and a recent date window. disease.name matches the disease entity itself rather than a keyword, so it returns coverage about the outbreak instead of every article that happens to contain the word:

curl "https://api.apitube.io/v1/news/everything?disease.name=Measles&event.type=health-crisis&published_at.start=NOW-7DAYS" \
  -H "X-API-Key: YOUR_API_KEY"

You can send the key as an X-API-Key header or as the api_key query parameter, and call the endpoint with GET (query parameters) or POST (JSON body). Different parameters combine with AND, so each filter you add narrows the outbreak feed further.

How to build an outbreak surveillance feed

Start with the disease entity. disease.name filters to articles tagged with a specific illness (entity type disease), accepts up to three comma-separated names with OR logic, and requires each name to be 1 to 120 characters. That lets one request watch several outbreaks at once:

curl "https://api.apitube.io/v1/news/everything?disease.name=Measles,Dengue,Cholera&language.code=en&sort.by=published_at&sort.order=desc" \
  -H "X-API-Key: YOUR_API_KEY"

Results are newest-first by default (sort.by=published_at, sort.order=desc); switch to sort.by=relevance to rank by how well each article matches. The name must resolve to an entity APITube already tracks — an unknown disease.name stops the request with ER0226, and a name outside the 1–120 character range returns ER0152. For the full filter reference, see how to track disasters and disease outbreaks.

How to focus on outbreak events, not general disease coverage

A disease is mentioned in routine research, funding and history pieces as well as active outbreaks. To bias the feed toward crisis coverage, add event.type=health-crisis. The event.type filter matches an article’s primary classified event and accepts up to five comma-separated codes. health-crisis sits in the society event category, so you can also cast a wider net with event.category=society:

curl "https://api.apitube.io/v1/news/everything?disease.name=Influenza&event.type=health-crisis" \
  -H "X-API-Key: YOUR_API_KEY"

An unknown event.type returns ER0502, and an unknown event.category returns ER0503 (valid categories: business, society, environment). To see every valid code and its category, call GET /v1/news/event-types — it returns the full list as { code, category } pairs, so you never have to guess a spelling.

How to scope an outbreak to a country and time window

Outbreaks are geographic, so limit the feed to where it is happening. source.country.code keeps only publishers from a two-letter country code (such as us or gb), and a published_at window keeps the feed current. published_at.start and published_at.end accept absolute dates like 2026-06-01 or Solr-style relative values such as NOW-7DAYS and NOW-1WEEK:

curl "https://api.apitube.io/v1/news/everything?disease.name=Cholera&source.country.code=ng&published_at.start=NOW-14DAYS&per_page=250" \
  -H "X-API-Key: YOUR_API_KEY"

per_page defaults to 100 and maxes out at 250 (a larger value returns ER0171); walk deeper with page. An unknown country code returns ER0212. To measure the tone expressed toward the disease itself, add entity.sentiment.polarity=negative (it accepts positive, negative or neutral; an invalid value returns ER0290) — useful for separating alarm-driven coverage from reassurance.

How to catch breaking outbreak alerts

When an outbreak escalates, you want the articles the pipeline flagged as important. Add is_breaking=1 to keep only breaking coverage (is_breaking=0 keeps the rest; any other value returns ER0186):

curl "https://api.apitube.io/v1/news/everything?disease.name=Ebola&is_breaking=1&sort.by=published_at&sort.order=desc" \
  -H "X-API-Key: YOUR_API_KEY"

Because filters combine with AND, this returns only breaking articles about the named disease, newest first — a tight signal for a public-health desk rather than a full firehose.

How to receive outbreak coverage in real time

Polling everything returns what already exists; live surveillance needs push. Keep the exact same filters and open the Server-Sent Events stream at /v1/news/stream — it runs the same filter chain and pushes each new matching article as it is indexed (the poll cycle is 30 seconds):

curl -N "https://api.apitube.io/v1/news/stream?disease.name=Measles&event.type=health-crisis&language.code=en" \
  -H "X-API-Key: YOUR_API_KEY"

The stream only sends articles that appear after you connect, and you can trim stale backfill with stream.max_age (a rolling window in minutes; an invalid value returns ER0363). For a broader medical feed built the same way, see how to monitor healthcare and medical news, and the full parameter list in the News API parameters reference.

Common Questions

How is disease.name different from the health-crisis event type?

They filter on different signals. disease.name matches the tagged disease entity (type disease) mentioned in an article, so it identifies which illness the coverage is about. event.type=health-crisis matches an article’s primary classified event, so it identifies what kind of story it is. Using both together — disease.name=Measles&event.type=health-crisis — returns crisis-type coverage about that specific disease, which is tighter than either filter alone.

Which event type covers disease outbreaks?

health-crisis, which belongs to the society event category. Pass it as event.type=health-crisis, or widen to event.category=society to include neighbouring society events. Call GET /v1/news/event-types to see every valid code and category; passing a code that is not on that list returns ER0502.

How do I find the exact disease name to track?

disease.name resolves against the entities APITube tracks, so the name must match one. Look it up with entity autocomplete: call GET /v1/suggest/entities?prefix= with the start of the name (a missing prefix returns ER0346). Each result includes an id, name and type — a type of disease confirms a value you can pass to disease.name, and that numeric id also works directly as entity.id.

Can I get outbreak alerts pushed to me automatically?

Yes. Point the same filters at the /v1/news/stream SSE endpoint to have new matching articles streamed to you as they are indexed. If you would rather have APITube POST new coverage to your own URL, create a webhook — that is set up in the dashboard, not over the API. Streaming draws from a separate streaming quota, where each delivered article counts against that pool rather than your normal request credits.


Related Articles