Everything on this site is available as JSON and RSS. No key, no account, no sign-up. Access-Control-Allow-Origin: * on the JSON endpoints, so you can call them from a browser. Attribution is welcome, not required.
All timestamps are ISO 8601 in UTC. Schedules are authored in Asia/Manila; convert before you show them.
GET /api/v1/advisories
Advisories newest first by start date, falling back to the post date when no date was detected.
curl "https://kuryente.fyi/api/v1/advisories?limit=5"
curl "https://kuryente.fyi/api/v1/advisories?coop=batelec1&from=2026-09-01T00:00:00Z"
curl "https://kuryente.fyi/api/v1/advisories?psgc=0401001001&include_review=1"| Parameter | Type | Meaning |
|---|---|---|
coop | string | Cooperative slug, e.g. batelec1. 404 if unknown. |
psgc | 10 digits | PSGC code. Matches the area itself and its parent municipality or city. |
from | ISO 8601 | Only advisories starting at or after this instant. |
to | ISO 8601 | Only advisories starting at or before this instant. |
limit | 1-200 | Default 50. Counts advisories, or posts when group=post. Out-of-range values are clamped, junk falls back to 50. |
include_review | any value | Also return advisories still awaiting verification. |
group | post | Nest each post's schedules as { post, blocks[] }. A post is returned with all of its blocks. |
{
"data": [
{
"id": 4821,
"type": "scheduled",
"reason": "maintenance",
"startsAt": "2026-09-05T00:00:00.000Z",
"endsAt": "2026-09-05T09:00:00.000Z",
"confidence": 0.92,
"status": "published",
"createdAt": "2026-09-02T11:04:18.201Z",
"coopSlug": "batelec1",
"coopName": "BATELEC I",
"postUrl": "https://www.facebook.com/...",
"postText": "SCHEDULED POWER INTERRUPTION ...",
"postedAt": "2026-09-02T10:58:00.000Z",
"areas": [
{ "code": "0401001001", "name": "Alangilan", "level": "barangay" }
]
}
]
}| Field | Type | Meaning |
|---|---|---|
id | number | Stable advisory id. |
type | string | scheduled, emergency, restoration or unknown. |
reason | string | maintenance, line_upgrade, tree_trimming, ngcp, fault, weather or other. |
startsAt | ISO 8601 or null | Start of the interruption, UTC. Null when no date was detected. |
endsAt | ISO 8601 or null | End of the interruption, UTC. Null when only a start time was given. |
confidence | number | 0 to 1, from the parser confidence bands. |
status | string | published, or review when it still needs verification. |
createdAt | ISO 8601 | When we recorded the advisory. |
coopSlug | string | Cooperative slug; use it with /app/coop/{slug}. |
coopName | string | Cooperative short name, e.g. BATELEC I. |
postUrl | string or null | Permalink to the original Facebook post. |
postText | string | The original post text, verbatim. |
postedAt | ISO 8601 | When the cooperative posted it. |
areas | array | Affected areas: { code, name, level } from the PSGC gazetteer. |
postId | number | The post this schedule came from. One post carries several. |
blockIndex | number | Position of this schedule within its post, from 0. |
blockLabel | string or null | The cooperative's own name for it, e.g. Feeder 3. |
An unknown coop returns 404 with { "error": "unknown coop" }; a malformed parameter returns 400 with error and detail.
GET /api/v1/areas/search?q=
Typeahead over the PSGC gazetteer. Queries shorter than two characters return an empty array. Up to 10 results, as a bare array rather than a data envelope.
curl "https://kuryente.fyi/api/v1/areas/search?q=alangilan"
[
{
"code": "0401001001",
"name": "Alangilan",
"level": "barangay",
"parent": "Batangas City"
}
]| Field | Type | Meaning |
|---|---|---|
code | string | 10-digit PSGC code. Use it as the psgc parameter or at /area/{code}. |
name | string | Area name. |
level | string | region, province, city, municipality or barangay. |
parent | string or null | Name of the containing area, for disambiguation. |
GET /api/v1/reports · GET /api/v1/reports?psgc=CODE · POST /api/reports
A resident report is a signal only, never a confirmed outage. Without a psgc parameter, GET returns the municipalities currently flagged: at least five reports in the last hour, at least three times that place's normal rate. With psgc it returns the report counts for one place. POST /api/reports submits one report and is rate limited per IP.
curl "https://kuryente.fyi/api/v1/reports"
curl "https://kuryente.fyi/api/v1/reports?psgc=0401001001"GET /coop/{slug}/feed.xml
RSS 2.0, the 50 most recent published advisories for one cooperative. The item title is the type and schedule, the description is the affected areas followed by the original post text, and the guid is stable. Good for a barangay Facebook page on autopost, or for a reader.
curl "https://kuryente.fyi/app/coop/batelec1/feed.xml"Find slugs on the cooperatives directory.
public, s-maxage=60, stale-while-revalidate=300, so a busy endpoint is served from the edge and your polling costs nothing. Polling more than once a minute gains you nothing.{ "error": "Too many requests" }. Debounce your typeahead.public, s-maxage=300. Poll every five minutes at most.There is no versioning policy beyond the /v1 prefix: fields will be added, never removed or retyped, without a /v2. If you are building something on this, send a note through the submit form with your contact so we can tell you before anything changes.