An official site of the Provincial Government of South Cotabato

Skip to content
CATCH-UP Data BankProvince of South Cotabato

API documentation

The same official data as this site, as JSON and CSV. It needs no key or account, and it reads only public fields. It is for researchers, developers, and partner offices who want to reuse the data.

Download the OpenAPI documentOpenAPI 3.1. Use it to generate a client or to import the API into a tool.

License and attribution

The data is licensed CC BY 4.0. https://creativecommons.org/licenses/by/4.0/

The license is provisional until the Provincial Office confirms it.

Credit the data as: Province of South Cotabato, CATCH-UP Convergence Data Bank

Base URL and versions

Base URL

https://catchup.alvinjay.site/api/public/v1

Only GET, HEAD, and OPTIONS are accepted. Every response is JSON in UTF-8, except photos (a redirect) and reports (a file).

  • Additive changes stay in v1: new endpoints, new fields in a response, new indicator keys, new option keys, and new query parameters whose defaults keep today's behavior. Ignore fields you don't know.
  • Anything else is v2: removing or renaming a field or parameter, or changing a type or a value's meaning. v1 keeps working for at least 12 months after v2 appears, and this page announces its end date.
  • A change to an indicator formula is not an API change. It raises indicatorVersion in meta, and the indicator definitions page says what changed.

Conventions

  • Every success response is an envelope: data, meta, and page on lists only.
  • meta carries apiVersion, dataVersion, dataChangedAt, indicatorVersion, license, and attribution. dataChangedAt is when the public data last changed, not the time of your request.
  • Values are stored keys, not labels: option keys, indicator keys, PSGC codes, and { "other": "text" }. Labels come from /definitions. Places and sitios also carry their name.
  • Names are camelCase and follow the stored field names, such as sitioCode and implementationStatus.
  • Dates are ISO: YYYY-MM-DD for calendar dates and UTC timestamps ending in Z for instants.
  • Numbers are unrounded. Round for display only; the response gives the parts (n and d) so you can re-aggregate correctly.
  • Query names match the site's: y (as-of year), m (municipality), b (barangay), gida. A bad query is a 400 validation error with details.issues.
  • CORS is open: Access-Control-Allow-Origin is * on every response. There are no credentials, and the API never reads cookies.

Values and missing data

Every indicator value, at any level, has one shape. status says how to read it. No missing value is ever 0.

FieldContent
statusok, noData, updating, absent, or notApplicable.
valueA number when status is ok, otherwise null. Sums: n. Ratios: n / d × scale. Never present on a distribution.
nSums and ratios: the numerator total. Distributions: an object of bucket key to total, other included.
dRatios and distributions: the denominator total.
sitiosThe number of sitios contributing.
StatusMeaning
noDataThe area has no reporting sitio, or the sitio has no approved profile up to y.
updatingThe indicator is being recalculated. Try again shortly; no parts are given.
absentNo sitio contributes a value.
notApplicableA ratio whose denominator is 0.
okA value is given.

Statuses are decided in the order listed.

Pagination

Lists take limit (default 100, at most 500) and an opaque cursor. Pass page.nextCursor as cursor to get the next page; it is null on the last page. The same URL is also sent in a Link header with rel="next". Order is stable: sitios by municipality, barangay, name, then id; projects by name, then id.

Caching

Responses carry an ETag that changes only when the public data does, and Cache-Control: public, max-age=60. Send If-None-Match to get a 304 with no body when nothing changed. Photos redirect (302) to a short-lived signed URL, so don't store that URL.

Rate limits

Requests are limited per client address, in three classes. Over a limit, the API answers 429 rateLimited with a Retry-After header (seconds) and details.limitClass. Wait that long before retrying.

ClassApplies to
apiData endpoints, definitions, and search.
photosThe photo redirect.
reportsPDF and CSV reports. Rendering is limited, so a busy server answers 503 unavailable.

Errors

