{
  "openapi": "3.1.0",
  "info": {
    "title": "KarirAman open data API",
    "version": "1.0.0",
    "summary": "Static, read-only JSON files: no key, no personal data.",
    "description": "Indonesian minimum wages, official pay data, official reporting channels and Cek Loker rules, with sources for every row. Every file is a static GET; there are no parameters and no rate-limited endpoints.",
    "license": {
      "name": "Creative Commons Attribution 4.0 International",
      "identifier": "CC-BY-4.0"
    },
    "contact": {
      "name": "KarirAman",
      "email": "halo@kariraman.com",
      "url": "https://kariraman.com/en/developers/"
    }
  },
  "servers": [
    {
      "url": "https://kariraman.com"
    }
  ],
  "externalDocs": {
    "url": "https://kariraman.com/en/developers/"
  },
  "paths": {
    "/api/v1/index.json": {
      "get": {
        "operationId": "getCatalogue",
        "summary": "Catalogue of the published datasets",
        "responses": {
          "200": {
            "description": "Catalogue",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/minimum-wages/2026.json": {
      "get": {
        "operationId": "getUpahMinimum2026",
        "summary": "Indonesia minimum wages (UMP and UMK) 2026",
        "description": "Provincial minimum wages (UMP) and, where verified, city or regency minimum wages (UMK), with the governor decree, effective date, verification status and source for every row.",
        "responses": {
          "200": {
            "description": "Indonesia minimum wages (UMP and UMK) 2026. CSV: https://kariraman.com/data/upah-minimum-2026.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "upah-minimum-2026"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/UpahMinimum2026Row"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/salaries/official.json": {
      "get": {
        "operationId": "getGajiRataRataBps",
        "summary": "Average net wage of employees in Indonesia (BPS Sakernas)",
        "description": "Average net wage of employees from the BPS National Labour Force Survey (Sakernas), by group. These are group references, not the pay of one occupation. No third-party advertised ranges are included.",
        "responses": {
          "200": {
            "description": "Average net wage of employees in Indonesia (BPS Sakernas). CSV: https://kariraman.com/data/gaji-rata-rata-bps.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "gaji-rata-rata-bps"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GajiRataRataBpsRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/salaries/abroad.json": {
      "get": {
        "operationId": "getUpahMinimumLuarNegeri",
        "summary": "Statutory minimum pay in destination countries",
        "description": "Statutory pay floors in destination countries, in local currency, with the effective date and source for every row. These are not job offers.",
        "responses": {
          "200": {
            "description": "Statutory minimum pay in destination countries. CSV: https://kariraman.com/data/upah-minimum-luar-negeri.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "upah-minimum-luar-negeri"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/UpahMinimumLuarNegeriRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scam-statistics.json": {
      "get": {
        "operationId": "getStatistikPenipuan",
        "summary": "Job-scam and worker-protection statistics",
        "description": "Official figures on scam reports and migrant-worker cases, with the period, unit, verification status and source for every row.",
        "responses": {
          "200": {
            "description": "Job-scam and worker-protection statistics. CSV: https://kariraman.com/data/statistik-penipuan.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "statistik-penipuan"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StatistikPenipuanRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/channels.json": {
      "get": {
        "operationId": "getKanalResmi",
        "summary": "Official reporting and verification channels",
        "description": "Checked official government channels for complaints and verification, with the website, service numbers and the date they were checked.",
        "responses": {
          "200": {
            "description": "Official reporting and verification channels. CSV: https://kariraman.com/data/kanal-resmi.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "kanal-resmi"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/KanalResmiRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scam-rules.json": {
      "get": {
        "operationId": "getAturanCekLoker",
        "summary": "Cek Loker job-scam warning-sign rules",
        "description": "The rules the Cek Loker tool uses to spot warning signs of fake job ads: text patterns, weights, questions, explanations and sources.",
        "responses": {
          "200": {
            "description": "Cek Loker job-scam warning-sign rules. CSV: https://kariraman.com/data/aturan-cek-loker.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "aturan-cek-loker"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/AturanCekLokerRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/abroad-routes.json": {
      "get": {
        "operationId": "getJalurKerjaLuarNegeri",
        "summary": "Comparison of legal routes to work abroad",
        "description": "One row per legal route to work abroad verified in the last 120 days: country, job types, language tests, visa, the placement-cost rule, status as of the verification date, and sources for every row.",
        "responses": {
          "200": {
            "description": "Comparison of legal routes to work abroad. CSV: https://kariraman.com/data/jalur-kerja-luar-negeri.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "jalur-kerja-luar-negeri"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JalurKerjaLuarNegeriRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scam-report.json": {
      "get": {
        "operationId": "getLaporanLokerBodong",
        "summary": "Indonesia fake job report: official figures and scam taxonomy",
        "description": "The official figures the report cites (with period and source) and counts of the job-scam tactics KarirAman covers by severity and channel. No Cek Loker input or personal data.",
        "responses": {
          "200": {
            "description": "Indonesia fake job report: official figures and scam taxonomy. CSV: https://kariraman.com/data/laporan-loker-bodong.csv",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "const": "laporan-loker-bodong"
                    },
                    "title": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "description": {
                      "$ref": "#/components/schemas/Bilingual"
                    },
                    "dateModified": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date"
                    },
                    "rowCount": {
                      "type": "integer"
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/LaporanLokerBodongRow"
                      }
                    },
                    "sources": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Source"
                      }
                    }
                  },
                  "required": [
                    "name",
                    "rows",
                    "sources"
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Phone": {
        "type": "object",
        "properties": {
          "display": {
            "type": "string"
          },
          "tel": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "phone",
              "whatsapp"
            ]
          },
          "scope": {
            "type": "string",
            "enum": [
              "domestic",
              "abroad",
              "any"
            ]
          }
        },
        "required": [
          "display",
          "tel",
          "type",
          "scope"
        ]
      },
      "Bilingual": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "en": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "en"
        ]
      },
      "Source": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "publisher": {
            "type": "string"
          },
          "publisherType": {
            "type": "string"
          },
          "documentType": {
            "type": "string"
          },
          "legalId": {
            "type": "string"
          },
          "publishedDate": {
            "type": "string"
          },
          "accessedDate": {
            "type": "string"
          },
          "verification": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "url",
          "publisher",
          "accessedDate",
          "verification"
        ]
      },
      "UpahMinimum2026Row": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record id: year, BPS region code and kind."
          },
          "year": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Year the minimum wage applies to."
          },
          "kind": {
            "type": [
              "string",
              "null"
            ],
            "description": "UMP (province) or UMK (city or regency)."
          },
          "region_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BPS region code (2 digits for a province, 4 for a city or regency)."
          },
          "region_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official region name."
          },
          "region_level": {
            "type": [
              "string",
              "null"
            ],
            "description": "provinsi, kabupaten or kota."
          },
          "province_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BPS code of the province."
          },
          "province_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Province name."
          },
          "umk_status": {
            "type": [
              "string",
              "null"
            ],
            "description": "UMK rows only: set (a UMK was decreed) or follows_ump (no UMK; the UMP applies). Empty for UMP rows."
          },
          "amount_idr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Monthly minimum wage in rupiah, exactly as decreed (decimals kept)."
          },
          "previous_amount_idr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous year figure in rupiah, when known."
          },
          "decree": {
            "type": [
              "string",
              "null"
            ],
            "description": "Governor decree that sets the figure."
          },
          "decree_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the decree was signed, when known."
          },
          "effective_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the figure takes effect."
          },
          "legal_basis": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regulation the decree is based on."
          },
          "notes_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note in Indonesian."
          },
          "notes_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note in English."
          },
          "page_url_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "KarirAman page (Indonesian) that shows this row, when published."
          },
          "page_url_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "KarirAman page (English) that shows this row, when published."
          },
          "verification": {
            "type": [
              "string",
              "null"
            ],
            "description": "PRIMARY (official document read), OFFICIAL_VIA_MEDIA (official figure reported by media) or THIRD_PARTY."
          },
          "accessed_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the source was read (YYYY-MM-DD, Asia/Jakarta)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "GajiRataRataBpsRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record id."
          },
          "survey": {
            "type": [
              "string",
              "null"
            ],
            "description": "Survey name (BPS Sakernas)."
          },
          "round": {
            "type": [
              "string",
              "null"
            ],
            "description": "Survey round as published by BPS."
          },
          "breakdown": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grouping: national, sex, sector, education, province, occupation_major_group or age."
          },
          "breakdown_value": {
            "type": [
              "string",
              "null"
            ],
            "description": "Group label as published by BPS."
          },
          "region_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BPS region code, for province rows."
          },
          "region_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Region name, for province rows."
          },
          "isco_major_group": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISCO-08 major group, for occupation rows."
          },
          "kbli_version": {
            "type": [
              "string",
              "null"
            ],
            "description": "KBLI edition, for sector rows."
          },
          "mean": {
            "type": [
              "number",
              "null"
            ],
            "description": "Average (mean) wage for the group, in the currency and period given."
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 4217 currency code."
          },
          "period": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pay period: HOUR, DAY, WEEK, MONTH or YEAR."
          },
          "gross_or_net": {
            "type": [
              "string",
              "null"
            ],
            "description": "gross, net or unspecified."
          },
          "employment_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Employment type the figure covers."
          },
          "data_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Start of the period the figure describes."
          },
          "data_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "End of the period the figure describes."
          },
          "method_note_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the figure is and is not (Indonesian)."
          },
          "method_note_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the figure is and is not (English)."
          },
          "verification": {
            "type": [
              "string",
              "null"
            ],
            "description": "PRIMARY (official document read), OFFICIAL_VIA_MEDIA (official figure reported by media) or THIRD_PARTY."
          },
          "accessed_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the source was read (YYYY-MM-DD, Asia/Jakarta)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "UpahMinimumLuarNegeriRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record id."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 alpha-2 country code."
          },
          "subdivision": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-2 subdivision code, when the floor is regional."
          },
          "subdivision_name_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Subdivision name (Indonesian)."
          },
          "subdivision_name_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Subdivision name (English)."
          },
          "applies_to_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who the floor applies to (Indonesian)."
          },
          "applies_to_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who the floor applies to (English)."
          },
          "excludes_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who is excluded (Indonesian), when stated."
          },
          "excludes_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who is excluded (English), when stated."
          },
          "amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Statutory amount in the local currency, for the period given."
          },
          "previous_amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous statutory amount, when known."
          },
          "effective_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the amount takes effect."
          },
          "derived_from_hourly": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True when a monthly figure was calculated from an hourly minimum (a calculation, not a job offer)."
          },
          "is_average_not_floor": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True when the figure is a national average, not a legal floor."
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 4217 currency code."
          },
          "period": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pay period: HOUR, DAY, WEEK, MONTH or YEAR."
          },
          "gross_or_net": {
            "type": [
              "string",
              "null"
            ],
            "description": "gross, net or unspecified."
          },
          "employment_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Employment type the figure covers."
          },
          "data_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Start of the period the figure describes."
          },
          "data_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "End of the period the figure describes."
          },
          "method_note_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the figure is and is not (Indonesian)."
          },
          "method_note_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the figure is and is not (English)."
          },
          "verification": {
            "type": [
              "string",
              "null"
            ],
            "description": "PRIMARY (official document read), OFFICIAL_VIA_MEDIA (official figure reported by media) or THIRD_PARTY."
          },
          "accessed_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the source was read (YYYY-MM-DD, Asia/Jakarta)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "StatistikPenipuanRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record id."
          },
          "label_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "What is counted (Indonesian)."
          },
          "label_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "What is counted (English)."
          },
          "value": {
            "type": [
              "number",
              "null"
            ],
            "description": "The figure. Unit percent is 0 to 100; ratio is 0 to 1."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "count, idr, percent or ratio."
          },
          "period_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Start of the period, when stated."
          },
          "period_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "End of the period."
          },
          "region_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BPS region code, when the figure is regional."
          },
          "note_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note (Indonesian)."
          },
          "note_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note (English)."
          },
          "verification": {
            "type": [
              "string",
              "null"
            ],
            "description": "PRIMARY (official document read), OFFICIAL_VIA_MEDIA (official figure reported by media) or THIRD_PARTY."
          },
          "accessed_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the source was read (YYYY-MM-DD, Asia/Jakarta)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "KanalResmiRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Channel id."
          },
          "agency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Government agency that runs the channel."
          },
          "name_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Channel name (Indonesian)."
          },
          "name_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Channel name (English)."
          },
          "purpose_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "What to use it for (Indonesian)."
          },
          "purpose_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "What to use it for (English)."
          },
          "kind": {
            "type": [
              "string",
              "null"
            ],
            "description": "report, verify, hotline or portal."
          },
          "region_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BPS region code, for regional channels."
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official website of the channel."
          },
          "phones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Phone"
            },
            "description": "Official numbers: display form, dialable form (WhatsApp numbers in international form without \"+\"), type and scope (domestic, abroad or any)."
          },
          "verified_on_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official page where the details were checked."
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the details were checked."
          },
          "reachability": {
            "type": [
              "string",
              "null"
            ],
            "description": "Whether the official page answered when checked."
          }
        },
        "required": [
          "id"
        ]
      },
      "AturanCekLokerRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Rule id (R01 and up)."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Signal category."
          },
          "weight": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Weight 0 to 3. Any weight-3 match means high risk; weight 0 is a legal note that never changes the verdict."
          },
          "applies_to": {
            "type": [
              "string",
              "null"
            ],
            "description": "domestic, abroad or both."
          },
          "question_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Checklist question (Indonesian)."
          },
          "question_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Checklist question (English)."
          },
          "explanation_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Why it matters (Indonesian)."
          },
          "explanation_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Why it matters (English)."
          },
          "patterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Case-insensitive regular expressions (JavaScript syntax, flags \"iu\")."
          },
          "suppress_if_patterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Patterns that cancel a match when they occur nearby."
          },
          "suppress_if_window_tokens": {
            "type": [
              "integer",
              "null"
            ],
            "description": "How many words count as nearby for suppression."
          },
          "escalate_patterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Patterns that raise the weight to 3."
          },
          "escalate_with_rules": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Rules that raise the weight to 3 when they also match."
          },
          "modus": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Related scam pages (translation keys)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "JalurKerjaLuarNegeriRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Row id: destination key and the route slug (the anchor on the comparison page)."
          },
          "destination": {
            "type": [
              "string",
              "null"
            ],
            "description": "Destination key."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 alpha-2 country code (ZZ for a region)."
          },
          "route_name_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Route name (Indonesian)."
          },
          "route_name_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Route name (English)."
          },
          "official_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official scheme name in the destination language."
          },
          "official_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official page of the scheme."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "open, ballot, paused, suspended, closed, moratorium or not_eligible_for_id."
          },
          "status_since": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the status took effect, when known."
          },
          "last_verified": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the route was last checked."
          },
          "id_channels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Placement channels from Indonesia."
          },
          "cost_rule": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who pays placement costs: p3mi_employer, self_funded, g2g_announced or no_channel."
          },
          "age_min": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Minimum age, when stated."
          },
          "age_max": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Maximum age, when stated."
          },
          "language_tests": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Language tests and required level."
          },
          "visa_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official visa or permit name."
          },
          "job_types": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Job types the route covers."
          },
          "pay_floor_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the statutory pay floors (see the pay-abroad dataset)."
          },
          "best_for_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Editorial \"Cocok untuk\" note (Indonesian), not an official requirement."
          },
          "best_for_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "Editorial \"Best for\" note (English), not an official requirement."
          },
          "page_url_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "KarirAman route page (Indonesian)."
          },
          "page_url_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "KarirAman route page (English)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      },
      "LaporanLokerBodongRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Row id."
          },
          "kind": {
            "type": [
              "string",
              "null"
            ],
            "description": "statistic (an official figure the report cites) or modus_count (KarirAman taxonomy count)."
          },
          "dimension": {
            "type": [
              "string",
              "null"
            ],
            "description": "For modus counts: severity or channel. Empty for statistics."
          },
          "label_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "What is counted (Indonesian)."
          },
          "label_en": {
            "type": [
              "string",
              "null"
            ],
            "description": "What is counted (English)."
          },
          "value": {
            "type": [
              "number",
              "null"
            ],
            "description": "The figure. Unit percent is 0 to 100; ratio is 0 to 1."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "count, idr, percent or ratio."
          },
          "period_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Start of the period, when stated."
          },
          "period_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "End of the period (for modus counts: the build date of the taxonomy)."
          },
          "source_ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids of the sources behind this row (see the sources list)."
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "URLs of those sources, in the same order."
          },
          "source_publishers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Original publishers of those sources, in the same order."
          }
        },
        "required": [
          "id"
        ]
      }
    }
  }
}
