{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/przypominamy-com/json-schema/przypominamy-com-message-schema.json",
  "title": "Message",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/przypominamy-com-openapi.json#/components/schemas/Message",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "sms",
        "mms",
        "vms"
      ],
      "description": "Kanał: SMS, MMS, wiadomość głosowa"
    },
    "status": {
      "$ref": "#/$defs/MessageStatus"
    },
    "to": {
      "type": "string"
    },
    "from": {
      "type": [
        "string",
        "null"
      ]
    },
    "text": {
      "type": "string",
      "description": "Treść po personalizacji - dokładnie to, co dostał odbiorca (link opt-out, śledzone linki `api.przypominamy.com/l/…` i placeholdery już podstawione)"
    },
    "subject": {
      "type": [
        "string",
        "null"
      ],
      "description": "Temat (tylko MMS)"
    },
    "parts": {
      "type": "integer"
    },
    "cost_grosze": {
      "type": "integer",
      "description": "Koszt w groszach (0 dla odrzuconych; po anulowaniu zwrócony na saldo)"
    },
    "priority": {
      "type": "boolean",
      "description": "Czy wysłano jako SMS priorytetowy (podwójna stawka)"
    },
    "reference": {
      "type": [
        "string",
        "null"
      ]
    },
    "send_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "Termin wysyłki (po przesunięciu przez `send_window`, jeśli było)"
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "Koniec prób doręczenia, gdy podano `expires_at`"
    },
    "delivered_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "error": {
      "type": [
        "string",
        "null"
      ],
      "description": "Powód odrzucenia, gdy status = failed lub rejected (np. „Numer na czarnej liście (opt-out)”)"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  },
  "$defs": {
    "MessageStatus": {
      "type": "string",
      "enum": [
        "scheduled",
        "queued",
        "sent",
        "delivered",
        "undelivered",
        "failed",
        "expired",
        "rejected",
        "cancelled",
        "unknown"
      ],
      "description": "`scheduled` - zaplanowana (`send_at` lub przesunięta przez `send_window`); `queued` - przyjęta; `sent` - przekazana do sieci; `delivered` - doręczona; `undelivered` - niedoręczona; `failed` - odrzucona przez dostawcę; `rejected` - odrzucona przez nas (numer na czarnej liście, koszt 0); `expired` - wygasła (m.in. po `expires_at`); `cancelled` - zaplanowana wysyłka anulowana przez `DELETE /v1/messages/{id}`, koszt zwrócony; `unknown` - dostawca nie potwierdził (timeout / 5xx), saldo zarezerwowane do uzgodnienia po idx albo DLR"
    }
  }
}