Errors have one shape, with a stable code to branch on:

{ "error": { "code": "validation", "message": "…", "details": {} } }
HTTPcodeWhen
400validationBad query: unknown place or key, b not in m, limit over 500, a malformed cursor.
404notFoundUnknown or unpublished sitio, project, place, or photo.
409indicatorsUpdatingReports only: an indicator in the report is being recalculated.
422noDataReports only: no approved profile up to y.
429rateLimitedOver a limit. Retry-After gives the seconds to wait.
503unavailableReports only: every public render slot is busy.
500internalA bug on our side.

Endpoints

Paths are relative to the base URL.

GET/

Links to every endpoint, years with data, latest year.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/ApiIndex"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "ApiIndex": {
      "type": "object",
      "properties": {
        "endpoints": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "summary": {
                "type": "string"
              }
            },
            "required": [
              "path",
              "url",
              "summary"
            ],
            "additionalProperties": false
          }
        },
        "years": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          }
        },
        "latestYear": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "endpoints",
        "years",
        "latestYear"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/definitions

Public indicators, profile fields, custom fields, and place labels.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/definitions"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/Definitions"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "Definitions": {
      "type": "object",
      "properties": {
        "indicators": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/IndicatorDefinition"
          }
        },
        "profileFields": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/ProfileFieldDefinition"
          }
        },
        "customFields": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/ProfileFieldDefinition"
          }
        },
        "placeLevels": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "required": [
        "indicators",
        "profileFields",
        "customFields",
        "placeLevels"
      ],
      "additionalProperties": false
    },
    "IndicatorDefinition": {
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "label": {
          "type": "string"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "section": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "sum",
            "ratio",
            "distribution"
          ]
        },
        "shareOfSitios": {
          "type": "boolean"
        },
        "unit": {
          "type": [
            "string",
            "null"
          ]
        },
        "scale": {
          "type": [
            "number",
            "null"
          ]
        },
        "family": {
          "type": [
            "string",
            "null"
          ]
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ],
            "additionalProperties": false
          }
        },
        "custom": {
          "type": "boolean"
        },
        "unitLabel": {
          "description": "Custom indicators: the administrator's free-text unit.",
          "type": "string"
        }
      },
      "required": [
        "key",
        "label",
        "description",
        "section",
        "kind",
        "shareOfSitios",
        "unit",
        "scale",
        "family"
      ],
      "additionalProperties": false
    },
    "ProfileFieldDefinition": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string"
        },
        "label": {
          "type": "string"
        },
        "section": {
          "type": "string"
        },
        "kind": {
          "type": "string"
        },
        "unit": {
          "type": [
            "string",
            "null"
          ]
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "key",
              "label"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "path",
        "label",
        "section",
        "kind"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/places

Every municipality and barangay.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/places"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/Places"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "Places": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Place"
      }
    },
    "Place": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "level": {
          "type": "string",
          "enum": [
            "municipality",
            "barangay"
          ]
        },
        "parentCode": {
          "type": [
            "string",
            "null"
          ]
        },
        "isActive": {
          "type": "boolean"
        },
        "sitioCount": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "code",
        "name",
        "level",
        "parentCode",
        "isActive",
        "sitioCount"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/sitios

Sitios with official core info.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/sitios?m=1206306000&limit=50"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Sitio"
      }
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    },
    "page": {
      "$ref": "#/$defs/PublicPage"
    }
  },
  "required": [
    "data",
    "meta",
    "page"
  ],
  "additionalProperties": false,
  "$defs": {
    "Sitio": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "sitioCode": {
          "type": [
            "string",
            "null"
          ]
        },
        "municipality": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "barangay": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "longitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "isGida": {
          "description": "null when GIDA status is not recorded.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "profileYears": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "description": "Ascending."
        },
        "updatedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        }
      },
      "required": [
        "id",
        "name",
        "sitioCode",
        "municipality",
        "barangay",
        "latitude",
        "longitude",
        "isGida",
        "profileYears"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    },
    "PublicPage": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "nextCursor": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "total",
        "nextCursor"
      ],
      "additionalProperties": false,
      "description": "Present on lists only."
    }
  }
}

