{
  "eventType": "queue.numbers.requested",
  "apiVersion": "v1",
  "userAgent": "Mediflo-Queue-Routing/1",
  "headers": [
    {
      "name": "Mediflo-Signature",
      "description": "Podpis HMAC-SHA256: `t=<unix>,v1=<hex>`. W okresie rotacji sekretu dwa wpisy `v1`."
    },
    {
      "name": "Mediflo-Event-Id",
      "description": "Identyfikator zapytania (`evt_…`), taki sam jak pole `id`."
    },
    {
      "name": "Mediflo-Event-Type",
      "description": "Zawsze `queue.numbers.requested`."
    },
    {
      "name": "Mediflo-Event-Test",
      "description": "`true` tylko dla zapytania testowego z Portalu. Nikt nie czeka wtedy na połączenie."
    },
    {
      "name": "User-Agent",
      "description": "`Mediflo-Queue-Routing/1`"
    }
  ],
  "limits": {
    "maxDialNumbers": 10,
    "maxResponseEntries": 50,
    "maxResponseBytes": 16384,
    "maxLabelLength": 80,
    "timeoutMs": {
      "min": 1000,
      "max": 5000,
      "default": 3000
    }
  },
  "sampleRequest": {
    "id": "evt_7f1c2d4e-8a9b-4c3d-9e0f-1a2b3c4d5e6f",
    "type": "queue.numbers.requested",
    "apiVersion": "v1",
    "occurredAt": "2026-10-01T08:15:02.120Z",
    "data": {
      "queue": {
        "id": "3b0f6c2e-5a4d-4f1e-9c8b-7a6d5e4f3c2b",
        "name": "Rejestracja"
      },
      "call": {
        "id": "9d8c7b6a-5f4e-4d3c-8b2a-1f0e9d8c7b6a",
        "calledNumber": "+48221234567",
        "enteredQueueAt": "2026-10-01T08:15:01.950Z"
      },
      "caller": {
        "phoneNumber": "+48600111222"
      }
    }
  },
  "sampleResponse": {
    "numbers": [
      {
        "phoneNumber": "+48600100200",
        "label": "dr Anna Nowak"
      },
      "+48600100300"
    ]
  },
  "requestJsonSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "pattern": "^evt_[0-9a-f-]{36}$"
      },
      "type": {
        "type": "string",
        "const": "queue.numbers.requested"
      },
      "apiVersion": {
        "type": "string",
        "const": "v1"
      },
      "occurredAt": {
        "type": "string",
        "format": "date-time",
        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
      },
      "data": {
        "type": "object",
        "properties": {
          "queue": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name"
            ],
            "additionalProperties": false
          },
          "call": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "calledNumber": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "enteredQueueAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              }
            },
            "required": [
              "id",
              "calledNumber",
              "enteredQueueAt"
            ],
            "additionalProperties": false
          },
          "caller": {
            "type": "object",
            "properties": {
              "phoneNumber": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "phoneNumber"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "queue",
          "call",
          "caller"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "id",
      "type",
      "apiVersion",
      "occurredAt",
      "data"
    ],
    "additionalProperties": false
  },
  "responseJsonSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "numbers": {
        "minItems": 1,
        "maxItems": 50,
        "type": "array",
        "items": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "object",
              "properties": {
                "phoneNumber": {
                  "type": "string"
                },
                "label": {
                  "type": "string",
                  "maxLength": 80
                }
              },
              "required": [
                "phoneNumber"
              ],
              "additionalProperties": false
            }
          ]
        }
      }
    },
    "required": [
      "numbers"
    ],
    "additionalProperties": false
  },
  "failureCodes": [
    {
      "code": "not_configured",
      "description": "Kolejka nie ma ustawionego adresu URL lub sekretu podpisu."
    },
    {
      "code": "secret_unavailable",
      "description": "Nie udało się odczytać sekretu podpisu kolejki."
    },
    {
      "code": "invalid_url",
      "description": "Adres URL jest nieprawidłowy (wymagany https, bez loginu i hasła w adresie)."
    },
    {
      "code": "host_not_allowed",
      "description": "Nie można połączyć się z hostem: nazwa nie istnieje albo wskazuje na sieć prywatną lub zastrzeżoną."
    },
    {
      "code": "timeout",
      "description": "Brak pełnej odpowiedzi w ustawionym czasie."
    },
    {
      "code": "network_error",
      "description": "Błąd połączenia (np. odrzucone połączenie lub błąd TLS)."
    },
    {
      "code": "redirect",
      "description": "Serwer odpowiedział przekierowaniem (3xx). Przekierowania nie są obsługiwane."
    },
    {
      "code": "http_status",
      "description": "Serwer zwrócił status HTTP spoza zakresu 2xx."
    },
    {
      "code": "response_too_large",
      "description": "Odpowiedź przekroczyła 16 KiB."
    },
    {
      "code": "invalid_json",
      "description": "Odpowiedź nie jest poprawnym JSON-em."
    },
    {
      "code": "invalid_body",
      "description": "JSON nie jest obiektem z tablicą `numbers` (maksymalnie 50 pozycji)."
    },
    {
      "code": "no_valid_numbers",
      "description": "Żaden zwrócony numer nie przeszedł walidacji."
    },
    {
      "code": "circuit_open",
      "description": "Kilka zapytań z rzędu zakończyło się błędem, więc przez 60 sekund Mediflo nie wysyła zapytań i od razu stosuje tryb awaryjny."
    },
    {
      "code": "interrupted",
      "description": "Zapytanie zostało przerwane po stronie Mediflo."
    }
  ],
  "rejectionReasons": [
    {
      "code": "invalid_entry",
      "description": "Pozycja nie jest napisem ani obiektem z polem tekstowym `phoneNumber`."
    },
    {
      "code": "invalid_number",
      "description": "To nie jest poprawny numer telefonu."
    },
    {
      "code": "country_unresolved",
      "description": "Nie udało się ustalić kraju numeru."
    },
    {
      "code": "country_not_allowed",
      "description": "Kraj numeru nie jest dozwolony w ustawieniach połączeń organizacji."
    },
    {
      "code": "premium_rate",
      "description": "Numer o podwyższonej opłacie."
    },
    {
      "code": "mediflo_number",
      "description": "Numer obsługiwany przez Mediflo (np. numer kliniki przekierowany do Mediflo). Połączenie wróciłoby do kolejki."
    },
    {
      "code": "caller_number",
      "description": "Numer osoby dzwoniącej."
    },
    {
      "code": "duplicate",
      "description": "Numer powtórzony na liście (liczy się pierwsze wystąpienie)."
    },
    {
      "code": "over_limit",
      "description": "Numer poza limitem 10 poprawnych numerów."
    }
  ]
}
