What is not inferred or guaranteed
Chizumulu API is a careful reader of public posts, not an oracle. This page lists what it deliberately does not do.
What the API does not infer
Section titled “What the API does not infer”- It does not guess. A score, team, minute, status, date or competition that the post does not state is
null, not a plausible value. - It does not correct. Misspelled names, wrong dates and contradictory numbers in a post are returned as written.
- It does not normalize. Dates stay text (
dateText), minutes stay text (minuteText), names keep the source’s capitalization and punctuation. structureddoes not link posts together.matches[].indexis only a reference inside one observation, so two posts about the same match are two separate structured results. Linking is a separate, derived layer: derived matches group observations that clearly describe the same match under an API-assignedmatchId, conservatively, so one real match can occasionally appear as two.- It does not compute. No standings from results, no season statistics, no “current score” from the newest goal post.
- It does not read images in general. Retained images are not served. A retained image may be read for one kind of data, a league standings table, and nothing else in an image is interpreted: fixture or result graphics, lineups and photos are not read, so a fact that exists only there is absent. An image-only post (no caption) has no text and no structured result (
method: "none"); a standings table read from its image is returned separately asattachmentFacts. See facts read from an image. - It does not expand hashtags into names. See competition text vs code.
What is not guaranteed
Section titled “What is not guaranteed”- Completeness and timing. The API reflects what the collector observed and when. Posts can be missing, late, duplicated or edited upstream. A quiet feed is normal (see Status).
- Availability. No uptime target is promised. Already stored data stays readable when collection has a problem.
- Rate limits. None are documented and none are guaranteed either way. Be considerate: cache what you can and poll
/v1/feedat a modest interval. - Accuracy of derived data. Structured data and the Korean translation are produced by a rule-based parser and, when needed, a language model, with checks that every extracted string and number appears in the source text. They can still be incomplete or wrong. The original text is always returned so you can verify.
- Stability of free text.
processing.error,korean.textand the exact wording oferrormessages are not stable contracts. Field names, enum values and the response shapes in the OpenAPI document are the contract; ignore fields you do not know. - The video routes.
/v1/videosand/v1/videos/latestpass through one public YouTube channel feed (a fan channel, not NRFA): latest 15 uploads only, refreshed by YouTube about every 15 minutes and cached here for about 10, with a best-effort stale fallback. Nothing about them is derived, stored or history-tracked. - Source formats. NRFA can change how it writes posts at any time. The API is built for that (unknown stays
null), but new formats may be read less completely at first.
Incomplete upstream information
Section titled “Incomplete upstream information”- A post can announce a result without the teams, or a time without a venue. You get exactly that, with
nullfor the rest. - A post can carry several matches, or none. Both are valid.
- The same message can be edited. Use history to see every version the collector observed.
sourceTimestampis what the source said, normalized to UTC. It is not guaranteed to be plausible or in order, which is why ordering never trusts it alone.
Practical notes
Section titled “Practical notes”- CORS: read-only and open. Public
GETresponses under/v1/*,/openapi.jsonand/llms.txtcarryAccess-Control-Allow-Origin: *, so a web page on any origin can read them.OPTIONSpreflights on the public read routes are answered withAccess-Control-Allow-Methods: GET, OPTIONS(nothing else is allowed, no custom request headers, and credentials are never allowed). The internal write routes and the site pages send no CORS headers. - Errors. Errors are a JSON object
{"error":"..."}with status400(invalidcursor,since,afterorrawUpdateId),404(unknown route or message, or nothing stored yet for/v1/latest) or500(internal error). - Read-only. Only
GETis defined on the public routes.