GET/sitios/{sitioId}

One sitio.

Returns JSON. Limit class: api.

ParameterType 
sitioIdPathstringrequired

Sitio id.

Example

curl "https://catchup.alvinjay.site/api/public/v1/sitios/<sitioId>"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/Sitio"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "Sitio": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "sitioCode": {
          "type": [
            "string",
            "null"
          ]
        },
        "municipality": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "barangay": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "longitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "isGida": {
          "description": "null when GIDA status is not recorded.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "profileYears": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "description": "Ascending."
        },
        "updatedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        }
      },
      "required": [
        "id",
        "name",
        "sitioCode",
        "municipality",
        "barangay",
        "latitude",
        "longitude",
        "isGida",
        "profileYears"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/sitios/{sitioId}/profile

The profile in use as of Y.

Returns JSON. Limit class: api.

ParameterType 
sitioIdPathstringrequired

Sitio id.

Example

curl "https://catchup.alvinjay.site/api/public/v1/sitios/<sitioId>/profile?y=2026"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/SitioProfile"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "SitioProfile": {
      "type": "object",
      "properties": {
        "sitio": {
          "$ref": "#/$defs/Sitio"
        },
        "asOfYear": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "dataYear": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "revision": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "approvedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "profile": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        "otherMappings": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/OtherMapping"
          }
        },
        "photos": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Photo"
          }
        },
        "indicators": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "$ref": "#/$defs/IndicatorValue"
          }
        }
      },
      "required": [
        "sitio",
        "asOfYear",
        "dataYear"
      ],
      "additionalProperties": false
    },
    "Sitio": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "sitioCode": {
          "type": [
            "string",
            "null"
          ]
        },
        "municipality": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "barangay": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "latitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "longitude": {
          "type": [
            "number",
            "null"
          ]
        },
        "isGida": {
          "description": "null when GIDA status is not recorded.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "profileYears": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "description": "Ascending."
        },
        "updatedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        }
      },
      "required": [
        "id",
        "name",
        "sitioCode",
        "municipality",
        "barangay",
        "latitude",
        "longitude",
        "isGida",
        "profileYears"
      ],
      "additionalProperties": false
    },
    "OtherMapping": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string"
        },
        "text": {
          "type": "string"
        },
        "countedAs": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "path",
        "text",
        "countedAs"
      ],
      "additionalProperties": false
    },
    "Photo": {
      "type": "object",
      "properties": {
        "fileId": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "thumbnailUrl": {
          "type": "string"
        },
        "caption": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "fileId",
        "url",
        "thumbnailUrl"
      ],
      "additionalProperties": false
    },
    "IndicatorValue": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "ok"
            },
            "value": {
              "type": "number"
            },
            "n": {
              "type": "number"
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status",
            "value",
            "n"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "ok"
            },
            "n": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "number"
              }
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status",
            "n",
            "d"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "enum": [
                "noData",
                "absent",
                "notApplicable"
              ]
            },
            "value": {
              "type": "null"
            },
            "n": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "number"
                  }
                }
              ]
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "updating"
            },
            "value": {
              "type": "null"
            }
          },
          "required": [
            "status",
            "value"
          ],
          "additionalProperties": false
        }
      ],
      "description": "One shape at every level. `value` is a number only when status is `ok` (and absent on a distribution, whose `n` is a bucket map); `updating` carries no parts. A missing value is never 0."
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/aggregates

