{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://staging-instasent-docs-nextjs.oscar-284.workers.dev/data/country-requirements.schema.json",
  "title": "Instasent country requirements",
  "description": "What each destination requires before you can send there, per country and per channel. Editorial reference maintained by Instasent — it is NOT a delivery guarantee, and it does not tell you whether a specific sender is cleared. That answer is per sender and comes from the readiness endpoint of the Product API.",
  "type": "object",
  "required": [
    "schemaVersion",
    "generatedAt",
    "countries"
  ],
  "properties": {
    "schemaVersion": {
      "type": "string",
      "description": "Additive-only contract: fields are added, enums grow, nothing is renamed."
    },
    "generatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "about": {
      "type": "object",
      "description": "Who publishes this and where the rest of the documentation is. `llms` holds the Markdown indexes an agent can follow to read any page without parsing HTML.",
      "properties": {
        "product": {
          "type": "object",
          "properties": {
            "en": {
              "type": "string"
            },
            "es": {
              "type": "string"
            }
          },
          "required": [
            "en",
            "es"
          ],
          "description": "What Instasent is, in one paragraph."
        },
        "vendor": {
          "type": "string",
          "description": "Who publishes this dataset."
        },
        "website": {
          "type": "string",
          "format": "uri",
          "description": "The product's own site."
        },
        "dashboard": {
          "type": "string",
          "format": "uri",
          "description": "Where a customer operates the product — senders are created and registrations requested here."
        },
        "docs": {
          "type": "string",
          "format": "uri",
          "description": "This documentation, on the deployment that served this file."
        },
        "llms": {
          "type": "object",
          "properties": {
            "all": {
              "type": "string",
              "format": "uri",
              "description": "Every page of every zone."
            },
            "platform": {
              "type": "object",
              "properties": {
                "en": {
                  "type": "string"
                },
                "es": {
                  "type": "string"
                }
              },
              "required": [
                "en",
                "es"
              ],
              "description": "Product documentation, per language."
            },
            "developers": {
              "type": "string",
              "format": "uri",
              "description": "The CDP's API documentation — Product API and Ingest API (English)."
            },
            "a2p": {
              "type": "string",
              "format": "uri",
              "description": "A2P Messaging API documentation, the messaging-only product (English)."
            }
          }
        }
      }
    },
    "authority": {
      "type": "object",
      "properties": {
        "en": {
          "type": "string"
        },
        "es": {
          "type": "string"
        }
      },
      "required": [
        "en",
        "es"
      ],
      "description": "Say this to the customer alongside any answer built from this data."
    },
    "policy": {
      "type": "object",
      "description": "How delivery works on each channel, condensed. Read this before answering from the per-country rows: the two channels differ in the way that matters most — on SMS an unregistered sender still gets a best-effort attempt, on RCS nothing is sent at all. Do not carry one channel's rule over to the other.",
      "properties": {
        "sms": {
          "type": "object",
          "properties": {
            "summary": {
              "type": "object",
              "properties": {
                "en": {
                  "type": "string"
                },
                "es": {
                  "type": "string"
                }
              },
              "required": [
                "en",
                "es"
              ],
              "description": "The channel's delivery policy in one paragraph."
            },
            "docs": {
              "type": "object",
              "properties": {
                "en": {
                  "type": "string"
                },
                "es": {
                  "type": "string"
                }
              },
              "required": [
                "en",
                "es"
              ],
              "description": "The page this summarises, per language."
            }
          }
        },
        "rcs": {
          "type": "object",
          "properties": {
            "summary": {
              "type": "object",
              "properties": {
                "en": {
                  "type": "string"
                },
                "es": {
                  "type": "string"
                }
              },
              "required": [
                "en",
                "es"
              ],
              "description": "The channel's delivery policy in one paragraph."
            },
            "docs": {
              "type": "object",
              "properties": {
                "en": {
                  "type": "string"
                },
                "es": {
                  "type": "string"
                }
              },
              "required": [
                "en",
                "es"
              ],
              "description": "The page this summarises, per language."
            }
          }
        }
      }
    },
    "countries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "country",
          "name",
          "channels"
        ],
        "properties": {
          "country": {
            "type": "string",
            "pattern": "^[A-Z]{2}$",
            "description": "ISO-3166 alpha-2."
          },
          "name": {
            "type": "object",
            "properties": {
              "en": {
                "type": "string"
              },
              "es": {
                "type": "string"
              }
            },
            "required": [
              "en",
              "es"
            ]
          },
          "description": {
            "type": "object",
            "properties": {
              "en": {
                "type": "string"
              },
              "es": {
                "type": "string"
              }
            },
            "required": [
              "en",
              "es"
            ]
          },
          "guides": {
            "type": "array",
            "description": "Step-by-step pages that live under this country.",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "title": {
                  "type": "object",
                  "properties": {
                    "en": {
                      "type": "string"
                    },
                    "es": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "en",
                    "es"
                  ]
                }
              }
            }
          },
          "channels": {
            "type": "object",
            "properties": {
              "sms": {
                "type": "object",
                "required": [
                  "availability"
                ],
                "properties": {
                  "availability": {
                    "enum": [
                      "available",
                      "unavailable"
                    ],
                    "description": "Whether the channel exists in this country at all — a product fact. `unavailable` means there is no operator there, NOT that requirements are unknown. An unavailable channel carries no `coverage`."
                  },
                  "coverage": {
                    "enum": [
                      "documented",
                      "no-requirements",
                      "not-reviewed"
                    ],
                    "description": "How well WE have documented this country, not the state of the product. `documented` = written up. `no-requirements` = we checked and the operator asks for nothing extra. `not-reviewed` = nobody has looked yet, so requirements may exist. Never treat `not-reviewed` as `no-requirements`: telling a customer they have nothing to do when nobody checked is the error this field exists to prevent."
                  },
                  "backend": {
                    "type": "object",
                    "description": "Mirrors the product's configuration for this country. `seededAt` is when it was copied; `verifiedAt` is the last time a person confirmed it.",
                    "properties": {
                      "senderBehaviour": {
                        "enum": [
                          "accepted",
                          "overridden",
                          "rejected",
                          "unknown"
                        ],
                        "description": "What reaches the recipient: `accepted` = your alias; `overridden` = something else, usually a number."
                      },
                      "registration": {
                        "enum": [
                          "required",
                          "recommended",
                          "unneeded",
                          "unknown"
                        ],
                        "description": "`unneeded` = creating the sender already gives you the country. `required` does NOT mean sending is blocked — it means the country drops out of the reach calculation until you register."
                      },
                      "regulator": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "name": {
                                "type": "object",
                                "properties": {
                                  "en": {
                                    "type": "string"
                                  },
                                  "es": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "en",
                                  "es"
                                ]
                              }
                            }
                          }
                        ]
                      },
                      "url": {
                        "type": "object",
                        "description": "What operators say about links in SMS. Recorded, not enforced.",
                        "properties": {
                          "send": {
                            "enum": [
                              "accepted",
                              "rejected"
                            ]
                          },
                          "registration": {
                            "enum": [
                              "required",
                              "recommended",
                              "unneeded",
                              "unknown"
                            ]
                          },
                          "behaviour": {
                            "enum": [
                              "accepted",
                              "rejected",
                              "overridden",
                              "removed",
                              "unknown"
                            ]
                          }
                        }
                      },
                      "seededAt": {
                        "type": "string",
                        "format": "date"
                      },
                      "source": {
                        "enum": [
                          "prod",
                          "pending-backend"
                        ],
                        "description": "`pending-backend` = the docs are deliberately ahead of the backend."
                      },
                      "verifiedAt": {
                        "oneOf": [
                          {
                            "type": "string",
                            "format": "date"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    }
                  },
                  "eligibility": {
                    "enum": [
                      "open",
                      "local-entity",
                      "local-traffic-only"
                    ],
                    "description": "A go/no-go before anything else: `local-entity` means no local company, no registration."
                  },
                  "patterns": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "authorization-letter",
                        "operator-email",
                        "brand-verification",
                        "optin-evidence",
                        "local-entity",
                        "content-language",
                        "monitored-inbox",
                        "keyword-optout",
                        "regulator-registration"
                      ]
                    },
                    "description": "The kind of thing you will be asked for. Each is explained once on the countries overview page."
                  },
                  "whoActs": {
                    "enum": [
                      "customer-signs",
                      "customer-sends",
                      "instasent",
                      "third-party",
                      "customer-or-instasent"
                    ],
                    "description": "Who moves first — the customer, us, or a third party that contacts them."
                  },
                  "prepare": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "es": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "description": "Material to have ready. Nouns, not instructions."
                  },
                  "leadTime": {
                    "type": "object",
                    "properties": {
                      "max": {
                        "type": "string",
                        "description": "ISO-8601 duration."
                      }
                    }
                  },
                  "fees": {
                    "const": "consult",
                    "description": "Present only when this channel charges something in this country, and then always the string `consult`: there is a fee and you have to ask us for the figure. Absent means nothing is charged. Amounts are deliberately not published."
                  },
                  "ifMissing": {
                    "enum": [
                      "best-effort",
                      "no-send"
                    ],
                    "description": "Without an approved registration. `best-effort` (SMS): the message is sent and billed, but the operator may change the sender or filter it. `no-send` (RCS): nothing goes out. Do not carry one channel's rule over to the other."
                  },
                  "restrictions": {
                    "type": "array",
                    "description": "What you may NOT send there, as opposed to what you must do first.",
                    "items": {
                      "type": "object",
                      "required": [
                        "type",
                        "summary"
                      ],
                      "properties": {
                        "type": {
                          "enum": [
                            "agent-type",
                            "message-purpose",
                            "content",
                            "time-window"
                          ]
                        },
                        "allowed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "summary": {
                          "type": "object",
                          "properties": {
                            "en": {
                              "type": "string"
                            },
                            "es": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "en",
                            "es"
                          ],
                          "description": "What the operator imposes."
                        },
                        "recommendation": {
                          "type": "object",
                          "properties": {
                            "en": {
                              "type": "string"
                            },
                            "es": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "en",
                            "es"
                          ],
                          "description": "What Instasent advises. NOT a requirement — never present it as one."
                        }
                      }
                    }
                  },
                  "notes": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "string"
                      },
                      "es": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "en",
                      "es"
                    ],
                    "description": "Plain Markdown. Context the structured fields can't hold; never a restatement of them."
                  }
                }
              },
              "rcs": {
                "type": "object",
                "required": [
                  "availability"
                ],
                "properties": {
                  "availability": {
                    "enum": [
                      "available",
                      "unavailable"
                    ],
                    "description": "Whether the channel exists in this country at all — a product fact. `unavailable` means there is no operator there, NOT that requirements are unknown. An unavailable channel carries no `coverage`."
                  },
                  "coverage": {
                    "enum": [
                      "documented",
                      "no-requirements",
                      "not-reviewed"
                    ],
                    "description": "How well WE have documented this country, not the state of the product. `documented` = written up. `no-requirements` = we checked and the operator asks for nothing extra. `not-reviewed` = nobody has looked yet, so requirements may exist. Never treat `not-reviewed` as `no-requirements`: telling a customer they have nothing to do when nobody checked is the error this field exists to prevent."
                  },
                  "backend": {
                    "type": "object",
                    "description": "Mirrors the product's configuration for this country. `seededAt` is when it was copied; `verifiedAt` is the last time a person confirmed it.",
                    "properties": {
                      "senderBehaviour": {
                        "enum": [
                          "accepted",
                          "overridden",
                          "rejected",
                          "unknown"
                        ],
                        "description": "What reaches the recipient: `accepted` = your alias; `overridden` = something else, usually a number."
                      },
                      "registration": {
                        "enum": [
                          "required",
                          "recommended",
                          "unneeded",
                          "unknown"
                        ],
                        "description": "`unneeded` = creating the sender already gives you the country. `required` does NOT mean sending is blocked — it means the country drops out of the reach calculation until you register."
                      },
                      "regulator": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "name": {
                                "type": "object",
                                "properties": {
                                  "en": {
                                    "type": "string"
                                  },
                                  "es": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "en",
                                  "es"
                                ]
                              }
                            }
                          }
                        ]
                      },
                      "url": {
                        "type": "object",
                        "description": "What operators say about links in SMS. Recorded, not enforced.",
                        "properties": {
                          "send": {
                            "enum": [
                              "accepted",
                              "rejected"
                            ]
                          },
                          "registration": {
                            "enum": [
                              "required",
                              "recommended",
                              "unneeded",
                              "unknown"
                            ]
                          },
                          "behaviour": {
                            "enum": [
                              "accepted",
                              "rejected",
                              "overridden",
                              "removed",
                              "unknown"
                            ]
                          }
                        }
                      },
                      "seededAt": {
                        "type": "string",
                        "format": "date"
                      },
                      "source": {
                        "enum": [
                          "prod",
                          "pending-backend"
                        ],
                        "description": "`pending-backend` = the docs are deliberately ahead of the backend."
                      },
                      "verifiedAt": {
                        "oneOf": [
                          {
                            "type": "string",
                            "format": "date"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    }
                  },
                  "eligibility": {
                    "enum": [
                      "open",
                      "local-entity",
                      "local-traffic-only"
                    ],
                    "description": "A go/no-go before anything else: `local-entity` means no local company, no registration."
                  },
                  "patterns": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "authorization-letter",
                        "operator-email",
                        "brand-verification",
                        "optin-evidence",
                        "local-entity",
                        "content-language",
                        "monitored-inbox",
                        "keyword-optout",
                        "regulator-registration"
                      ]
                    },
                    "description": "The kind of thing you will be asked for. Each is explained once on the countries overview page."
                  },
                  "whoActs": {
                    "enum": [
                      "customer-signs",
                      "customer-sends",
                      "instasent",
                      "third-party",
                      "customer-or-instasent"
                    ],
                    "description": "Who moves first — the customer, us, or a third party that contacts them."
                  },
                  "prepare": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "es": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "description": "Material to have ready. Nouns, not instructions."
                  },
                  "leadTime": {
                    "type": "object",
                    "properties": {
                      "max": {
                        "type": "string",
                        "description": "ISO-8601 duration."
                      }
                    }
                  },
                  "fees": {
                    "const": "consult",
                    "description": "Present only when this channel charges something in this country, and then always the string `consult`: there is a fee and you have to ask us for the figure. Absent means nothing is charged. Amounts are deliberately not published."
                  },
                  "ifMissing": {
                    "enum": [
                      "best-effort",
                      "no-send"
                    ],
                    "description": "Without an approved registration. `best-effort` (SMS): the message is sent and billed, but the operator may change the sender or filter it. `no-send` (RCS): nothing goes out. Do not carry one channel's rule over to the other."
                  },
                  "restrictions": {
                    "type": "array",
                    "description": "What you may NOT send there, as opposed to what you must do first.",
                    "items": {
                      "type": "object",
                      "required": [
                        "type",
                        "summary"
                      ],
                      "properties": {
                        "type": {
                          "enum": [
                            "agent-type",
                            "message-purpose",
                            "content",
                            "time-window"
                          ]
                        },
                        "allowed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "summary": {
                          "type": "object",
                          "properties": {
                            "en": {
                              "type": "string"
                            },
                            "es": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "en",
                            "es"
                          ],
                          "description": "What the operator imposes."
                        },
                        "recommendation": {
                          "type": "object",
                          "properties": {
                            "en": {
                              "type": "string"
                            },
                            "es": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "en",
                            "es"
                          ],
                          "description": "What Instasent advises. NOT a requirement — never present it as one."
                        }
                      }
                    }
                  },
                  "notes": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "string"
                      },
                      "es": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "en",
                      "es"
                    ],
                    "description": "Plain Markdown. Context the structured fields can't hold; never a restatement of them."
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
