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
| Param | Type | Notes |
|---|---|---|
signal_type | CSV | Filter to one or more signal types, e.g. chronic_absenteeism,math_proficiency. See Signal types. |
buying_intent | CSV | One or more of none, low, medium, high. |
district_id | CSV (uuid) | Watchlist. An article qualifies if a matching signal resolved to one of these districts. |
state | CSV | Two-letter state codes (e.g. NC,TX). Matches the resolved district's state. |
since | ISO timestamp | Sync cursor. Returns articles whose signals were extracted at or after this time. Use this for nightly/morning pulls. |
published_after / published_before | ISO timestamp | Filter on the article's publish date. |
limit | int (1–200) | Default 50. |
offset | int | Default 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_type | What it captures |
|---|---|
chronic_absenteeism | Attendance problems, truancy, chronic-absence rates, or new attendance initiatives. |
math_proficiency | Math achievement, test scores, proficiency gaps, or math improvement efforts. |
literacy_intervention | Reading/literacy performance, science-of-reading adoption, or literacy interventions. |
academic_improvement_plan | Formal improvement plans, turnaround efforts, or academic strategy initiatives. |
student_support_program | MTSS, tutoring, SEL, counseling, mental-health, or other student-support programs. |
special_education | Special education programs, IEP/504, disability services, or compliance. |
leadership_change | Superintendent/principal/cabinet hires, departures, or interim appointments. |
staffing_labor | Hiring, vacancies, layoffs, union/contract negotiations, or staffing shortages. |
board_policy | School-board decisions, new policies, resolutions, or governance changes. |
accountability_governance | State ratings, accreditation, audits, oversight, or accountability actions. |
budget_funding | Budgets, levies, bonds, funding shortfalls, ESSER cliff, or spending decisions. |
grant_award | Grants won/awarded, philanthropic gifts, or new funding streams. |
facilities_capital | Construction, renovations, capital projects, or facility planning. |
procurement_contract | RFPs, bids, contracts awarded, or procurement activity. |
vendor_adoption | A district adopting, expanding, or dropping a specific product or vendor. |
ai_edtech_adoption | AI tools, edtech platforms, devices, or digital-learning initiatives. |
cybersecurity_data_privacy | Data breaches, ransomware, cybersecurity, or student-data-privacy issues. |
safety_legal | Safety incidents, lawsuits, investigations, or legal/Title IX matters. |
school_closure_boundary_enrollment | School closures/consolidations, boundary changes, or enrollment shifts. |
Errors
| Status | Meaning |
|---|---|
401 | Missing or invalid API key. |
403 | Your organization isn't entitled to news monitoring. |
400 | Invalid query parameter (e.g. an unknown signal_type). |
429 | Rate limit exceeded for your key. |