One area rolled up as of Y, and optionally its child areas.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/aggregates?y=2026&m=1206306000&children=1"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/Aggregates"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "Aggregates": {
      "type": "object",
      "properties": {
        "area": {
          "$ref": "#/$defs/Area"
        },
        "asOfYear": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "gidaOnly": {
          "type": "boolean"
        },
        "coverage": {
          "$ref": "#/$defs/Coverage"
        },
        "values": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "$ref": "#/$defs/IndicatorValue"
          }
        },
        "otherPriorityNeeds": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/OtherPriorityNeed"
          }
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AggregateChild"
          }
        }
      },
      "required": [
        "area",
        "asOfYear",
        "gidaOnly",
        "coverage",
        "values",
        "otherPriorityNeeds"
      ],
      "additionalProperties": false
    },
    "Area": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        },
        "path": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AreaRef"
          }
        }
      },
      "required": [
        "level",
        "code",
        "name",
        "path"
      ],
      "additionalProperties": false,
      "description": "An area and its ancestors, province first."
    },
    "AreaRef": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "level",
        "code",
        "name"
      ],
      "additionalProperties": false
    },
    "Coverage": {
      "type": "object",
      "properties": {
        "sitioCount": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "sitiosReporting": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "sitiosOlderThanY": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataYears": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          }
        }
      },
      "required": [
        "sitioCount",
        "sitiosReporting",
        "sitiosOlderThanY",
        "dataYears"
      ],
      "additionalProperties": false
    },
    "IndicatorValue": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "ok"
            },
            "value": {
              "type": "number"
            },
            "n": {
              "type": "number"
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status",
            "value",
            "n"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "ok"
            },
            "n": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "number"
              }
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status",
            "n",
            "d"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "enum": [
                "noData",
                "absent",
                "notApplicable"
              ]
            },
            "value": {
              "type": "null"
            },
            "n": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "number"
                  }
                }
              ]
            },
            "d": {
              "type": "number"
            },
            "sitios": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "const": "updating"
            },
            "value": {
              "type": "null"
            }
          },
          "required": [
            "status",
            "value"
          ],
          "additionalProperties": false
        }
      ],
      "description": "One shape at every level. `value` is a number only when status is `ok` (and absent on a distribution, whose `n` is a bucket map); `updating` carries no parts. A missing value is never 0."
    },
    "OtherPriorityNeed": {
      "type": "object",
      "properties": {
        "text": {
          "type": "string"
        },
        "priorityLevel": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "sitio": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "name"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "text",
        "priorityLevel",
        "sitio"
      ],
      "additionalProperties": false
    },
    "AggregateChild": {
      "type": "object",
      "properties": {
        "area": {
          "$ref": "#/$defs/AreaRef"
        },
        "dataYear": {
          "description": "Sitios only.",
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "coverage": {
          "$ref": "#/$defs/ChildCoverage"
        },
        "values": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "$ref": "#/$defs/IndicatorValue"
          }
        }
      },
      "required": [
        "area",
        "values"
      ],
      "additionalProperties": false
    },
    "ChildCoverage": {
      "description": "As `coverage`, without `dataYears`.",
      "type": "object",
      "properties": {
        "sitioCount": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "sitiosReporting": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "sitiosOlderThanY": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "sitioCount",
        "sitiosReporting",
        "sitiosOlderThanY"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

An example only: the values are made up and change with the data.

Example response
{
  "data": {
    "area": {
      "level": "municipality",
      "code": "1206306000",
      "name": "Koronadal"
    },
    "asOfYear": 2026,
    "gidaOnly": false,
    "coverage": {
      "sitioCount": 52,
      "sitiosReporting": 48,
      "sitiosOlderThanY": 6
    },
    "values": {
      "population": {
        "status": "ok",
        "value": 12480,
        "n": 12480,
        "sitios": 48
      },
      "electricityAccessRate": {
        "status": "ok",
        "value": 71.39,
        "n": 2114,
        "d": 2961,
        "sitios": 46
      },
      "custom:householdsWithSolarCount": {
        "status": "updating",
        "value": null
      }
    }
  },
  "meta": {
    "apiVersion": 1,
    "dataVersion": 1843
  }
}

GET/projects

Current official, non-archived projects.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/projects?m=1206306000&status=ongoing&limit=50"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Project"
      }
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    },
    "page": {
      "$ref": "#/$defs/PublicPage"
    }
  },
  "required": [
    "data",
    "meta",
    "page"
  ],
  "additionalProperties": false,
  "$defs": {
    "Project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "category": {
          "type": "string"
        },
        "implementationStatus": {
          "type": "string"
        },
        "startDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "endDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "type": [
            "string",
            "null"
          ]
        },
        "supportingDocumentsOrReferences": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "latitude": {
                "type": "number"
              },
              "longitude": {
                "type": "number"
              }
            },
            "required": [
              "latitude",
              "longitude"
            ],
            "additionalProperties": false
          }
        },
        "coverageAreas": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "coverageType": {
                "type": "string",
                "enum": [
                  "sitio",
                  "barangay",
                  "municipality"
                ]
              },
              "areaId": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "path": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/AreaRef"
                }
              }
            },
            "required": [
              "coverageType",
              "areaId",
              "name",
              "path"
            ],
            "additionalProperties": false
          }
        },
        "photos": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Photo"
          }
        },
        "revision": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "approvedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        }
      },
      "required": [
        "id",
        "name",
        "category",
        "implementationStatus",
        "startDate",
        "endDate",
        "coverageAreas",
        "photos",
        "revision",
        "approvedAt"
      ],
      "additionalProperties": false
    },
    "AreaRef": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "level",
        "code",
        "name"
      ],
      "additionalProperties": false
    },
    "Photo": {
      "type": "object",
      "properties": {
        "fileId": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "thumbnailUrl": {
          "type": "string"
        },
        "caption": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "fileId",
        "url",
        "thumbnailUrl"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    },
    "PublicPage": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "nextCursor": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "total",
        "nextCursor"
      ],
      "additionalProperties": false,
      "description": "Present on lists only."
    }
  }
}

