{
  "openapi": "3.1.0",
  "info": {
    "title": "F-Fix public API",
    "version": "1.0.0",
    "description": "Maintenance and repair dispatch in Thailand, trilingual (th/zh/en). The endpoints below are read-only and unauthenticated — safe for any agent to call directly, no key required. Writing a job request is NOT part of this anonymous surface: an agent acting for a consumer must request a signed hand-off link and have the human confirm it in the app; a partner system integrates via a bearer token against a separately issued MCP endpoint. Price figures (content.{locale}.priceBands in /api/services/{serviceKey}.json) are market reference ranges in THB, not quotations — every band carries its own `currency` field, and the amount charged is the technician’s quotation, priced from the details the customer submits and confirmed by the customer before any visit is scheduled. Relay the caveat and the currency with the number, never the number alone."
  },
  "servers": [
    {
      "url": "https://f-fix.com"
    }
  ],
  "externalDocs": {
    "description": "Human-and-machine-readable documentation, including the write-access boundary and curl examples",
    "url": "https://f-fix.com/th/agents/"
  },
  "paths": {
    "/api/catalog.json": {
      "get": {
        "summary": "Opened sectors and services with trilingual labels and page urls",
        "description": "Every opened service category, trilingual. `url` names a locale only where a page for it has actually been published (never a link that 404s); `api` always resolves. `services` spans two sectors (see the `note` field and each entry's `sector`) — do not read services.length alone as a single, unambiguous \"job type count\".",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "generatedFrom": {
                      "type": "string"
                    },
                    "sourceHash": {
                      "type": "string"
                    },
                    "note": {
                      "type": "string"
                    },
                    "sectors": {
                      "type": "array",
                      "description": "No technician headcount is published for a sector — see the `note` field above.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "labelEn": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key",
                          "labelEn"
                        ]
                      }
                    },
                    "services": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "sector": {
                            "type": "string"
                          },
                          "label": {
                            "type": "object",
                            "properties": {
                              "th": {
                                "type": "string"
                              },
                              "zh": {
                                "type": "string"
                              },
                              "en": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "th",
                              "zh",
                              "en"
                            ]
                          },
                          "url": {
                            "type": "object",
                            "description": "Present only for locales with a real published page — never a link that 404s.",
                            "properties": {
                              "th": {
                                "type": "string",
                                "format": "uri"
                              },
                              "zh": {
                                "type": "string",
                                "format": "uri"
                              },
                              "en": {
                                "type": "string",
                                "format": "uri"
                              }
                            }
                          },
                          "api": {
                            "type": "string",
                            "format": "uri",
                            "description": "Always resolves — see /api/services/{serviceKey}.json."
                          }
                        },
                        "required": [
                          "key",
                          "sector",
                          "label",
                          "url",
                          "api"
                        ]
                      }
                    }
                  },
                  "required": [
                    "generatedFrom",
                    "sourceHash",
                    "sectors",
                    "services"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/coverage.json": {
      "get": {
        "summary": "Provinces and service categories with a technician on file, plus the nationwide coverage policy",
        "description": "All provinces with recorded supply, not only the ones with a dedicated page — coverage is reported truthfully even where no page exists yet for that province. No technician count is published anywhere in this payload — a business decision (see the top-level `note` field), not a gap in this data: relay WHICH provinces and service categories are covered, never a headcount. `coveragePolicy.provincesServed` is a SEPARATE, owner-declared fact — which provinces F-Fix will accept a job in (77, all of Thailand) — never derived from and never comparable to the `provinces` list below; relay the right one for the question actually being asked (\"will you take this job\" vs \"is a technician on file there today\").",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "generatedFrom": {
                      "type": "string"
                    },
                    "coveragePolicy": {
                      "type": "object",
                      "description": "An owner-declared business policy — which provinces F-Fix will accept a job in — never a registry export and never a technician headcount. See `provinces` below for which provinces currently have a technician on file (a different question: what the business accepts, not who is on file today).",
                      "properties": {
                        "provincesServed": {
                          "type": "integer",
                          "description": "Owner-declared: provinces F-Fix accepts a job in (77 — all of Thailand)."
                        },
                        "note": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "provincesServed"
                      ]
                    },
                    "note": {
                      "type": "string",
                      "description": "No technician headcount is published anywhere in this payload — a business decision, not a gap in this data."
                    },
                    "provinces": {
                      "type": "array",
                      "description": "Every province with at least one technician on file today — no per-province or per-service count is included.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "label": {
                            "type": "object",
                            "properties": {
                              "th": {
                                "type": "string"
                              },
                              "zh": {
                                "type": "string"
                              },
                              "en": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "th",
                              "zh",
                              "en"
                            ]
                          },
                          "url": {
                            "type": "object",
                            "description": "Present only for locales with a real published page — never a link that 404s.",
                            "properties": {
                              "th": {
                                "type": "string",
                                "format": "uri"
                              },
                              "zh": {
                                "type": "string",
                                "format": "uri"
                              },
                              "en": {
                                "type": "string",
                                "format": "uri"
                              }
                            }
                          },
                          "services": {
                            "type": "array",
                            "description": "Service categories with at least one technician on file in this province — labels only, no count.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "key": {
                                  "type": "string"
                                },
                                "label": {
                                  "type": "object",
                                  "properties": {
                                    "th": {
                                      "type": "string"
                                    },
                                    "zh": {
                                      "type": "string"
                                    },
                                    "en": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "th",
                                    "zh",
                                    "en"
                                  ]
                                }
                              },
                              "required": [
                                "key",
                                "label"
                              ]
                            }
                          }
                        },
                        "required": [
                          "key",
                          "label",
                          "url",
                          "services"
                        ]
                      }
                    }
                  },
                  "required": [
                    "generatedFrom",
                    "coveragePolicy",
                    "provinces"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/guides.json": {
      "get": {
        "summary": "Do-it-yourself repair guides for common household faults, with their safety limits",
        "description": "Every guide is grounded in cited authority (manufacturer documentation, a standards body, a utility or a government agency) — see each locale content block's `sources`. TWO FIELDS MUST TRAVEL WITH THE STEPS AND MUST NOT BE STRIPPED: `safetyStops` (what must not be attempted at all) and `whenToCallAProfessional` (the point at which the job stops being the reader's). Relaying a procedure without its limits is worse than relaying nothing. No guide states a repair cost anywhere in this payload, by design — reference price ranges live in /api/services/{serviceKey}.json where the disclaimer is attached to them, and each guide links to its own price guide via `pricingUrl`. `guideId` is the guide's identity across locales; the per-locale URL slug is authored separately (Thai script for th) and is not derivable from it, so use `url` rather than constructing a path. `content` is keyed by exactly the locales named in `locales` and is never backfilled from another language.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "note": {
                      "type": "string"
                    },
                    "publishedAt": {
                      "type": "string"
                    },
                    "guides": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "guideId": {
                            "type": "string",
                            "description": "Stable identity across locales. The per-locale URL slug is NOT this value."
                          },
                          "serviceKey": {
                            "type": "string",
                            "description": "A key from /api/catalog.json services[].key — always a maintenance_repair node."
                          },
                          "serviceLabel": {
                            "type": "object",
                            "properties": {
                              "th": {
                                "type": "string"
                              },
                              "zh": {
                                "type": "string"
                              },
                              "en": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "th",
                              "zh",
                              "en"
                            ]
                          },
                          "difficulty": {
                            "type": "string",
                            "enum": [
                              "easy",
                              "moderate"
                            ]
                          },
                          "timeMinutes": {
                            "type": "object",
                            "properties": {
                              "min": {
                                "type": "integer"
                              },
                              "max": {
                                "type": "integer"
                              }
                            },
                            "required": [
                              "min",
                              "max"
                            ]
                          },
                          "locales": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "th",
                                "zh",
                                "en"
                              ]
                            }
                          },
                          "url": {
                            "type": "object",
                            "description": "Present only for locales with a real published page — never a link that 404s.",
                            "properties": {
                              "th": {
                                "type": "string",
                                "format": "uri"
                              },
                              "zh": {
                                "type": "string",
                                "format": "uri"
                              },
                              "en": {
                                "type": "string",
                                "format": "uri"
                              }
                            }
                          },
                          "serviceUrl": {
                            "type": "object",
                            "description": "Present only for locales with a real published page — never a link that 404s.",
                            "properties": {
                              "th": {
                                "type": "string",
                                "format": "uri"
                              },
                              "zh": {
                                "type": "string",
                                "format": "uri"
                              },
                              "en": {
                                "type": "string",
                                "format": "uri"
                              }
                            }
                          },
                          "pricingUrl": {
                            "type": "object",
                            "description": "Present only for locales with a real published page — never a link that 404s.",
                            "properties": {
                              "th": {
                                "type": "string",
                                "format": "uri"
                              },
                              "zh": {
                                "type": "string",
                                "format": "uri"
                              },
                              "en": {
                                "type": "string",
                                "format": "uri"
                              }
                            }
                          },
                          "content": {
                            "type": "object",
                            "description": "Keyed by exactly the locales named in `locales` — never backfilled from another locale.",
                            "properties": {
                              "th": {
                                "type": "object",
                                "properties": {
                                  "title": {
                                    "type": "string"
                                  },
                                  "fault": {
                                    "type": "string",
                                    "description": "The fault in the reader’s own words — what they would search for."
                                  },
                                  "summary": {
                                    "type": "string"
                                  },
                                  "tools": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "parts": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Generic component names. Never a part number, brand or price."
                                  },
                                  "steps": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "position": {
                                          "type": "integer"
                                        },
                                        "name": {
                                          "type": "string"
                                        },
                                        "text": {
                                          "type": "string"
                                        },
                                        "caution": {
                                          "type": "string",
                                          "description": "Present when this specific step has a caution. Relay it with the step."
                                        }
                                      },
                                      "required": [
                                        "position",
                                        "name",
                                        "text"
                                      ]
                                    }
                                  },
                                  "safetyStops": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Things that must not be attempted at all. NOT optional context: relay these with the steps, never strip them. A procedure without its limits is worse advice than no procedure."
                                  },
                                  "whenToCallAProfessional": {
                                    "type": "object",
                                    "description": "The point at which the job stops being the reader’s. Every guide has one, by schema requirement — a guide without it fails this site’s build and does not ship.",
                                    "properties": {
                                      "summary": {
                                        "type": "string"
                                      },
                                      "signs": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      }
                                    },
                                    "required": [
                                      "summary",
                                      "signs"
                                    ]
                                  },
                                  "sources": {
                                    "type": "array",
                                    "description": "The cited authority each step rests on. At least one per guide, by schema requirement.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "title": {
                                          "type": "string"
                                        },
                                        "publisher": {
                                          "type": "string"
                                        },
                                        "url": {
                                          "type": "string",
                                          "format": "uri"
                                        },
                                        "lang": {
                                          "type": "string",
                                          "enum": [
                                            "th",
                                            "en"
                                          ]
                                        },
                                        "kind": {
                                          "type": "string",
                                          "enum": [
                                            "document",
                                            "page",
                                            "video"
                                          ]
                                        }
                                      },
                                      "required": [
                                        "title",
                                        "publisher",
                                        "url",
                                        "lang",
                                        "kind"
                                      ]
                                    }
                                  }
                                },
                                "required": [
                                  "title",
                                  "fault",
                                  "summary",
                                  "tools",
                                  "steps",
                                  "safetyStops",
                                  "whenToCallAProfessional",
                                  "sources"
                                ]
                              },
                              "zh": {
                                "type": "object",
                                "properties": {
                                  "title": {
                                    "type": "string"
                                  },
                                  "fault": {
                                    "type": "string",
                                    "description": "The fault in the reader’s own words — what they would search for."
                                  },
                                  "summary": {
                                    "type": "string"
                                  },
                                  "tools": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "parts": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Generic component names. Never a part number, brand or price."
                                  },
                                  "steps": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "position": {
                                          "type": "integer"
                                        },
                                        "name": {
                                          "type": "string"
                                        },
                                        "text": {
                                          "type": "string"
                                        },
                                        "caution": {
                                          "type": "string",
                                          "description": "Present when this specific step has a caution. Relay it with the step."
                                        }
                                      },
                                      "required": [
                                        "position",
                                        "name",
                                        "text"
                                      ]
                                    }
                                  },
                                  "safetyStops": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Things that must not be attempted at all. NOT optional context: relay these with the steps, never strip them. A procedure without its limits is worse advice than no procedure."
                                  },
                                  "whenToCallAProfessional": {
                                    "type": "object",
                                    "description": "The point at which the job stops being the reader’s. Every guide has one, by schema requirement — a guide without it fails this site’s build and does not ship.",
                                    "properties": {
                                      "summary": {
                                        "type": "string"
                                      },
                                      "signs": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      }
                                    },
                                    "required": [
                                      "summary",
                                      "signs"
                                    ]
                                  },
                                  "sources": {
                                    "type": "array",
                                    "description": "The cited authority each step rests on. At least one per guide, by schema requirement.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "title": {
                                          "type": "string"
                                        },
                                        "publisher": {
                                          "type": "string"
                                        },
                                        "url": {
                                          "type": "string",
                                          "format": "uri"
                                        },
                                        "lang": {
                                          "type": "string",
                                          "enum": [
                                            "th",
                                            "en"
                                          ]
                                        },
                                        "kind": {
                                          "type": "string",
                                          "enum": [
                                            "document",
                                            "page",
                                            "video"
                                          ]
                                        }
                                      },
                                      "required": [
                                        "title",
                                        "publisher",
                                        "url",
                                        "lang",
                                        "kind"
                                      ]
                                    }
                                  }
                                },
                                "required": [
                                  "title",
                                  "fault",
                                  "summary",
                                  "tools",
                                  "steps",
                                  "safetyStops",
                                  "whenToCallAProfessional",
                                  "sources"
                                ]
                              },
                              "en": {
                                "type": "object",
                                "properties": {
                                  "title": {
                                    "type": "string"
                                  },
                                  "fault": {
                                    "type": "string",
                                    "description": "The fault in the reader’s own words — what they would search for."
                                  },
                                  "summary": {
                                    "type": "string"
                                  },
                                  "tools": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "parts": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Generic component names. Never a part number, brand or price."
                                  },
                                  "steps": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "position": {
                                          "type": "integer"
                                        },
                                        "name": {
                                          "type": "string"
                                        },
                                        "text": {
                                          "type": "string"
                                        },
                                        "caution": {
                                          "type": "string",
                                          "description": "Present when this specific step has a caution. Relay it with the step."
                                        }
                                      },
                                      "required": [
                                        "position",
                                        "name",
                                        "text"
                                      ]
                                    }
                                  },
                                  "safetyStops": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Things that must not be attempted at all. NOT optional context: relay these with the steps, never strip them. A procedure without its limits is worse advice than no procedure."
                                  },
                                  "whenToCallAProfessional": {
                                    "type": "object",
                                    "description": "The point at which the job stops being the reader’s. Every guide has one, by schema requirement — a guide without it fails this site’s build and does not ship.",
                                    "properties": {
                                      "summary": {
                                        "type": "string"
                                      },
                                      "signs": {
                                        "type": "array",
                                        "items": {
                                          "type": "string"
                                        }
                                      }
                                    },
                                    "required": [
                                      "summary",
                                      "signs"
                                    ]
                                  },
                                  "sources": {
                                    "type": "array",
                                    "description": "The cited authority each step rests on. At least one per guide, by schema requirement.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "title": {
                                          "type": "string"
                                        },
                                        "publisher": {
                                          "type": "string"
                                        },
                                        "url": {
                                          "type": "string",
                                          "format": "uri"
                                        },
                                        "lang": {
                                          "type": "string",
                                          "enum": [
                                            "th",
                                            "en"
                                          ]
                                        },
                                        "kind": {
                                          "type": "string",
                                          "enum": [
                                            "document",
                                            "page",
                                            "video"
                                          ]
                                        }
                                      },
                                      "required": [
                                        "title",
                                        "publisher",
                                        "url",
                                        "lang",
                                        "kind"
                                      ]
                                    }
                                  }
                                },
                                "required": [
                                  "title",
                                  "fault",
                                  "summary",
                                  "tools",
                                  "steps",
                                  "safetyStops",
                                  "whenToCallAProfessional",
                                  "sources"
                                ]
                              }
                            }
                          }
                        },
                        "required": [
                          "guideId",
                          "serviceKey",
                          "serviceLabel",
                          "difficulty",
                          "timeMinutes",
                          "locales",
                          "url",
                          "content"
                        ]
                      }
                    }
                  },
                  "required": [
                    "note",
                    "publishedAt",
                    "guides"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/services/{serviceKey}.json": {
      "get": {
        "summary": "One service: price bands, price drivers, FAQ per locale, plus business-wide commitments",
        "description": "`label` is trilingual and `priceDisclaimer` is always present, even for a service with no content at all. Every priceBands entry carries its own `currency` (THB) — never relay min/max without it. The localisable fields (price bands, price drivers, FAQ) are keyed by locale under `content`; `locales` names exactly which of `th`/`zh`/`en` are present. A locale absent from `locales` has no entry in `content` — it is never backfilled from another locale’s document, so `content.zh` (when present) is always genuinely Chinese, never untranslated Thai. `commitments` (responseTimeHours, warrantyDays, guaranteesRework) is a separate top-level object, not locale-keyed content — a warranty or response-time promise is made once by the business, not once per language. `responseTimeHours` is a count of HOURS (not days — see warrantyDays's own self-documenting unit for the same convention). The whole `commitments` object is present only once the owner has actually set at least one of the three; an agent must never infer a commitment the business has not made from its absence.",
        "parameters": [
          {
            "name": "serviceKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "A key from /api/catalog.json services[].key"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "label": {
                      "type": "object",
                      "properties": {
                        "th": {
                          "type": "string"
                        },
                        "zh": {
                          "type": "string"
                        },
                        "en": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "th",
                        "zh",
                        "en"
                      ]
                    },
                    "priceDisclaimer": {
                      "type": "string"
                    },
                    "locales": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "th",
                          "zh",
                          "en"
                        ]
                      }
                    },
                    "content": {
                      "type": "object",
                      "description": "Keyed by exactly the locales named in `locales` — never backfilled from another locale.",
                      "properties": {
                        "th": {
                          "type": "object",
                          "properties": {
                            "priceBands": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "item": {
                                    "type": "string"
                                  },
                                  "min": {
                                    "type": "number"
                                  },
                                  "max": {
                                    "type": "number"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "description": "The billing basis (e.g. per unit, per job) — NOT a currency."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "const": "THB",
                                    "description": "ISO 4217 currency code every min/max is denominated in."
                                  }
                                },
                                "required": [
                                  "item",
                                  "min",
                                  "max",
                                  "unit",
                                  "currency"
                                ]
                              }
                            },
                            "priceDrivers": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "faq": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "q": {
                                    "type": "string"
                                  },
                                  "a": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "q",
                                  "a"
                                ]
                              }
                            }
                          },
                          "required": [
                            "priceBands",
                            "priceDrivers",
                            "faq"
                          ]
                        },
                        "zh": {
                          "type": "object",
                          "properties": {
                            "priceBands": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "item": {
                                    "type": "string"
                                  },
                                  "min": {
                                    "type": "number"
                                  },
                                  "max": {
                                    "type": "number"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "description": "The billing basis (e.g. per unit, per job) — NOT a currency."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "const": "THB",
                                    "description": "ISO 4217 currency code every min/max is denominated in."
                                  }
                                },
                                "required": [
                                  "item",
                                  "min",
                                  "max",
                                  "unit",
                                  "currency"
                                ]
                              }
                            },
                            "priceDrivers": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "faq": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "q": {
                                    "type": "string"
                                  },
                                  "a": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "q",
                                  "a"
                                ]
                              }
                            }
                          },
                          "required": [
                            "priceBands",
                            "priceDrivers",
                            "faq"
                          ]
                        },
                        "en": {
                          "type": "object",
                          "properties": {
                            "priceBands": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "item": {
                                    "type": "string"
                                  },
                                  "min": {
                                    "type": "number"
                                  },
                                  "max": {
                                    "type": "number"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "description": "The billing basis (e.g. per unit, per job) — NOT a currency."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "const": "THB",
                                    "description": "ISO 4217 currency code every min/max is denominated in."
                                  }
                                },
                                "required": [
                                  "item",
                                  "min",
                                  "max",
                                  "unit",
                                  "currency"
                                ]
                              }
                            },
                            "priceDrivers": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "faq": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "q": {
                                    "type": "string"
                                  },
                                  "a": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "q",
                                  "a"
                                ]
                              }
                            }
                          },
                          "required": [
                            "priceBands",
                            "priceDrivers",
                            "faq"
                          ]
                        }
                      }
                    },
                    "commitments": {
                      "type": "object",
                      "description": "Present only once the business has actually set at least one of these — never inferred from absence.",
                      "properties": {
                        "responseTimeHours": {
                          "type": "integer",
                          "description": "Number of HOURS, not days — see the sibling warrantyDays for the same self-documenting-unit convention."
                        },
                        "warrantyDays": {
                          "type": "integer",
                          "description": "Number of days."
                        },
                        "guaranteesRework": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "priceDisclaimer",
                    "locales",
                    "content"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}