News
Manage news articles for your tenant. News items support an approval workflow — newly created items are unapproved by default and must be approved before they appear publicly.
List news items
/api/newsReturns news items for your tenant, ordered by publish date (newest first).
Required scope: news:read
Minimum role: caseworker
Example response
[
{
"id": "clx...",
"tenantId": "tenant-123",
"title": "New recycling scheme launches in March",
"body": "The council has announced a new kerbside recycling programme...",
"source": "Council Press Office",
"approved": true,
"publishedAt": "2026-03-01T09:00:00.000Z",
"createdAt": "2026-02-28T14:00:00.000Z",
"updatedAt": "2026-03-01T08:30:00.000Z",
"createdBy": {
"id": "user-456",
"name": "Jane Smith"
}
}
]
Create a news item
/api/newsCreate a new news article. The item is unapproved by default.
Required scope: news:write
Minimum role: councillor
Returns 201 Created with the full news item object.
Approval required
Newly created news items have approved: false. They must be approved via the bulk approve endpoint or by updating the item directly before they appear on public pages.
Update a news item
/api/news/:idUpdate fields on an existing news item.
Required scope: news:write
Minimum role: councillor
Returns 200 OK with the updated news item. Returns 404 if the item does not exist or belongs to a different tenant.
Delete a news item
/api/news/:idPermanently delete a news item.
Required scope: news:write
Minimum role: councillor
Returns 200 OK with { "success": true }. Returns 404 if the item does not exist.
Bulk approve news items
/api/news/approveApprove multiple news items in a single request.
Required scope: news:write
Minimum role: councillor
Example response
{
"approved": 3
}
Idempotent operation
Approving already-approved items is safe — they are included in the count but their state does not change.
Events
Manage council and area events. Events support the same approval workflow as news and can be filtered by type, date range, and approval status.
List events
/api/eventsReturns events for your tenant, ordered by start date (earliest first).
Required scope: events:read
Minimum role: caseworker
Example response
[
{
"id": "clx...",
"tenantId": "tenant-123",
"title": "Full Council Meeting",
"description": "Quarterly full council session covering budget review...",
"location": "Council Chamber, County Hall",
"startsAt": "2026-03-15T18:00:00.000Z",
"endsAt": "2026-03-15T21:00:00.000Z",
"eventType": "council",
"approved": true,
"wardId": null,
"ward": null,
"createdAt": "2026-02-20T10:00:00.000Z",
"updatedAt": "2026-02-20T10:00:00.000Z",
"createdBy": {
"id": "user-789",
"name": "John Davies"
}
}
]
Area events include ward data
When an event has eventType: "area", the response includes a ward object with id and name. Council-wide events have ward: null.
Create an event
/api/eventsCreate a new event. The event is unapproved by default.
Required scope: events:write
Minimum role: councillor
Returns 201 Created with the full event object including ward and createdBy relations.
Ward required for area events
Setting eventType to area without providing a wardId returns a 400 error. Council events ignore the wardId field.
Update an event
/api/events/:idUpdate fields on an existing event.
Required scope: events:write
Minimum role: councillor
Returns 200 OK with the updated event. Returns 404 if the event does not exist or belongs to a different tenant.
Ward validation on update
If the resulting event type is area (whether from this update or the existing value) and the resulting ward ID is null, the API returns a 400 error.
Delete an event
/api/events/:idPermanently delete an event.
Required scope: events:write
Minimum role: councillor
Returns 200 OK with { "success": true }. Returns 404 if the event does not exist.
Bulk approve events
/api/events/approveApprove multiple events in a single request.
Required scope: events:write
Minimum role: councillor
Example response
{
"approved": 2
}