GET/projects/{projectId}

One project.

Returns JSON. Limit class: api.

ParameterType 
projectIdPathstringrequired

Example

curl "https://catchup.alvinjay.site/api/public/v1/projects/<projectId>"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/Project"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "Project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "category": {
          "type": "string"
        },
        "implementationStatus": {
          "type": "string"
        },
        "startDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "endDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "type": [
            "string",
            "null"
          ]
        },
        "supportingDocumentsOrReferences": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "latitude": {
                "type": "number"
              },
              "longitude": {
                "type": "number"
              }
            },
            "required": [
              "latitude",
              "longitude"
            ],
            "additionalProperties": false
          }
        },
        "coverageAreas": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "coverageType": {
                "type": "string",
                "enum": [
                  "sitio",
                  "barangay",
                  "municipality"
                ]
              },
              "areaId": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "path": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/AreaRef"
                }
              }
            },
            "required": [
              "coverageType",
              "areaId",
              "name",
              "path"
            ],
            "additionalProperties": false
          }
        },
        "photos": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Photo"
          }
        },
        "revision": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "approvedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        }
      },
      "required": [
        "id",
        "name",
        "category",
        "implementationStatus",
        "startDate",
        "endDate",
        "coverageAreas",
        "photos",
        "revision",
        "approvedAt"
      ],
      "additionalProperties": false
    },
    "AreaRef": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "level",
        "code",
        "name"
      ],
      "additionalProperties": false
    },
    "Photo": {
      "type": "object",
      "properties": {
        "fileId": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "thumbnailUrl": {
          "type": "string"
        },
        "caption": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "fileId",
        "url",
        "thumbnailUrl"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/coverage

Projects covering one place, grouped direct, areaWide, and within.

Returns JSON. Limit class: api.

No parameters.

Example

curl "https://catchup.alvinjay.site/api/public/v1/coverage?m=1206306000"
Response schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/$defs/CoverageGroups"
    },
    "meta": {
      "$ref": "#/$defs/PublicMeta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "$defs": {
    "CoverageGroups": {
      "type": "object",
      "properties": {
        "area": {
          "$ref": "#/$defs/Area"
        },
        "direct": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CoverageRow"
          }
        },
        "areaWide": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CoverageRow"
          }
        },
        "within": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CoverageRow"
          }
        }
      },
      "required": [
        "area",
        "direct",
        "areaWide",
        "within"
      ],
      "additionalProperties": false
    },
    "Area": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        },
        "path": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AreaRef"
          }
        }
      },
      "required": [
        "level",
        "code",
        "name",
        "path"
      ],
      "additionalProperties": false,
      "description": "An area and its ancestors, province first."
    },
    "AreaRef": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "province",
            "municipality",
            "barangay",
            "sitio"
          ]
        },
        "code": {
          "description": "PSGC code; the sitio id for a sitio; null for the province.",
          "type": [
            "string",
            "null"
          ]
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "level",
        "code",
        "name"
      ],
      "additionalProperties": false
    },
    "CoverageRow": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "startDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "endDate": {
          "anyOf": [
            {
              "type": "string",
              "description": "Calendar date, YYYY-MM-DD."
            },
            {
              "type": "null"
            }
          ]
        },
        "via": {
          "description": "Area-wide rows: the containing area the coverage lists.",
          "type": "object",
          "properties": {
            "level": {
              "type": "string",
              "enum": [
                "barangay",
                "municipality"
              ]
            },
            "code": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "level",
            "code",
            "name"
          ],
          "additionalProperties": false
        },
        "withinCount": {
          "description": "Within rows: what the project covers inside this area.",
          "type": "object",
          "properties": {
            "sitios": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "barangays": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "sitios",
            "barangays"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "name",
        "category",
        "status",
        "startDate",
        "endDate"
      ],
      "additionalProperties": false
    },
    "PublicMeta": {
      "type": "object",
      "properties": {
        "apiVersion": {
          "type": "number",
          "const": 1
        },
        "dataVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "dataChangedAt": {
          "type": "string",
          "description": "UTC timestamp, ISO 8601 with Z."
        },
        "indicatorVersion": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "attribution": {
          "type": "string"
        }
      },
      "required": [
        "apiVersion",
        "dataVersion",
        "dataChangedAt",
        "indicatorVersion",
        "license",
        "attribution"
      ],
      "additionalProperties": false,
      "description": "Provenance of every response."
    }
  }
}

