News Signals

Categorized K-12 news monitoring — articles tagged with buying signals and resolved to districts

Enterprise only. The News Signals API is not part of the self-serve product yet. Access is provisioned manually per organization. If you're interested in K-12 news monitoring, email hello@bellwork.ai and we'll get you set up. A self-serve version is coming to the product soon.

Overview

The News Signals API ships categorized K-12 news articles. Every day Bellwork discovers K-12 news, extracts structured signals (buying intent, leadership changes, academic outcomes, funding, and more), and attaches the district or school each signal is about.

The API returns articles that are relevant to K-12 — the ones carrying buying signals — with those signals embedded.

A typical integration polls the feed each morning using a since cursor, pulls the articles that surfaced overnight, and feeds them into downstream systems.

Access

Access requires an API key and an organization entitlement for news monitoring. Pass the key as a Bearer token:

Authorization: Bearer sk_live_...

To get a key, contact hello@bellwork.ai.

List articles

GET /api/v1/news
Authorization: Bearer sk_live_...
curl -H "Authorization: Bearer YOUR_API_KEY" \
  'https://www.bellwork.ai/api/v1/news?signal_type=leadership_change,chronic_absenteeism&limit=50'

Query parameters

ParamTypeNotes
signal_typeCSVFilter to one or more signal types, e.g. chronic_absenteeism,math_proficiency. See Signal types.
buying_intentCSVOne or more of none, low, medium, high.
district_idCSV (uuid)Watchlist. An article qualifies if a matching signal resolved to one of these districts.
stateCSVTwo-letter state codes (e.g. NC,TX). Matches the resolved district's state.
sinceISO timestampSync cursor. Returns articles whose signals were extracted at or after this time. Use this for nightly/morning pulls.
published_after / published_beforeISO timestampFilter on the article's publish date.
limitint (1–200)Default 50.
offsetintDefault 0. Use with limit to paginate.

When district_id / state are omitted, you get every article with a qualifying signal, and each signal includes its resolved district when available (otherwise null). When set, only signals matching your watchlist are embedded.

Response

{
  "data": [
    {
      "id": "uuid",
      "url": "https://www.example.com/article",
      "title": "Wake County names new superintendent",
      "domain": "www.example.com",
      "author": "Jane Reporter",
      "description": "…",
      "published_at": "2026-05-22T00:00:00Z",
      "signals": [
        {
          "signal_type": "leadership_change",
          "buying_intent": "medium",
          "buying_intent_reason": "New leadership often drives a vendor review",
          "summary": "The board appointed a new superintendent effective July 1.",
          "signal_date": "2026-05-22",
          "signal_date_confidence": 0.9,
          "extraction_confidence": 0.82,
          "evidence": ["…quoted snippet from the article…"],
          "payload": { "...": "structured extracted details" },
          "entity_type": "district",
          "entity_resolution_status": "linked",
          "entity_match_confidence": 0.95,
          "entity_match_reason": "The text explicitly names 'Wake County Public School System'.",
          "district": {
            "id": "uuid",
            "name": "Wake County",
            "state": "NC",
            "nces_id": "3704720"
          },
          "school": null
        }
      ]
    }
  ],
  "pagination": { "total": 1234, "limit": 50, "offset": 0, "has_more": true }
}

If a district or school is relevant to a signal, we attach it.

Get a single article

GET /api/v1/news/{id}
Authorization: Bearer sk_live_...

Returns one article with all of its non-noise signals (unfiltered), for drill-down.

Daily sync pattern

To pull what surfaced overnight, store the timestamp of your last successful run and pass it as since, paging with limit + offset until has_more is false:

# First page of everything extracted since your last run
curl -H "Authorization: Bearer YOUR_API_KEY" \
  'https://www.bellwork.ai/api/v1/news?since=2026-05-21T00:00:00Z&limit=200&offset=0'

# Next page
curl -H "Authorization: Bearer YOUR_API_KEY" \
  'https://www.bellwork.ai/api/v1/news?since=2026-05-21T00:00:00Z&limit=200&offset=200'

Signal types

Pass any of these (comma-separated) to signal_type:

signal_typeWhat it captures
chronic_absenteeismAttendance problems, truancy, chronic-absence rates, or new attendance initiatives.
math_proficiencyMath achievement, test scores, proficiency gaps, or math improvement efforts.
literacy_interventionReading/literacy performance, science-of-reading adoption, or literacy interventions.
academic_improvement_planFormal improvement plans, turnaround efforts, or academic strategy initiatives.
student_support_programMTSS, tutoring, SEL, counseling, mental-health, or other student-support programs.
special_educationSpecial education programs, IEP/504, disability services, or compliance.
leadership_changeSuperintendent/principal/cabinet hires, departures, or interim appointments.
staffing_laborHiring, vacancies, layoffs, union/contract negotiations, or staffing shortages.
board_policySchool-board decisions, new policies, resolutions, or governance changes.
accountability_governanceState ratings, accreditation, audits, oversight, or accountability actions.
budget_fundingBudgets, levies, bonds, funding shortfalls, ESSER cliff, or spending decisions.
grant_awardGrants won/awarded, philanthropic gifts, or new funding streams.
facilities_capitalConstruction, renovations, capital projects, or facility planning.
procurement_contractRFPs, bids, contracts awarded, or procurement activity.
vendor_adoptionA district adopting, expanding, or dropping a specific product or vendor.
ai_edtech_adoptionAI tools, edtech platforms, devices, or digital-learning initiatives.
cybersecurity_data_privacyData breaches, ransomware, cybersecurity, or student-data-privacy issues.
safety_legalSafety incidents, lawsuits, investigations, or legal/Title IX matters.
school_closure_boundary_enrollmentSchool closures/consolidations, boundary changes, or enrollment shifts.

Errors

StatusMeaning
401Missing or invalid API key.
403Your organization isn't entitled to news monitoring.
400Invalid query parameter (e.g. an unknown signal_type).
429Rate limit exceeded for your key.