GET/photos/{fileId}

302 to a presigned URL of a public photo.

Redirects (302) to a presigned URL. Limit class: photos.

ParameterType 
fileIdPathstringrequired

Example

curl -L -o photo.jpg "https://catchup.alvinjay.site/api/public/v1/photos/<fileId>?size=thumb"

GET/reports/aggregate

The public aggregate report, PDF or CSV.

Returns a file: application/pdf, text/csv. Limit class: reports.

No parameters.

Example

curl -OJ "https://catchup.alvinjay.site/api/public/v1/reports/aggregate?y=2026&m=1206306000&format=pdf"

GET/reports/sitios/{sitioId}

The public sitio profile report, PDF or CSV.

Returns a file: application/pdf, text/csv. Limit class: reports.

ParameterType 
sitioIdPathstringrequired

Sitio id.

Example

curl -OJ "https://catchup.alvinjay.site/api/public/v1/reports/sitios/<sitioId>?y=2026&format=csv"

GET/reports/profiles

Every sitio's public profile as of Y, one CSV.

Returns a file: text/csv. Limit class: reports.

No parameters.

Example

curl -OJ "https://catchup.alvinjay.site/api/public/v1/reports/profiles?y=2026"

GET/openapi.json

The OpenAPI 3.1 document.

Limit class: api.

curl -O "https://catchup.alvinjay.site/api/public/v1/openapi.json"