{"components":{"responses":{},"schemas":{"InboundMessageSummary":{"description":"Podstawowe informacje o wiadomości przychodzącej (widok listy)","example":{"attachment_count":2,"from":{"email":"sender@external.com","name":"Sender Name"},"has_attachments":true,"id":"550e8400-e29b-41d4-a716-446655440000","is_spam":false,"received_at":"2025-01-15T10:30:00Z","subject":"Zapytanie o produkt","thread_id":"abc123...","to":{"email":"inbox@mydomain.com","name":null}},"properties":{"attachment_count":{"description":"Liczba załączników","type":"integer"},"from":{"$ref":"#/components/schemas/EmailAddress"},"has_attachments":{"description":"Czy wiadomość ma załączniki","type":"boolean"},"id":{"description":"Unikalny identyfikator wiadomości","format":"uuid","type":"string"},"is_spam":{"description":"Czy wiadomość została oznaczona jako spam","type":"boolean"},"received_at":{"description":"Data otrzymania wiadomości","format":"date-time","type":"string"},"subject":{"description":"Temat wiadomości","example":"Zapytanie o produkt","nullable":true,"type":"string"},"thread_id":{"description":"Identyfikator wątku","nullable":true,"type":"string"},"to":{"$ref":"#/components/schemas/EmailAddress"}},"title":"InboundMessageSummary","type":"object"},"CreateSuppressionRequest":{"description":"Dane do dodania wpisu do listy blokowanych/dozwolonych","properties":{"comment":{"description":"Opcjonalny komentarz (alias dla reason)","example":"Zgłoszenie od klienta","nullable":true,"type":"string"},"email":{"description":"Alias dla value - adres e-mail do zablokowania","example":"blocked@example.com","format":"email","type":"string"},"list_type":{"description":"Typ listy (domyślnie: blacklist)","enum":["blacklist","whitelist"],"example":"blacklist","type":"string"},"reason":{"description":"Powód blokady","example":"Hard bounce - adres nie istnieje","nullable":true,"type":"string"},"type":{"description":"Typ wpisu (domyślnie: email)","enum":["email","domain","ip"],"example":"email","type":"string"},"value":{"description":"Wartość do zablokowania (e-mail, domena lub IP)","example":"blocked@example.com","type":"string"}},"required":["value"],"title":"CreateSuppressionRequest","type":"object"},"RegisterRequest":{"description":"Dane do rejestracji nowego konta (organizacja + użytkownik + klucz API)","example":{"email":"jan.kowalski@example.com","org_name":"Moja Firma Sp. z o.o.","password":"bezpieczne-haslo-123"},"properties":{"email":{"description":"Adres e-mail użytkownika (będzie użyty do logowania)","example":"jan.kowalski@example.com","format":"email","type":"string"},"locale":{"description":"Preferred language for onboarding emails. If not provided, detected from Accept-Language header. Default: en","enum":["pl","en"],"example":"en","type":"string"},"org_name":{"description":"Nazwa organizacji","example":"Moja Firma Sp. z o.o.","type":"string"},"organization_name":{"description":"Alternatywna nazwa pola dla nazwy organizacji (alias dla org_name)","example":"Moja Firma Sp. z o.o.","type":"string"},"password":{"description":"Hasło (minimum 8 znaków)","example":"bezpieczne-haslo-123","format":"password","minLength":8,"type":"string"}},"required":["email","password","org_name"],"title":"RegisterRequest","type":"object"},"GdprActivityEntry":{"description":"Szczegóły czynności przetwarzania z rejestru Art. 30 RODO","example":{"activity_type":"automated","created_at":"2023-01-15T10:30:00Z","data_categories":["email","name"],"description":"Automatyczna wysyłka potwierdzeń zamówień","id":"550e8400-e29b-41d4-a716-446655440000","last_reviewed_at":"2024-01-01T10:00:00Z","legal_basis":"contract","legal_basis_details":"Art. 6 ust. 1 lit. b RODO","name":"Wysyłka transakcyjnych e-maili","next_review_at":"2025-01-01T10:00:00Z","purpose":"Realizacja umowy","recipient_categories":["customers"],"retention_period":"3 lata","security_measures":["encryption_at_rest","access_control"],"special_categories":[],"status":"active","third_party_recipients":[],"transfer_safeguards":null,"transfers_outside_eea":false,"updated_at":"2024-01-01T10:00:00Z"},"properties":{"activity_type":{"enum":["automated","manual","mixed"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"data_categories":{"items":{"type":"string"},"type":"array"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"last_reviewed_at":{"format":"date-time","nullable":true,"type":"string"},"legal_basis":{"enum":["consent","contract","legal_obligation","vital_interests","public_interest","legitimate_interests"],"type":"string"},"legal_basis_details":{"nullable":true,"type":"string"},"name":{"type":"string"},"next_review_at":{"format":"date-time","nullable":true,"type":"string"},"purpose":{"type":"string"},"recipient_categories":{"items":{"type":"string"},"type":"array"},"retention_period":{"type":"string"},"security_measures":{"items":{"type":"string"},"type":"array"},"special_categories":{"items":{"type":"string"},"type":"array"},"status":{"enum":["active","inactive","under_review"],"type":"string"},"third_party_recipients":{"items":{"type":"string"},"type":"array"},"transfer_safeguards":{"nullable":true,"type":"string"},"transfers_outside_eea":{"type":"boolean"},"updated_at":{"format":"date-time","type":"string"}},"title":"GdprActivityEntry","type":"object"},"SubscriptionResponse":{"description":"Szczegóły aktualnej subskrypcji organizacji","example":{"data":{"amount":9900,"cancel_at_period_end":false,"canceled_at":null,"created_at":"2023-12-01T10:00:00Z","currency":"PLN","current_period_end":"2024-02-01T00:00:00Z","current_period_start":"2024-01-01T00:00:00Z","features":{"api_keys":10,"dedicated_ip":false,"domains":5,"emails_per_month":50000,"log_retention_days":30,"support_level":"priority","webhooks":5},"id":"550e8400-e29b-41d4-a716-446655440000","interval":"monthly","plan":"professional","plan_name":"Professional","status":"active","trial_end":null,"trial_start":null}},"properties":{"data":{"properties":{"amount":{"description":"Kwota (w groszach)","type":"integer"},"cancel_at_period_end":{"description":"Czy anulowana na koniec okresu","type":"boolean"},"canceled_at":{"description":"Data anulowania","format":"date-time","nullable":true,"type":"string"},"created_at":{"format":"date-time","nullable":true,"type":"string"},"currency":{"description":"Waluta","type":"string"},"current_period_end":{"description":"Koniec bieżącego okresu","format":"date-time","nullable":true,"type":"string"},"current_period_start":{"description":"Początek bieżącego okresu","format":"date-time","nullable":true,"type":"string"},"features":{"$ref":"#/components/schemas/PlanFeatures"},"id":{"format":"uuid","nullable":true,"type":"string"},"interval":{"description":"Interwał rozliczeniowy","enum":["monthly","quarterly","yearly"],"nullable":true,"type":"string"},"plan":{"enum":["free","starter","professional","enterprise"],"type":"string"},"plan_name":{"description":"Nazwa planu","type":"string"},"status":{"description":"Status subskrypcji","enum":["active","past_due","canceled","trialing"],"type":"string"},"trial_end":{"description":"Koniec okresu próbnego","format":"date-time","nullable":true,"type":"string"},"trial_start":{"description":"Początek okresu próbnego","format":"date-time","nullable":true,"type":"string"}},"type":"object"}},"title":"SubscriptionResponse","type":"object"},"DomainResponse":{"description":"Szczegóły domeny wysyłkowej","example":{"data":{"created_at":"2024-01-14T09:00:00Z","dkim_public_key":"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4...","dkim_selector":"mailingapi","dkim_verified":true,"dmarc_verified":true,"id":"550e8400-e29b-41d4-a716-446655440000","name":"mail.example.com","spf_verified":true,"status":"verified","verified_at":"2024-01-15T10:30:00Z"}},"properties":{"data":{"properties":{"created_at":{"format":"date-time","type":"string"},"dkim_public_key":{"description":"Klucz publiczny DKIM do wstawienia w DNS","type":"string"},"dkim_selector":{"description":"Selektor DKIM (np. mailingapi)","type":"string"},"dkim_verified":{"description":"Czy DKIM jest zweryfikowany","type":"boolean"},"dmarc_verified":{"description":"Czy DMARC jest zweryfikowany","type":"boolean"},"id":{"format":"uuid","type":"string"},"name":{"description":"Nazwa domeny","type":"string"},"spf_verified":{"description":"Czy SPF jest zweryfikowany","type":"boolean"},"status":{"description":"Status weryfikacji domeny","enum":["pending","verified","failed"],"type":"string"},"verified_at":{"format":"date-time","nullable":true,"type":"string"}},"type":"object"}},"title":"DomainResponse","type":"object"},"GdprBreachListResponse":{"description":"Lista zarejestrowanych naruszeń ochrony danych","properties":{"data":{"items":{"$ref":"#/components/schemas/GdprBreachEntry"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba naruszeń","type":"integer"}},"type":"object"}},"title":"GdprBreachListResponse","type":"object"},"UpdateInboundRouteRequest":{"description":"Dane do aktualizacji reguły routingu przychodzących e-maili. Pole domain_id nie może zostać zmienione po utworzeniu reguły.","example":{"name":"Updated support tickets","priority":80,"status":"active"},"properties":{"action":{"description":"Akcja do wykonania","enum":["webhook","forward","store","drop"],"type":"string"},"action_config":{"additionalProperties":true,"description":"Konfiguracja akcji (URL webhooka, adres forwarding itp.)","type":"object"},"description":{"description":"Opis reguły","nullable":true,"type":"string"},"filters":{"additionalProperties":true,"description":"Dodatkowe filtry (np. po nagłówkach)","nullable":true,"type":"object"},"match_type":{"description":"Typ dopasowania","enum":["exact","prefix","suffix","regex","catchall"],"type":"string"},"name":{"description":"Nazwa reguły","example":"Support emails v2","type":"string"},"pattern":{"description":"Wzorzec do dopasowania (adres email lub jego część)","type":"string"},"priority":{"description":"Priorytet reguły (wyższy = ważniejszy)","maximum":100,"minimum":0,"type":"integer"},"status":{"description":"Status reguły","enum":["active","paused","disabled"],"type":"string"}},"title":"UpdateInboundRouteRequest","type":"object"},"InboundMessageResponse":{"description":"Szczegóły pojedynczej wiadomości przychodzącej","properties":{"data":{"$ref":"#/components/schemas/InboundMessageDetail"}},"title":"InboundMessageResponse","type":"object"},"AuditLogsListResponse":{"description":"Lista wpisów w logu audytu z paginacją","example":{"data":[{"action":"api_key.created","actor_id":"admin@example.com","actor_type":"user","changes":null,"created_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","ip_address":"192.168.1.100","metadata":null,"resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"api_key","user_agent":"Mozilla/5.0..."}],"limit":100,"offset":0,"total":42},"properties":{"data":{"items":{"properties":{"action":{"type":"string"},"actor_id":{"type":"string"},"actor_type":{"enum":["user","api_key","system"],"type":"string"},"changes":{"nullable":true,"type":"object"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"ip_address":{"nullable":true,"type":"string"},"metadata":{"nullable":true,"type":"object"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"type":"string"},"user_agent":{"nullable":true,"type":"string"}},"type":"object"},"type":"array"},"limit":{"description":"Limit wyników na stronę","type":"integer"},"offset":{"description":"Przesunięcie","type":"integer"},"total":{"description":"Całkowita liczba wyników","type":"integer"}},"title":"AuditLogsListResponse","type":"object"},"WebhookResponse":{"description":"Szczegóły konfiguracji webhooka","properties":{"data":{"properties":{"active":{"type":"boolean"},"created_at":{"format":"date-time","type":"string"},"description":{"nullable":true,"type":"string"},"events":{"items":{"type":"string"},"type":"array"},"id":{"format":"uuid","type":"string"},"last_status":{"enum":["success","failed"],"nullable":true,"type":"string"},"last_triggered_at":{"format":"date-time","nullable":true,"type":"string"},"secret":{"description":"Secret do weryfikacji podpisów (pokazany tylko przy tworzeniu)","type":"string"},"url":{"format":"uri","type":"string"}},"type":"object"}},"title":"WebhookResponse","type":"object"},"Lista wiadomości":{"properties":{"messages":{"description":"Lista wiadomości do wysłania (max 1000)","items":{"$ref":"#/components/schemas/SendMessageRequest"},"maxItems":1000,"type":"array"}},"required":["messages"],"title":"Lista wiadomości","type":"object"},"CheckConsentResponse":{"description":"Status zgody dla odbiorcy","example":{"has_consent":true,"status":"confirmed"},"properties":{"has_consent":{"description":"Czy odbiorca ma aktywną zgodę","type":"boolean"},"status":{"description":"Szczegółowy status zgody","enum":["confirmed","pending","none"],"type":"string"}},"title":"CheckConsentResponse","type":"object"},"RevokeAllConsentsResponse":{"description":"Odpowiedź po wycofaniu wszystkich zgód","example":{"message":"All consents revoked.","revoked_count":3},"properties":{"message":{"description":"Komunikat statusu","type":"string"},"revoked_count":{"description":"Liczba wycofanych zgód","type":"integer"}},"title":"RevokeAllConsentsResponse","type":"object"},"SuppressionEntry":{"description":"Szczegóły wpisu na liście","example":{"created_at":"2024-01-15T10:30:00Z","expires_at":null,"global":false,"hit_count":5,"id":"550e8400-e29b-41d4-a716-446655440000","last_hit_at":"2024-01-20T14:30:00Z","list_type":"blacklist","reason":"Hard bounce - adres nie istnieje","source":"bounce","type":"email","value":"blocked@example.com"},"properties":{"created_at":{"description":"Data utworzenia","format":"date-time","type":"string"},"expires_at":{"description":"Data wygaśnięcia wpisu","format":"date-time","nullable":true,"type":"string"},"global":{"description":"Czy wpis globalny (dla wszystkich organizacji)","type":"boolean"},"hit_count":{"description":"Liczba trafień (ile razy wpis został sprawdzony)","type":"integer"},"id":{"format":"uuid","type":"string"},"last_hit_at":{"description":"Data ostatniego trafienia","format":"date-time","nullable":true,"type":"string"},"list_type":{"description":"Typ listy","enum":["blacklist","whitelist"],"type":"string"},"reason":{"description":"Powód wpisu","nullable":true,"type":"string"},"source":{"description":"Źródło wpisu","enum":["manual","bounce","complaint","spam_trap","rbl","abuse"],"type":"string"},"type":{"description":"Typ wpisu","enum":["email","domain","ip"],"type":"string"},"value":{"description":"Wartość (e-mail, domena lub IP)","type":"string"}},"title":"SuppressionEntry","type":"object"},"PlansResponse":{"description":"Lista wszystkich dostępnych planów subskrypcyjnych","example":{"data":[{"api_keys":1,"dedicated_ip":false,"description":"Darmowy plan na start","domains":1,"emails_per_month":500,"features":[],"id":"free","log_retention_days":3,"name":"Free","pricing":{"monthly":0,"quarterly":0,"yearly":0},"rate_limit_per_minute":10,"support_level":"community","webhooks":1}],"meta":{"count":4,"currency":"PLN"}},"properties":{"data":{"items":{"$ref":"#/components/schemas/Plan"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba planów","type":"integer"},"currency":{"description":"Waluta cen","type":"string"}},"type":"object"}},"title":"PlansResponse","type":"object"},"GdprDeletionCancelRequest":{"description":"Anulowanie żądania usunięcia","properties":{"reason":{"description":"Powód anulowania żądania","example":"Użytkownik zmienił zdanie","nullable":true,"type":"string"}},"title":"GdprDeletionCancelRequest","type":"object"},"GdprDeadlineStatus":{"description":"Status 72-godzinnego terminu na powiadomienie organu (Art. 33 ust. 1)","example":{"remaining":"24h 15m","status":"warning"},"properties":{"overdue_by":{"description":"Przekroczenie terminu (format: Xh Ym)","example":"5h 15m","nullable":true,"type":"string"},"remaining":{"description":"Pozostały czas (format: Xh Ym)","example":"48h 30m","nullable":true,"type":"string"},"status":{"description":"Status terminu","enum":["ok","warning","urgent","overdue"],"type":"string"}},"title":"GdprDeadlineStatus","type":"object"},"BatchSendResponse":{"description":"Wyniki batch wysyłki - status każdej wiadomości","example":{"data":{"errors":1,"messages":[{"id":"550e8400-e29b-41d4-a716-446655440000","index":0,"status":"queued","to":"user1@example.com"},{"id":"550e8400-e29b-41d4-a716-446655440001","index":1,"status":"queued","to":"user2@example.com"},{"error":{"code":"validation_failed","details":{"to_email":["has invalid format"]},"message":"to_email: has invalid format"},"index":2,"status":"error","to":"invalid-email"}],"queued":2,"total":3}},"properties":{"data":{"properties":{"errors":{"description":"Liczba błędów","type":"integer"},"messages":{"items":{"properties":{"error":{"allOf":[{"$ref":"#/components/schemas/ErrorBody"}],"description":"Błąd (tylko gdy status = error): code jak dla /send (validation_failed, forbidden, bad_request, send_failed), message, details","nullable":true},"id":{"description":"ID wiadomości (jeśli sukces)","format":"uuid","nullable":true,"type":"string"},"index":{"description":"Indeks w żądaniu","type":"integer"},"status":{"description":"Status","enum":["queued","error"],"type":"string"},"to":{"description":"Odbiorca","format":"email","type":"string"}},"type":"object"},"type":"array"},"queued":{"description":"Liczba zakolejkowanych","type":"integer"},"total":{"description":"Łączna liczba wiadomości","type":"integer"}},"type":"object"}},"title":"BatchSendResponse","type":"object"},"InboundRouteResponse":{"description":"Szczegóły reguły routingu","properties":{"data":{"properties":{"action":{"enum":["webhook","forward","store","drop"],"type":"string"},"action_config":{"additionalProperties":true,"type":"object"},"created_at":{"format":"date-time","type":"string"},"description":{"nullable":true,"type":"string"},"domain_id":{"format":"uuid","type":"string"},"filters":{"nullable":true,"type":"object"},"id":{"format":"uuid","type":"string"},"match_type":{"enum":["exact","prefix","suffix","regex","catchall"],"type":"string"},"name":{"type":"string"},"pattern":{"type":"string"},"priority":{"type":"integer"},"stats":{"description":"Statystyki reguły","properties":{"last_matched_at":{"description":"Data ostatniego dopasowania","format":"date-time","nullable":true,"type":"string"},"matched_count":{"description":"Liczba dopasowanych wiadomości","type":"integer"}},"type":"object"},"status":{"description":"Status reguły","enum":["active","paused","disabled"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"}},"title":"InboundRouteResponse","type":"object"},"SingleValidationRequest":{"description":"Request do walidacji pojedynczego adresu email","example":{"email":"test@example.com","include_engagement":true,"skip_catchall":true,"skip_mx":false,"skip_smtp":false},"properties":{"email":{"description":"Adres email do walidacji","format":"email","type":"string"},"include_engagement":{"default":true,"description":"Dołącz engagement score (wymaga organization_id)","type":"boolean"},"skip_catchall":{"default":true,"description":"Pomiń wykrywanie catch-all","type":"boolean"},"skip_mx":{"default":false,"description":"Pomiń sprawdzanie rekordów MX","type":"boolean"},"skip_smtp":{"default":false,"description":"Pomiń weryfikację SMTP","type":"boolean"}},"required":["email"],"title":"SingleValidationRequest","type":"object"},"SuppressionStatsResponse":{"description":"Statystyki listy blokowanych","example":{"data":{"by_list_type":{"blacklist":1450,"whitelist":73},"by_source":{"abuse":8,"bounce":845,"complaint":312,"manual":298,"rbl":15,"spam_trap":45},"by_type":{"domain":250,"email":1200,"ip":73},"total":1523}},"properties":{"data":{"properties":{"by_list_type":{"description":"Liczba wpisów według typu listy","properties":{"blacklist":{"type":"integer"},"whitelist":{"type":"integer"}},"type":"object"},"by_source":{"description":"Liczba wpisów według źródła","properties":{"abuse":{"type":"integer"},"bounce":{"type":"integer"},"complaint":{"type":"integer"},"manual":{"type":"integer"},"rbl":{"type":"integer"},"spam_trap":{"type":"integer"}},"type":"object"},"by_type":{"description":"Liczba wpisów według typu","properties":{"domain":{"type":"integer"},"email":{"type":"integer"},"ip":{"type":"integer"}},"type":"object"},"total":{"description":"Łączna liczba wpisów","type":"integer"}},"type":"object"}},"title":"SuppressionStatsResponse","type":"object"},"GdprActivityListResponse":{"description":"Lista wpisów rejestru czynności przetwarzania","properties":{"data":{"items":{"$ref":"#/components/schemas/GdprActivityEntry"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba czynności","type":"integer"}},"type":"object"}},"title":"GdprActivityListResponse","type":"object"},"InboundRouteSummary":{"description":"Podstawowe informacje o regule routingu","properties":{"action":{"enum":["webhook","forward","store","drop"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"domain_id":{"format":"uuid","type":"string"},"id":{"format":"uuid","type":"string"},"last_matched_at":{"format":"date-time","nullable":true,"type":"string"},"match_type":{"enum":["exact","prefix","suffix","regex","catchall"],"type":"string"},"matched_count":{"type":"integer"},"name":{"type":"string"},"pattern":{"type":"string"},"priority":{"type":"integer"},"status":{"description":"Status reguły","enum":["active","paused","disabled"],"type":"string"}},"title":"InboundRouteSummary","type":"object"},"ErrorBody":{"properties":{"code":{"description":"Stabilny kod błędu dla maszyn, np. validation_failed, not_found, forbidden, conflict, rate_limit_exceeded, recipient_rate_limited, idempotency_key_reused","type":"string"},"details":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Błędy per pole (tylko validation_failed)","nullable":true,"type":"object"},"message":{"description":"Opis błędu dla ludzi","type":"string"},"retry_after":{"description":"Sekundy do ponowienia (tylko błędy 429)","nullable":true,"type":"integer"}},"required":["code","message"],"title":"ErrorBody","type":"object"},"VerifyEmailResponse":{"description":"Odpowiedź po pomyślnej weryfikacji adresu e-mail","example":{"data":{"organization":{"created_at":"2024-01-15T10:30:00Z","email":"jan.kowalski@example.com","id":"550e8400-e29b-41d4-a716-446655440000","name":"Moja Firma Sp. z o.o.","plan":"free","slug":"moja-firma-sp-z-oo","status":"active"},"status":"verified"},"message":"Adres e-mail został zweryfikowany. Konto jest aktywne."},"properties":{"data":{"properties":{"organization":{"properties":{"created_at":{"format":"date-time","type":"string"},"email":{"format":"email","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"plan":{"enum":["free","starter","pro","enterprise"],"type":"string"},"slug":{"type":"string"},"status":{"enum":["pending","active","suspended"],"type":"string"}},"type":"object"},"status":{"description":"Status weryfikacji","type":"string"}},"type":"object"},"message":{"description":"Komunikat potwierdzający","type":"string"}},"title":"VerifyEmailResponse","type":"object"},"PlanPricing":{"description":"Ceny planu dla różnych interwałów rozliczeniowych","example":{"monthly":9900,"quarterly":26700,"yearly":95000},"properties":{"monthly":{"description":"Cena miesięczna (w groszach)","nullable":true,"type":"integer"},"quarterly":{"description":"Cena kwartalna (w groszach)","nullable":true,"type":"integer"},"yearly":{"description":"Cena roczna (w groszach)","nullable":true,"type":"integer"}},"title":"PlanPricing","type":"object"},"GdprActivityUpdateRequest":{"description":"Dane do aktualizacji wpisu w rejestrze czynności przetwarzania","properties":{"activity_type":{"enum":["automated","manual","mixed"],"type":"string"},"data_categories":{"items":{"type":"string"},"type":"array"},"description":{"nullable":true,"type":"string"},"legal_basis":{"enum":["consent","contract","legal_obligation","vital_interests","public_interest","legitimate_interests"],"type":"string"},"legal_basis_details":{"nullable":true,"type":"string"},"name":{"type":"string"},"purpose":{"type":"string"},"recipient_categories":{"items":{"type":"string"},"type":"array"},"retention_period":{"type":"string"},"security_measures":{"items":{"type":"string"},"type":"array"},"special_categories":{"items":{"type":"string"},"type":"array"},"status":{"enum":["active","inactive","under_review"],"type":"string"},"third_party_recipients":{"items":{"type":"string"},"type":"array"},"transfer_safeguards":{"nullable":true,"type":"string"},"transfers_outside_eea":{"type":"boolean"}},"title":"GdprActivityUpdateRequest","type":"object"},"UpdatePreferencesRequest":{"description":"Dane do aktualizacji preferencji odbiorcy","example":{"preferences":{"marketing":true,"newsletter":false,"product_updates":true}},"properties":{"preferences":{"additionalProperties":{"type":"boolean"},"description":"Mapa typu zgody do wartości boolean (true = zgoda, false = brak zgody)","example":{"marketing":true,"newsletter":false,"product_updates":true},"type":"object"}},"title":"UpdatePreferencesRequest","type":"object"},"PlanFeatures":{"description":"Funkcjonalności dostępne w planie","example":{"api_keys":10,"dedicated_ip":false,"domains":5,"emails_per_month":50000,"log_retention_days":30,"support_level":"email","webhooks":5},"properties":{"api_keys":{"description":"Limit kluczy API","type":"integer"},"dedicated_ip":{"description":"Dedykowany adres IP","type":"boolean"},"domains":{"description":"Limit domen","type":"integer"},"emails_per_month":{"description":"Limit emaili miesięcznie","type":"integer"},"log_retention_days":{"description":"Dni retencji logów","type":"integer"},"support_level":{"description":"Poziom wsparcia","enum":["community","email","priority","dedicated"],"type":"string"},"webhooks":{"description":"Limit webhooków","type":"integer"}},"title":"PlanFeatures","type":"object"},"JobStatusResponse":{"properties":{"data":{"properties":{"completed_at":{"format":"date-time","nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"job_id":{"type":"string"},"processed":{"type":"integer"},"progress":{"maximum":100,"minimum":0,"type":"integer"},"results":{"description":"Wyniki (dostępne gdy status = completed)","nullable":true,"type":"object"},"status":{"enum":["pending","processing","completed","failed"],"type":"string"},"total_emails":{"type":"integer"}},"type":"object"}},"title":"JobStatusResponse","type":"object"},"GdprExportRequest":{"description":"Żądanie eksportu danych organizacji (Art. 15, 20 RODO)","properties":{"email":{"description":"Adres e-mail osoby żądającej eksportu (opcjonalny)","example":"admin@example.com","format":"email","type":"string"},"options":{"description":"Opcje eksportu (np. format, zakres danych)","example":["include_metadata","json_format"],"items":{"type":"string"},"type":"array"}},"title":"GdprExportRequest","type":"object"},"CancelResponse":{"description":"Potwierdzenie anulowania subskrypcji","example":{"data":{"cancel_at_period_end":true,"canceled_at":"2024-01-15T12:00:00Z","current_period_end":"2024-02-01T00:00:00Z","id":"550e8400-e29b-41d4-a716-446655440000","plan":"professional","status":"active"},"message":"Subskrypcja zostanie anulowana na koniec okresu rozliczeniowego."},"properties":{"data":{"properties":{"cancel_at_period_end":{"type":"boolean"},"canceled_at":{"format":"date-time","nullable":true,"type":"string"},"current_period_end":{"format":"date-time","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"plan":{"type":"string"},"status":{"enum":["active","canceled"],"type":"string"}},"type":"object"},"message":{"description":"Komunikat potwierdzenia","type":"string"}},"title":"CancelResponse","type":"object"},"ApiKeyRotateResponse":{"description":"Nowy klucz po rotacji","properties":{"data":{"properties":{"id":{"format":"uuid","type":"string"},"new_key":{"description":"Nowy klucz API","type":"string"},"previous_key_expires_at":{"description":"Data wygaśnięcia poprzedniego klucza (okres karencji)","format":"date-time","type":"string"}},"type":"object"}},"title":"ApiKeyRotateResponse","type":"object"},"TemplateListResponse":{"description":"Lista szablonów email","properties":{"data":{"items":{"properties":{"created_at":{"format":"date-time","type":"string"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"last_used_at":{"format":"date-time","nullable":true,"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string"},"subject":{"type":"string"},"type":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"usage_count":{"type":"integer"},"variables":{"items":{"type":"string"},"type":"array"},"version":{"type":"integer"}},"type":"object"},"type":"array"},"meta":{"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"type":"object"}},"title":"TemplateListResponse","type":"object"},"GetPreferencesResponse":{"description":"Preferencje odbiorcy","example":{"consents":[{"consent_type":"marketing","enabled":true,"status":"confirmed"},{"consent_type":"newsletter","enabled":false,"status":"revoked"}],"email":"jan@example.com"},"properties":{"consents":{"description":"Lista zgód odbiorcy","items":{"$ref":"#/components/schemas/PublicConsentData"},"type":"array"},"email":{"description":"Adres e-mail odbiorcy","format":"email","type":"string"}},"title":"GetPreferencesResponse","type":"object"},"ActivityTimelineResponse":{"description":"Chronologiczna lista eventów dla konkretnego zasobu","example":{"data":[{"category":"email","data":{"recipient":"user@example.com"},"event_type":"sent","id":"550e8400-e29b-41d4-a716-446655440000","occurred_at":"2026-02-21T10:00:00Z","resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","severity":"info"},{"category":"email","data":{"recipient":"user@example.com","smtp_response":"250 OK"},"event_type":"delivered","id":"550e8400-e29b-41d4-a716-446655440002","occurred_at":"2026-02-21T10:00:05Z","resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","severity":"info"},{"category":"email","data":{"opens_count":1,"recipient":"user@example.com"},"event_type":"opened","id":"550e8400-e29b-41d4-a716-446655440003","occurred_at":"2026-02-21T10:30:00Z","resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","severity":"info"}],"meta":{"resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","total":3}},"properties":{"data":{"items":{"properties":{"category":{"type":"string"},"data":{"nullable":true,"type":"object"},"event_type":{"type":"string"},"id":{"format":"uuid","type":"string"},"occurred_at":{"format":"date-time","type":"string"},"resource_id":{"type":"string"},"resource_type":{"type":"string"},"severity":{"type":"string"}},"type":"object"},"type":"array"},"meta":{"properties":{"resource_id":{"type":"string"},"resource_type":{"type":"string"},"total":{"type":"integer"}},"type":"object"}},"title":"ActivityTimelineResponse","type":"object"},"AuditLogResponse":{"description":"Szczegóły wpisu w logu audytu","example":{"data":{"action":"api_key.rotated","actor_id":"admin@example.com","actor_type":"user","changes":{"previous_key_expires_at":"2024-01-16T10:30:00Z","rotated":true},"created_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","ip_address":"192.168.1.100","metadata":null,"resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"api_key","user_agent":"Mozilla/5.0..."}},"properties":{"data":{"properties":{"action":{"description":"Wykonana akcja","example":"api_key.created","type":"string"},"actor_id":{"description":"ID podmiotu wykonującego akcję","type":"string"},"actor_type":{"description":"Typ podmiotu wykonującego akcję","enum":["user","api_key","system"],"type":"string"},"changes":{"description":"Szczegóły zmian (before/after)","nullable":true,"type":"object"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"ip_address":{"nullable":true,"type":"string"},"metadata":{"description":"Dodatkowe metadane (IP, user-agent itp.)","nullable":true,"type":"object"},"resource_id":{"description":"ID zasobu","format":"uuid","type":"string"},"resource_type":{"description":"Typ zasobu","example":"api_key","type":"string"},"user_agent":{"nullable":true,"type":"string"}},"type":"object"}},"title":"AuditLogResponse","type":"object"},"InvoicesResponse":{"description":"Lista faktur i płatności organizacji","example":{"data":[{"amount":9900,"created_at":"2024-01-01T10:00:00Z","currency":"PLN","description":"Professional - miesięczna subskrypcja","id":"550e8400-e29b-41d4-a716-446655440000","invoice_number":"FV/2024/01/0042","invoice_url":"https://api.mailingapi.com/invoices/FV-2024-01-0042.pdf","paid_at":"2024-01-01T10:30:00Z","payment_method":"card","payment_type":"subscription","status":"completed"}],"meta":{"count":1}},"properties":{"data":{"items":{"$ref":"#/components/schemas/Invoice"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba zwróconych faktur","type":"integer"}},"type":"object"}},"title":"InvoicesResponse","type":"object"},"GdprActivityResponse":{"description":"Szczegóły czynności przetwarzania","properties":{"data":{"$ref":"#/components/schemas/GdprActivityEntry"}},"title":"GdprActivityResponse","type":"object"},"ApiKeyResponse":{"description":"Szczegóły klucza API","example":{"data":{"allowed_ips":null,"created_at":"2024-01-01T00:00:00Z","expires_at":null,"id":"550e8400-e29b-41d4-a716-446655440000","key_prefix":"sk_live_abc12","last_used_at":"2024-01-15T10:30:00Z","last_used_ip":"192.168.1.100","name":"Klucz produkcyjny","permissions":["send","manage"],"revoked":false}},"properties":{"data":{"properties":{"allowed_ips":{"items":{"type":"string"},"nullable":true,"type":"array"},"created_at":{"format":"date-time","type":"string"},"expires_at":{"format":"date-time","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"key":{"description":"Pełny klucz (pokazywany tylko przy tworzeniu)","type":"string"},"key_prefix":{"description":"Prefiks klucza (do identyfikacji)","type":"string"},"last_used_at":{"format":"date-time","nullable":true,"type":"string"},"last_used_ip":{"nullable":true,"type":"string"},"mode":{"description":"Tryb klucza","enum":["live","test"],"type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"revoked":{"type":"boolean"}},"type":"object"}},"title":"ApiKeyResponse","type":"object"},"ApiKeysListResponse":{"description":"Lista kluczy API","properties":{"data":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array"},"total":{"type":"integer"}},"title":"ApiKeysListResponse","type":"object"},"DuplicateTemplateRequest":{"description":"Dane do zduplikowania szablonu","properties":{"name":{"description":"Nowa nazwa dla kopii szablonu","example":"Welcome Email (kopia)","maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"title":"DuplicateTemplateRequest","type":"object"},"InboundMessageDetail":{"description":"Pełne informacje o wiadomości przychodzącej wraz z treścią","properties":{"attachments":{"description":"Lista załączników","items":{"$ref":"#/components/schemas/InboundAttachment"},"type":"array"},"authentication":{"$ref":"#/components/schemas/EmailAuthentication"},"cc":{"description":"Lista adresów CC","items":{"type":"string"},"type":"array"},"domain_id":{"description":"ID domeny odbiorczej","format":"uuid","type":"string"},"expires_at":{"description":"Data wygaśnięcia (automatycznego usunięcia)","format":"date-time","type":"string"},"from":{"$ref":"#/components/schemas/EmailAddress"},"headers":{"additionalProperties":{"type":"string"},"description":"Wszystkie nagłówki e-mail","type":"object"},"html_body":{"description":"Treść text/html","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inbound_route_id":{"description":"ID reguły routingu, która przetworzyła wiadomość","format":"uuid","nullable":true,"type":"string"},"is_spam":{"type":"boolean"},"message_id":{"description":"Oryginalny nagłówek Message-ID","example":"<msg-123@sender.com>","nullable":true,"type":"string"},"received_at":{"description":"Data otrzymania","format":"date-time","type":"string"},"reply_to":{"description":"Adres Reply-To","nullable":true,"type":"string"},"sender_ip":{"description":"Adres IP nadawcy","example":"203.0.113.1","nullable":true,"type":"string"},"spam_score":{"description":"Wynik analizy spam (jeśli dostępny)","nullable":true,"type":"number"},"stripped_html":{"description":"Treść HTML bez cytowanych odpowiedzi","nullable":true,"type":"string"},"stripped_text":{"description":"Treść tekstowa bez cytowanych odpowiedzi","nullable":true,"type":"string"},"subject":{"nullable":true,"type":"string"},"text_body":{"description":"Treść text/plain","nullable":true,"type":"string"},"threading":{"$ref":"#/components/schemas/EmailThreading"},"to":{"$ref":"#/components/schemas/EmailAddress"}},"title":"InboundMessageDetail","type":"object"},"GdprActivityCreateRequest":{"description":"Dane do utworzenia wpisu w rejestrze czynności przetwarzania (Art. 30 RODO)","properties":{"activity_type":{"description":"Typ czynności","enum":["automated","manual","mixed"],"example":"automated","type":"string"},"data_categories":{"description":"Kategorie przetwarzanych danych osobowych","example":["email","name","order_history"],"items":{"type":"string"},"type":"array"},"description":{"description":"Szczegółowy opis czynności","example":"Automatyczna wysyłka potwierdzeń zamówień i powiadomień systemowych","nullable":true,"type":"string"},"legal_basis":{"description":"Podstawa prawna przetwarzania (Art. 6 RODO)","enum":["consent","contract","legal_obligation","vital_interests","public_interest","legitimate_interests"],"example":"contract","type":"string"},"legal_basis_details":{"description":"Szczegóły podstawy prawnej","example":"Art. 6 ust. 1 lit. b RODO - niezbędność do wykonania umowy","nullable":true,"type":"string"},"name":{"description":"Nazwa czynności przetwarzania","example":"Wysyłka transakcyjnych e-maili","type":"string"},"purpose":{"description":"Cel przetwarzania danych","example":"Realizacja umowy - komunikacja z klientami","type":"string"},"recipient_categories":{"description":"Kategorie odbiorców danych","example":["customers","newsletter_subscribers"],"items":{"type":"string"},"type":"array"},"retention_period":{"description":"Okres przechowywania danych","example":"3 lata od ostatniej aktywności","type":"string"},"security_measures":{"description":"Środki bezpieczeństwa (Art. 32 RODO)","example":["encryption_at_rest","encryption_in_transit","access_control"],"items":{"type":"string"},"type":"array"},"special_categories":{"description":"Szczególne kategorie danych (Art. 9 RODO)","example":[],"items":{"type":"string"},"nullable":true,"type":"array"},"status":{"default":"active","description":"Status czynności","enum":["active","inactive","under_review"],"type":"string"},"third_party_recipients":{"description":"Zewnętrzni odbiorcy danych","example":["Dostawca usług e-mail"],"items":{"type":"string"},"nullable":true,"type":"array"},"transfer_safeguards":{"description":"Zabezpieczenia przy transferze poza EOG","example":"Standardowe klauzule umowne (SCC)","nullable":true,"type":"string"},"transfers_outside_eea":{"default":false,"description":"Czy dane są przekazywane poza EOG","type":"boolean"}},"required":["name","purpose","legal_basis"],"title":"GdprActivityCreateRequest","type":"object"},"TemplateResponse":{"description":"Szczegóły szablonu email","properties":{"data":{"properties":{"created_at":{"format":"date-time","type":"string"},"description":{"nullable":true,"type":"string"},"html_content":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"last_used_at":{"format":"date-time","nullable":true,"type":"string"},"name":{"type":"string"},"settings":{"type":"object"},"slug":{"type":"string"},"status":{"enum":["draft","active","archived"],"type":"string"},"subject":{"type":"string"},"text_content":{"nullable":true,"type":"string"},"type":{"enum":["transactional","marketing","system"],"type":"string"},"updated_at":{"format":"date-time","type":"string"},"usage_count":{"type":"integer"},"variables":{"description":"Lista zmiennych wykrytych w szablonie","items":{"type":"string"},"type":"array"},"version":{"type":"integer"}},"type":"object"}},"title":"TemplateResponse","type":"object"},"ConsentProofResponse":{"description":"Eksport dowodu zgody dla celów audytu/GDPR","example":{"data":{"consents":[{"consent_type":"marketing","granted_at":"2024-01-15T10:30:00Z","ip_address":"192.168.1.100","source":"signup_form","source_url":"https://example.com/signup","status":"confirmed","user_agent":"Mozilla/5.0..."}],"email":"jan@example.com","exported_at":"2024-01-20T14:00:00Z"}},"properties":{"data":{"properties":{"consents":{"description":"Historia zgód z pełnymi metadanymi","items":{"properties":{"consent_type":{"type":"string"},"granted_at":{"format":"date-time","type":"string"},"ip_address":{"nullable":true,"type":"string"},"source":{"type":"string"},"source_url":{"nullable":true,"type":"string"},"status":{"type":"string"},"user_agent":{"nullable":true,"type":"string"}},"type":"object"},"type":"array"},"email":{"description":"Adres e-mail odbiorcy","format":"email","type":"string"},"exported_at":{"format":"date-time","type":"string"}},"type":"object"}},"title":"ConsentProofResponse","type":"object"},"WebhooksListResponse":{"description":"Lista webhooków organizacji","properties":{"data":{"description":"Lista webhooków","items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array"}},"required":["data"],"title":"WebhooksListResponse","type":"object"},"DomainsListResponse":{"description":"Lista domen wysyłkowych","properties":{"data":{"items":{"$ref":"#/components/schemas/DomainResponse"},"type":"array"},"total":{"type":"integer"}},"title":"DomainsListResponse","type":"object"},"BatchValidationRequest":{"description":"Request do walidacji wielu adresów email","example":{"async":true,"emails":["test1@example.com","test2@example.com"],"skip_mx":false,"skip_smtp":true},"properties":{"async":{"default":true,"description":"Czy wykonać asynchronicznie (zwraca job_id)","type":"boolean"},"emails":{"description":"Lista adresów email do walidacji","items":{"format":"email","type":"string"},"maxItems":1000,"minItems":1,"type":"array"},"skip_catchall":{"default":true,"type":"boolean"},"skip_mx":{"default":false,"type":"boolean"},"skip_smtp":{"default":true,"type":"boolean"}},"required":["emails"],"title":"BatchValidationRequest","type":"object"},"GdprBreachResponse":{"description":"Szczegóły naruszenia z komunikatem","properties":{"data":{"$ref":"#/components/schemas/GdprBreachEntry"},"deadline_status":{"$ref":"#/components/schemas/GdprDeadlineStatus"},"message":{"nullable":true,"type":"string"}},"title":"GdprBreachResponse","type":"object"},"GdprExportResponse":{"description":"Potwierdzenie przyjęcia żądania eksportu","example":{"job_id":12345,"message":"Export request accepted","status":"pending"},"properties":{"job_id":{"description":"ID zadania eksportu (Oban job)","type":"integer"},"message":{"description":"Komunikat potwierdzający","type":"string"},"recipient_email":{"description":"Adres e-mail odbiorcy (tylko dla eksportu odbiorcy)","format":"email","nullable":true,"type":"string"},"status":{"description":"Status żądania","enum":["pending","processing","completed","failed"],"type":"string"}},"title":"GdprExportResponse","type":"object"},"Plan":{"description":"Szczegóły planu subskrypcyjnego","example":{"api_keys":5,"dedicated_ip":false,"description":"Idealny dla małych firm i startupów","domains":2,"emails_per_month":10000,"features":["email_tracking","basic_analytics"],"id":"starter","log_retention_days":7,"name":"Starter","pricing":{"monthly":4900,"quarterly":13200,"yearly":47000},"rate_limit_per_minute":100,"support_level":"email","webhooks":2},"properties":{"api_keys":{"description":"Limit kluczy API","type":"integer"},"dedicated_ip":{"description":"Dedykowany adres IP","type":"boolean"},"description":{"description":"Opis planu","type":"string"},"domains":{"description":"Limit domen","type":"integer"},"emails_per_month":{"description":"Limit emaili miesięcznie","type":"integer"},"features":{"description":"Lista funkcji","items":{"type":"string"},"type":"array"},"id":{"enum":["free","starter","professional","enterprise"],"type":"string"},"log_retention_days":{"description":"Dni retencji logów","type":"integer"},"name":{"description":"Nazwa planu","type":"string"},"pricing":{"$ref":"#/components/schemas/PlanPricing"},"rate_limit_per_minute":{"description":"Limit requestów na minutę","type":"integer"},"support_level":{"description":"Poziom wsparcia","type":"string"},"webhooks":{"description":"Limit webhooków","type":"integer"}},"title":"Plan","type":"object"},"InboundRoutesListResponse":{"description":"Lista reguł routingu przychodzących e-maili","properties":{"data":{"items":{"$ref":"#/components/schemas/InboundRouteSummary"},"type":"array"}},"title":"InboundRoutesListResponse","type":"object"},"CancelRequest":{"description":"Parametry anulowania subskrypcji","example":{"at_period_end":true},"properties":{"at_period_end":{"default":true,"description":"Czy anulować na koniec okresu rozliczeniowego (true) czy natychmiast (false)","type":"boolean"}},"title":"CancelRequest","type":"object"},"EngagementData":{"nullable":true,"properties":{"grade":{"description":"Ocena zaangażowania","enum":["excellent","good","average","poor","risky","unknown"],"type":"string"},"score":{"description":"Score zaangażowania (0-100)","maximum":100,"minimum":0,"type":"integer"}},"title":"EngagementData","type":"object"},"GrantConsentRequest":{"description":"Dane do nadania zgody","example":{"consent_type":"marketing","double_opt_in":true,"email":"jan@example.com","source":"signup_form","source_url":"https://example.com/signup"},"properties":{"consent_type":{"description":"Typ zgody","enum":["marketing","transactional","newsletter","product_updates","all"],"example":"marketing","type":"string"},"double_opt_in":{"default":false,"description":"Czy wymagać podwójnego potwierdzenia (wysyła e-mail z linkiem potwierdzającym)","type":"boolean"},"email":{"description":"Adres e-mail odbiorcy","example":"jan@example.com","format":"email","type":"string"},"source":{"default":"api","description":"Źródło zgody","example":"signup_form","type":"string"},"source_url":{"description":"URL strony, na której udzielono zgody","example":"https://example.com/signup","format":"uri","nullable":true,"type":"string"}},"required":["email","consent_type"],"title":"GrantConsentRequest","type":"object"},"SuppressionResponse":{"description":"Szczegóły wpisu na liście blokowanych","example":{"data":{"created_at":"2024-01-15T10:30:00Z","expires_at":null,"global":false,"hit_count":5,"id":"550e8400-e29b-41d4-a716-446655440000","last_hit_at":"2024-01-20T14:30:00Z","list_type":"blacklist","reason":"Hard bounce - adres nie istnieje","source":"bounce","type":"email","value":"blocked@example.com"}},"properties":{"data":{"$ref":"#/components/schemas/SuppressionEntry"}},"title":"SuppressionResponse","type":"object"},"MessagesListResponse":{"description":"Lista wiadomości z paginacją offset-based","properties":{"data":{"description":"Lista wiadomości","items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array"},"meta":{"description":"Metadane paginacji","properties":{"count":{"description":"Liczba zwróconych wiadomości na tej stronie","type":"integer"},"has_more":{"description":"Czy istnieją kolejne strony wyników","type":"boolean"},"limit":{"description":"Zastosowany limit (1-100)","type":"integer"},"offset":{"description":"Zastosowane przesunięcie","type":"integer"},"total":{"description":"Całkowita liczba wiadomości pasujących do filtrów","type":"integer"}},"required":["count","total","limit","offset","has_more"],"type":"object"}},"required":["data","meta"],"title":"MessagesListResponse","type":"object"},"CreateDomainRequest":{"description":"Dane do dodania nowej domeny wysyłkowej","properties":{"name":{"description":"Nazwa domeny (np. example.com)","example":"mail.example.com","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\\.[a-zA-Z]{2,}$","type":"string"},"return_path_subdomain":{"description":"Subdomena koperty SMTP (Return-Path / MAIL FROM), np. `send`.\n\nGdy podana, rekordy SPF i MX konfiguruje się na `<subdomena>.<domena>`,\na apeks zostaje wolny dla cudzej poczty (np. MX Google Workspace).\nWidoczny nadawca (`From:`) zostaje w domenie głównej — DMARC nadal\nwypada dobrze, bo DKIM podpisuje domenę główną, a SPF w trybie relaxed\nzestraja subdomenę z tą samą domeną organizacyjną.\n\nPominięta = koperta równa się adresowi z nagłówka `From:`, a SPF i MX\nsą oczekiwane na apeksie.\n","example":"send","nullable":true,"pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$","type":"string"}},"required":["name"],"title":"CreateDomainRequest","type":"object"},"RevokeAllConsentsRequest":{"description":"Dane do wycofania wszystkich zgód odbiorcy","example":{"email":"jan@example.com"},"properties":{"email":{"description":"Adres e-mail odbiorcy","example":"jan@example.com","format":"email","type":"string"}},"required":["email"],"title":"RevokeAllConsentsRequest","type":"object"},"CreateWebhookRequest":{"description":"Dane do utworzenia konfiguracji webhooka","example":{"description":"Produkcyjny webhook","events":["message.delivered","message.bounced"],"url":"https://example.com/webhooks/outboxa"},"properties":{"active":{"default":true,"description":"Czy webhook jest aktywny","type":"boolean"},"description":{"description":"Opis webhooka","example":"Główny webhook produkcyjny","type":"string"},"events":{"description":"Lista eventów do subskrypcji","example":["message.delivered","message.bounced","message.opened"],"items":{"enum":["message.delivered","message.bounced","message.complained","message.opened","message.clicked","message.unsubscribed","message.deferred","quality.alert"],"type":"string"},"type":"array"},"secret":{"description":"Własny secret do podpisywania (opcjonalnie, generowany automatycznie)","minLength":32,"type":"string"},"url":{"description":"URL endpointu webhooka (HTTPS)","example":"https://example.com/webhooks/outboxa","format":"uri","type":"string"}},"required":["url","events"],"title":"CreateWebhookRequest","type":"object"},"Event":{"description":"Event systemowy reprezentujący zdarzenie w aplikacji","example":{"actor":"smtp_server","data":{"message_id":"abc123@mailingapi.com","recipient":"user@example.com"},"id":"550e8400-e29b-41d4-a716-446655440000","metadata":{"remote_mta":"mx.google.com","response_code":"250"},"occurred_at":"2024-01-15T10:30:05Z","organization_id":"123e4567-e89b-12d3-a456-426614174000","recorded_at":"2024-01-15T10:30:06Z","severity":"info","tags":["email","delivery","success"],"type":"delivered","version":1},"properties":{"actor":{"description":"Identyfikator aktora (użytkownik, system, itp.)","example":"system","nullable":true,"type":"string"},"data":{"additionalProperties":true,"description":"Dane specyficzne dla typu eventu","example":{"message_id":"550e8400-e29b-41d4-a716-446655440000","recipient":"user@example.com"},"type":"object"},"id":{"description":"Unikalny identyfikator eventu","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Dodatkowe metadane eventu","example":{"ip":"192.168.1.1","user_agent":"Mozilla/5.0"},"type":"object"},"occurred_at":{"description":"Czas wystąpienia zdarzenia","format":"date-time","type":"string"},"organization_id":{"description":"ID organizacji powiązanej z eventem","format":"uuid","nullable":true,"type":"string"},"recorded_at":{"description":"Czas zarejestrowania eventu w systemie","format":"date-time","type":"string"},"severity":{"description":"Poziom ważności eventu","enum":["debug","info","warning","error","critical"],"example":"info","type":"string"},"tags":{"description":"Tagi klasyfikujące event","example":["email","delivery"],"items":{"type":"string"},"type":"array"},"type":{"description":"Typ eventu (np. sent, delivered, opened, clicked, bounced, complained, unsubscribed)","example":"delivered","type":"string"},"version":{"description":"Wersja schematu eventu","example":1,"type":"integer"}},"required":["id","type","occurred_at","recorded_at"],"title":"Event","type":"object"},"ConsentData":{"description":"Szczegółowe dane zgody","example":{"consent_type":"marketing","created_at":"2024-01-15T10:30:00Z","double_opt_in_confirmed_at":"2024-01-15T10:35:00Z","double_opt_in_required":true,"granted_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","recipient_email":"jan@example.com","revoked_at":null,"source":"api","status":"confirmed","updated_at":"2024-01-15T10:35:00Z"},"properties":{"consent_type":{"description":"Typ zgody","enum":["marketing","transactional","newsletter","product_updates","all"],"type":"string"},"created_at":{"description":"Data utworzenia","format":"date-time","type":"string"},"double_opt_in_confirmed_at":{"description":"Data potwierdzenia double opt-in","format":"date-time","nullable":true,"type":"string"},"double_opt_in_required":{"description":"Czy wymagane jest podwójne potwierdzenie","type":"boolean"},"granted_at":{"description":"Data udzielenia zgody","format":"date-time","nullable":true,"type":"string"},"id":{"description":"Unikalny identyfikator zgody","format":"uuid","type":"string"},"recipient_email":{"description":"Adres e-mail odbiorcy","format":"email","type":"string"},"revoked_at":{"description":"Data wycofania zgody","format":"date-time","nullable":true,"type":"string"},"source":{"description":"Źródło zgody (np. api, form, import)","example":"api","type":"string"},"status":{"description":"Status zgody","enum":["confirmed","pending","revoked"],"type":"string"},"updated_at":{"description":"Data aktualizacji","format":"date-time","type":"string"}},"title":"ConsentData","type":"object"},"ConsentsListResponse":{"description":"Lista zgód z metadanymi","example":{"data":[{"consent_type":"marketing","created_at":"2024-01-15T10:30:00Z","double_opt_in_confirmed_at":null,"double_opt_in_required":false,"granted_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","recipient_email":"jan@example.com","revoked_at":null,"source":"api","status":"confirmed","updated_at":"2024-01-15T10:30:00Z"}],"meta":{"count":1,"limit":100,"offset":0}},"properties":{"data":{"description":"Lista zgód","items":{"$ref":"#/components/schemas/ConsentData"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba zwróconych wyników","type":"integer"},"limit":{"description":"Limit wyników","type":"integer"},"offset":{"description":"Przesunięcie","type":"integer"}},"type":"object"}},"title":"ConsentsListResponse","type":"object"},"PublicConsentData":{"description":"Uproszczone dane zgody dla centrum preferencji","example":{"consent_type":"marketing","enabled":true,"status":"confirmed"},"properties":{"consent_type":{"description":"Typ zgody","type":"string"},"enabled":{"description":"Czy zgoda jest aktywna","type":"boolean"},"status":{"description":"Status zgody","enum":["confirmed","pending","revoked"],"type":"string"}},"title":"PublicConsentData","type":"object"},"RotateApiKeyRequest":{"description":"Parametry rotacji klucza API","example":{"grace_period_minutes":120},"properties":{"grace_period_minutes":{"default":60,"description":"Okres karencji w minutach, przez który stary klucz pozostanie aktywny (domyślnie 60)","example":60,"maximum":1440,"minimum":0,"type":"integer"}},"title":"RotateApiKeyRequest","type":"object"},"EventsListResponse":{"description":"Lista eventów z informacjami o paginacji","example":{"events":[{"actor":"system","data":{"message_id":"abc123@mailingapi.com"},"id":"550e8400-e29b-41d4-a716-446655440000","metadata":{},"occurred_at":"2024-01-15T10:30:00Z","organization_id":"123e4567-e89b-12d3-a456-426614174000","recorded_at":"2024-01-15T10:30:01Z","severity":"info","tags":["email"],"type":"sent","version":1},{"actor":"smtp_server","data":{"message_id":"abc123@mailingapi.com","recipient":"user@example.com"},"id":"550e8400-e29b-41d4-a716-446655440001","metadata":{"remote_mta":"mx.google.com"},"occurred_at":"2024-01-15T10:30:05Z","organization_id":"123e4567-e89b-12d3-a456-426614174000","recorded_at":"2024-01-15T10:30:06Z","severity":"info","tags":["email","delivery"],"type":"delivered","version":1}],"has_more":true,"total":150},"properties":{"events":{"description":"Lista eventów","items":{"$ref":"#/components/schemas/Event"},"type":"array"},"has_more":{"description":"Czy istnieją kolejne eventy do pobrania","example":true,"type":"boolean"},"total":{"description":"Całkowita liczba eventów spełniających kryteria","example":150,"type":"integer"}},"required":["events","total","has_more"],"title":"EventsListResponse","type":"object"},"ResendVerificationRequest":{"description":"Dane do ponownego wysłania e-maila weryfikacyjnego","example":{"email":"jan.kowalski@example.com"},"properties":{"email":{"description":"Adres e-mail konta oczekującego na weryfikację","example":"jan.kowalski@example.com","format":"email","type":"string"}},"required":["email"],"title":"ResendVerificationRequest","type":"object"},"CreateInboundRouteRequest":{"description":"Dane do utworzenia reguły routingu przychodzących e-maili. Każda reguła musi być przypisana do dokładnie jednej domeny.","example":{"action":"webhook","action_config":{"url":"https://myapp.com/api/support-emails"},"description":"Przekazuje wszystkie maile na support@* do systemu ticketów","domain_id":"8d8f2a26-46e0-4c7c-a9ff-a9af12c4d8a1","match_type":"suffix","name":"Support tickets","pattern":"@support.example.com","priority":75},"properties":{"action":{"description":"Akcja do wykonania","enum":["webhook","forward","store","drop"],"example":"webhook","type":"string"},"action_config":{"additionalProperties":true,"description":"Konfiguracja akcji (URL webhooka, adres forwarding itp.)","example":{"url":"https://example.com/inbound"},"type":"object"},"active":{"default":true,"description":"Czy reguła jest aktywna","type":"boolean"},"description":{"description":"Opis reguły","nullable":true,"type":"string"},"domain_id":{"description":"ID domeny (wymagane - każda reguła jest scope'owana do jednej domeny)","format":"uuid","type":"string"},"filters":{"additionalProperties":true,"description":"Dodatkowe filtry (np. po nagłówkach)","nullable":true,"type":"object"},"match_type":{"description":"Typ dopasowania","enum":["exact","prefix","suffix","regex","catchall"],"example":"suffix","type":"string"},"name":{"description":"Nazwa reguły","example":"Support emails","type":"string"},"pattern":{"description":"Wzorzec do dopasowania (adres email lub jego część)","example":"@support.example.com","type":"string"},"priority":{"default":50,"description":"Priorytet reguły (wyższy = ważniejszy)","maximum":100,"minimum":0,"type":"integer"}},"required":["match_type","action","domain_id"],"title":"CreateInboundRouteRequest","type":"object"},"GdprDeletionListResponse":{"description":"Lista żądań usunięcia danych z metadanymi","example":{"data":[{"id":"550e8400-e29b-41d4-a716-446655440000","request_type":"recipient_deletion","requester_email":"user@example.com","status":"scheduled"}],"meta":{"count":1}},"properties":{"data":{"items":{"$ref":"#/components/schemas/GdprDeletionEntry"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba zwróconych żądań","type":"integer"}},"type":"object"}},"title":"GdprDeletionListResponse","type":"object"},"ValidationErrorResponse":{"description":"Odpowiedź z błędami walidacji (422 validation_failed)","example":{"error":{"code":"validation_failed","details":{"subject":["can't be blank"],"to_email":["has invalid format"]},"message":"Błąd walidacji"}},"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"required":["error"],"title":"ValidationErrorResponse","type":"object"},"RenderTemplateResponse":{"description":"Wyrenderowany szablon z podstawionymi zmiennymi","example":{"data":{"html":"<h1>Witaj Jan Kowalski</h1><p>Dziękujemy za rejestrację w Acme Corp</p>","subject":"Witaj Jan Kowalski!","text":"Witaj Jan Kowalski! Dziękujemy za rejestrację w Acme Corp"}},"properties":{"data":{"properties":{"html":{"description":"Wyrenderowana treść HTML","nullable":true,"type":"string"},"subject":{"description":"Wyrenderowany temat","type":"string"},"text":{"description":"Wyrenderowana treść tekstowa","nullable":true,"type":"string"}},"type":"object"}},"title":"RenderTemplateResponse","type":"object"},"GdprRecipientExportRequest":{"description":"Żądanie eksportu danych konkretnego odbiorcy","properties":{"email":{"description":"Adres e-mail odbiorcy, którego dane mają być wyeksportowane","example":"user@example.com","format":"email","type":"string"},"requester_email":{"description":"Adres e-mail osoby żądającej eksportu","example":"dpo@example.com","format":"email","type":"string"}},"required":["email"],"title":"GdprRecipientExportRequest","type":"object"},"ActivityResponse":{"description":"Szczegóły wpisu w logu aktywności","example":{"data":{"actor_id":null,"actor_type":"system","category":"email","data":{"recipient":"user@example.com","smtp_response":"250 OK"},"event_type":"delivered","id":"550e8400-e29b-41d4-a716-446655440000","inserted_at":"2026-02-21T10:30:01Z","ip_address":null,"occurred_at":"2026-02-21T10:30:00Z","organization_id":"550e8400-e29b-41d4-a716-446655440002","request_id":null,"resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","severity":"info","user_agent":null}},"properties":{"data":{"properties":{"actor_id":{"description":"ID podmiotu wykonującego akcję","format":"uuid","nullable":true,"type":"string"},"actor_type":{"description":"Typ podmiotu wykonującego akcję","enum":["user","api_key","system"],"type":"string"},"category":{"description":"Kategoria aktywności","enum":["email","api","domain","api_key","webhook","suppression","inbound","account"],"type":"string"},"data":{"description":"Dodatkowe dane eventu","nullable":true,"type":"object"},"event_type":{"description":"Typ eventu","example":"delivered","type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"ip_address":{"nullable":true,"type":"string"},"occurred_at":{"format":"date-time","type":"string"},"organization_id":{"format":"uuid","type":"string"},"request_id":{"nullable":true,"type":"string"},"resource_id":{"description":"ID zasobu","type":"string"},"resource_type":{"description":"Typ zasobu","example":"message","type":"string"},"severity":{"description":"Poziom ważności","enum":["info","warning","error"],"type":"string"},"user_agent":{"nullable":true,"type":"string"}},"type":"object"}},"title":"ActivityResponse","type":"object"},"GrantConsentResponse":{"description":"Odpowiedź po nadaniu zgody","example":{"data":{"consent_type":"marketing","created_at":"2024-01-15T10:30:00Z","double_opt_in_confirmed_at":null,"double_opt_in_required":false,"granted_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","recipient_email":"jan@example.com","revoked_at":null,"source":"api","status":"confirmed","updated_at":"2024-01-15T10:30:00Z"},"message":"Consent granted."},"properties":{"data":{"$ref":"#/components/schemas/ConsentData"},"message":{"description":"Komunikat statusu","type":"string"}},"title":"GrantConsentResponse","type":"object"},"CreateTemplateRequest":{"description":"Dane do utworzenia szablonu email","example":{"description":"Szablon powitalny dla nowych użytkowników","html_content":"<h1>Witaj {{name}}</h1><p>Dziękujemy za rejestrację w {{company}}</p>","name":"Welcome Email","subject":"Witaj {{name}}!","text_content":"Witaj {{name}}! Dziękujemy za rejestrację w {{company}}","type":"transactional"},"properties":{"description":{"description":"Opis szablonu","example":"Szablon powitalny dla nowych użytkowników","nullable":true,"type":"string"},"html_content":{"description":"Treść HTML szablonu (może zawierać zmienne {{variable}})","example":"<h1>Witaj {{name}}</h1><p>Dziękujemy za rejestrację w {{company}}</p>","nullable":true,"type":"string"},"name":{"description":"Nazwa szablonu (unikalna w ramach organizacji)","example":"Welcome Email","maxLength":255,"minLength":1,"type":"string"},"settings":{"additionalProperties":true,"description":"Dodatkowe ustawienia szablonu (np. default headers)","example":{"reply_to":"support@example.com"},"type":"object"},"slug":{"description":"Slug szablonu (generowany automatycznie z nazwy jeśli nie podany)","example":"welcome-email","type":"string"},"subject":{"description":"Temat wiadomości (może zawierać zmienne {{variable}})","example":"Witaj {{name}}!","maxLength":998,"minLength":1,"type":"string"},"text_content":{"description":"Treść tekstowa szablonu (może zawierać zmienne {{variable}})","example":"Witaj {{name}}! Dziękujemy za rejestrację w {{company}}","nullable":true,"type":"string"},"type":{"default":"transactional","description":"Typ szablonu","enum":["transactional","marketing","system"],"type":"string"}},"required":["name","subject"],"title":"CreateTemplateRequest","type":"object"},"ResendVerificationResponse":{"description":"Potwierdzenie wysłania e-maila weryfikacyjnego","example":{"message":"E-mail weryfikacyjny został wysłany na adres jan.kowalski@example.com."},"properties":{"message":{"description":"Komunikat potwierdzający","type":"string"}},"title":"ResendVerificationResponse","type":"object"},"SendMessageRequest":{"description":"Dane do wysłania wiadomości e-mail","example":{"from":"noreply@example.com","from_name":"Acme Corp","html":"<h1>Witaj!</h1><p>Dziękujemy za rejestrację.</p>","metadata":{"user_id":"123"},"subject":"Witamy w naszym serwisie!","tags":["welcome"],"text":"Witaj!\n\nDziękujemy za rejestrację.","to":"user@example.com","to_name":"John Doe"},"properties":{"attachments":{"description":"Lista załączników (max 10, każdy max 10 MB)","example":[{"content":"JVBERi0xLjQKJeLjz9MK...","content_type":"application/pdf","filename":"invoice.pdf"}],"items":{"properties":{"content":{"description":"Zawartość pliku zakodowana w Base64","format":"byte","type":"string"},"content_type":{"description":"MIME type (opcjonalny, zostanie wykryty z rozszerzenia)","example":"application/pdf","type":"string"},"filename":{"description":"Nazwa pliku z rozszerzeniem","example":"document.pdf","type":"string"}},"required":["filename","content"],"type":"object"},"maxItems":10,"type":"array"},"bcc":{"description":"Lista adresów BCC","example":["bcc@example.com"],"items":{"format":"email","type":"string"},"type":"array"},"cc":{"description":"Lista adresów CC","example":["cc1@example.com","cc2@example.com"],"items":{"format":"email","type":"string"},"type":"array"},"from":{"description":"Nadawca — string `\"email@domain.com\"` lub obiekt `{\"email\": \"...\", \"name\": \"...\"}`. Musi być z zweryfikowanej domeny.","example":"noreply@example.com","oneOf":[{"format":"email","type":"string"},{"properties":{"email":{"description":"Adres e-mail nadawcy","format":"email","type":"string"},"name":{"description":"Nazwa nadawcy","type":"string"}},"required":["email"],"type":"object"}]},"from_name":{"description":"Nazwa nadawcy (alternatywa — można podać name w obiekcie `from`)","example":"Acme Corp","type":"string"},"headers":{"additionalProperties":{"type":"string"},"description":"Dodatkowe nagłówki e-mail","example":{"X-Custom-Header":"value"},"type":"object"},"html":{"description":"Treść wiadomości w formacie HTML","example":"<h1>Witaj!</h1><p>Dziękujemy za rejestrację...</p>","type":"string"},"metadata":{"additionalProperties":true,"description":"Własne metadane (zwracane w webhookach)","example":{"campaign":"summer_sale","user_id":"123"},"type":"object"},"subject":{"description":"Temat wiadomości","example":"Witamy w naszym serwisie!","type":"string"},"tags":{"description":"Tagi do kategoryzacji wiadomości","example":["welcome","onboarding"],"items":{"type":"string"},"type":"array"},"text":{"description":"Treść wiadomości w formacie tekstowym","example":"Witaj,\n\nDziękujemy za rejestrację...","type":"string"},"to":{"description":"Odbiorca — string `\"email@domain.com\"`, obiekt `{\"email\": \"...\", \"name\": \"...\"}` lub tablica obiektów `[{\"email\": \"...\"}]`","example":"user@example.com","oneOf":[{"format":"email","type":"string"},{"properties":{"email":{"description":"Adres e-mail odbiorcy","format":"email","type":"string"},"name":{"description":"Nazwa odbiorcy","type":"string"}},"required":["email"],"type":"object"},{"items":{"properties":{"email":{"format":"email","type":"string"},"name":{"type":"string"}},"required":["email"],"type":"object"},"type":"array"}]},"to_name":{"description":"Nazwa odbiorcy (alternatywa — można podać name w obiekcie `to`)","example":"John Doe","type":"string"},"tracking":{"description":"Ustawienia śledzenia — obiekt `{opens, clicks}` albo skrót boolowski (`false` wyłącza oba). Gdy oba są `false`, email jest traktowany jako transakcyjny: brak pixela, brak przepisywania linków, brak nagłówka List-Unsubscribe (zapobiega klasyfikacji jako spam przez Gmail). Wartość innego typu niż obiekt/boolean kończy się błędem 400 — od 2026-07 nie jest już cicho ignorowana.","oneOf":[{"properties":{"clicks":{"default":true,"description":"Śledzenie kliknięć (przepisuje linki przez domenę śledzenia). Ustaw `false` dla emaili transakcyjnych.","type":"boolean"},"opens":{"default":true,"description":"Śledzenie otwarć (wstawia pixel śledzący). Ustaw `false` dla emaili transakcyjnych.","type":"boolean"}},"type":"object"},{"description":"Skrót: `false` ≡ `{\"opens\": false, \"clicks\": false}`","type":"boolean"}]},"transactional":{"default":false,"description":"Deklaruje wiadomość jako transakcyjną. Równoważne `tracking: {opens: false, clicks: false}` i ma nad nim pierwszeństwo: brak pixela, brak przepisywania linków, brak nagłówka List-Unsubscribe. Użyj dla resetów haseł, zaproszeń, potwierdzeń i powiadomień systemowych.","example":true,"type":"boolean"}},"required":["from","to","subject"],"title":"SendMessageRequest","type":"object"},"RecipientConsentsResponse":{"description":"Wszystkie zgody dla konkretnego odbiorcy","example":{"data":[{"consent_type":"marketing","created_at":"2024-01-15T10:30:00Z","double_opt_in_confirmed_at":null,"double_opt_in_required":false,"granted_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","recipient_email":"jan@example.com","revoked_at":null,"source":"api","status":"confirmed","updated_at":"2024-01-15T10:30:00Z"}],"meta":{"count":1}},"properties":{"data":{"description":"Lista zgód odbiorcy","items":{"$ref":"#/components/schemas/ConsentData"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba zgód","type":"integer"}},"type":"object"}},"title":"RecipientConsentsResponse","type":"object"},"GdprBreachAssessmentRequest":{"description":"Żądanie przeprowadzenia oceny ryzyka naruszenia","properties":{"additional_info":{"description":"Dodatkowe informacje do oceny","nullable":true,"type":"string"}},"title":"GdprBreachAssessmentRequest","type":"object"},"SuppressionsListResponse":{"description":"Lista wpisów na liście blokowanych/dozwolonych","example":{"data":[{"created_at":"2024-01-15T10:30:00Z","expires_at":null,"global":false,"hit_count":5,"id":"550e8400-e29b-41d4-a716-446655440000","last_hit_at":"2024-01-20T14:30:00Z","list_type":"blacklist","reason":"Hard bounce","source":"bounce","type":"email","value":"blocked@example.com"}],"meta":{"count":1}},"properties":{"data":{"items":{"$ref":"#/components/schemas/SuppressionEntry"},"type":"array"},"meta":{"properties":{"count":{"description":"Liczba zwróconych wpisów","type":"integer"}},"type":"object"}},"title":"SuppressionsListResponse","type":"object"},"RevokeConsentRequest":{"description":"Dane do wycofania zgody","example":{"consent_type":"marketing","email":"jan@example.com"},"properties":{"consent_type":{"description":"Typ zgody do wycofania","enum":["marketing","transactional","newsletter","product_updates","all"],"example":"marketing","type":"string"},"email":{"description":"Adres e-mail odbiorcy","example":"jan@example.com","format":"email","type":"string"}},"required":["email","consent_type"],"title":"RevokeConsentRequest","type":"object"},"Invoice":{"description":"Szczegóły faktury lub płatności","example":{"amount":9900,"created_at":"2024-01-01T10:00:00Z","currency":"PLN","description":"Professional - miesięczna subskrypcja","id":"550e8400-e29b-41d4-a716-446655440000","invoice_number":"FV/2024/01/0042","invoice_url":"https://api.mailingapi.com/invoices/FV-2024-01-0042.pdf","paid_at":"2024-01-01T10:30:00Z","payment_method":"card","payment_type":"subscription","status":"completed"},"properties":{"amount":{"description":"Kwota (w groszach)","type":"integer"},"created_at":{"description":"Data utworzenia","format":"date-time","type":"string"},"currency":{"description":"Waluta","type":"string"},"description":{"description":"Opis płatności","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"invoice_number":{"description":"Numer faktury","nullable":true,"type":"string"},"invoice_url":{"description":"URL do pobrania faktury PDF","format":"uri","nullable":true,"type":"string"},"paid_at":{"description":"Data opłacenia","format":"date-time","nullable":true,"type":"string"},"payment_method":{"description":"Metoda płatności","nullable":true,"type":"string"},"payment_type":{"description":"Typ płatności","enum":["subscription","one_time","refund"],"type":"string"},"status":{"description":"Status płatności","enum":["pending","completed","failed","refunded"],"type":"string"}},"title":"Invoice","type":"object"},"CheckSuppressionResponse":{"description":"Wynik sprawdzenia wartości na liście","example":{"suppressed":true,"type":"email","value":"blocked@example.com"},"properties":{"suppressed":{"description":"Czy wartość jest zablokowana","type":"boolean"},"type":{"description":"Typ wartości","enum":["email","domain","ip"],"type":"string"},"value":{"description":"Sprawdzana wartość","type":"string"}},"title":"CheckSuppressionResponse","type":"object"},"ActivityStatsResponse":{"description":"Zagregowane statystyki aktywności","example":{"data":{"timeline":[{"api.requests":500,"email.delivered":100,"period":"2026-02-20"},{"api.requests":600,"email.delivered":120,"period":"2026-02-21"}],"totals":{"api":{"requests":5000},"email":{"bounced":20,"delivered":950,"opened":500}}},"meta":{"plan":"growth","retention_days":30}},"properties":{"data":{"properties":{"timeline":{"description":"Dane do wykresu timeline","items":{"properties":{"additionalProperties":{"type":"integer"},"period":{"type":"string"}},"type":"object"},"type":"array"},"totals":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"description":"Sumy per kategoria i typ eventu","type":"object"}},"type":"object"},"meta":{"properties":{"plan":{"type":"string"},"retention_days":{"type":"integer"}},"type":"object"}},"title":"ActivityStatsResponse","type":"object"},"BatchSendRequest":{"description":"Wysyłka wielu wiadomości w jednym żądaniu. Dwa tryby:\n\n1. **Lista wiadomości** - każda z pełnymi danymi\n2. **recipient_variables** - wspólna wiadomość z personalizacją per odbiorca (jak Mailgun)\n","example":{"from":"noreply@example.com","from_name":"Acme Corp","html":"<h1>Cześć {{name}}</h1><p>Twój kod: {{code}}</p>","recipient_variables":{"user1@example.com":{"code":"ABC123","name":"Jan"},"user2@example.com":{"code":"XYZ789","name":"Anna"}},"subject":"Witaj {{name}}!"},"oneOf":[{"properties":{"messages":{"description":"Lista wiadomości do wysłania (max 1000)","items":{"$ref":"#/components/schemas/SendMessageRequest"},"maxItems":1000,"type":"array"}},"required":["messages"],"title":"Lista wiadomości","type":"object"},{"properties":{"from":{"description":"Nadawca — string lub obiekt {email, name}","oneOf":[{"format":"email","type":"string"},{"properties":{"email":{"format":"email","type":"string"},"name":{"type":"string"}},"required":["email"],"type":"object"}]},"from_name":{"description":"Nazwa nadawcy","type":"string"},"html":{"description":"Treść HTML z zmiennymi","type":"string"},"recipient_variables":{"additionalProperties":{"additionalProperties":true,"type":"object"},"description":"Mapa email => zmienne do podstawienia","example":{"user1@example.com":{"code":"ABC123","name":"Jan"},"user2@example.com":{"code":"XYZ789","name":"Anna"}},"type":"object"},"subject":{"description":"Temat (może zawierać zmienne: {{name}} lub %recipient.name%)","type":"string"},"text":{"description":"Treść tekstowa z zmiennymi","type":"string"}},"required":["from","subject","recipient_variables"],"title":"Recipient variables","type":"object"}],"title":"BatchSendRequest","type":"object"},"GdprExportStatusResponse":{"description":"Szczegółowy status zadania eksportu","example":{"data":{"download_url":"https://api.mailingapi.com/exports/abc123","error":null,"expires_at":"2024-01-22T10:30:00Z","job_id":12345,"progress":100,"status":"completed"}},"properties":{"data":{"properties":{"download_url":{"description":"URL do pobrania (gdy status = completed)","nullable":true,"type":"string"},"error":{"description":"Opis błędu (gdy status = failed)","nullable":true,"type":"string"},"expires_at":{"description":"Data wygaśnięcia linku do pobrania","format":"date-time","nullable":true,"type":"string"},"job_id":{"description":"ID zadania","type":"integer"},"progress":{"description":"Postęp w procentach","type":"integer"},"status":{"description":"Status eksportu","enum":["pending","processing","completed","failed"],"type":"string"}},"type":"object"}},"title":"GdprExportStatusResponse","type":"object"},"Recipient variables":{"properties":{"from":{"description":"Nadawca — string lub obiekt {email, name}","oneOf":[{"format":"email","type":"string"},{"properties":{"email":{"format":"email","type":"string"},"name":{"type":"string"}},"required":["email"],"type":"object"}]},"from_name":{"description":"Nazwa nadawcy","type":"string"},"html":{"description":"Treść HTML z zmiennymi","type":"string"},"recipient_variables":{"additionalProperties":{"additionalProperties":true,"type":"object"},"description":"Mapa email => zmienne do podstawienia","example":{"user1@example.com":{"code":"ABC123","name":"Jan"},"user2@example.com":{"code":"XYZ789","name":"Anna"}},"type":"object"},"subject":{"description":"Temat (może zawierać zmienne: {{name}} lub %recipient.name%)","type":"string"},"text":{"description":"Treść tekstowa z zmiennymi","type":"string"}},"required":["from","subject","recipient_variables"],"title":"Recipient variables","type":"object"},"GdprDeletionEntry":{"description":"Szczegóły żądania usunięcia danych","example":{"cancelled_at":null,"executed_at":null,"id":"550e8400-e29b-41d4-a716-446655440000","organization_id":"660e8400-e29b-41d4-a716-446655440000","reason":"GDPR request","request_type":"recipient_deletion","requested_at":"2024-01-15T10:30:00Z","requester_email":"user@example.com","scheduled_for":"2024-01-22T10:30:00Z","status":"scheduled","target_email":"customer@example.com","verified_at":"2024-01-15T11:00:00Z"},"properties":{"cancelled_at":{"format":"date-time","nullable":true,"type":"string"},"executed_at":{"format":"date-time","nullable":true,"type":"string"},"id":{"description":"ID żądania","format":"uuid","type":"string"},"organization_id":{"format":"uuid","type":"string"},"reason":{"nullable":true,"type":"string"},"request_type":{"enum":["full_deletion","partial_deletion","recipient_deletion"],"type":"string"},"requested_at":{"format":"date-time","type":"string"},"requester_email":{"format":"email","type":"string"},"scheduled_for":{"description":"Planowana data wykonania","format":"date-time","nullable":true,"type":"string"},"status":{"description":"Status żądania","enum":["pending_verification","confirmed","scheduled","in_progress","completed","cancelled"],"type":"string"},"target_email":{"format":"email","nullable":true,"type":"string"},"verified_at":{"format":"date-time","nullable":true,"type":"string"}},"title":"GdprDeletionEntry","type":"object"},"GdprBreachEntry":{"description":"Szczegóły naruszenia ochrony danych osobowych","example":{"affected_subjects_count":1500,"authority_deadline":"2024-01-18T08:30:00Z","authority_notification_required":null,"authority_notified_at":null,"authority_reference":null,"breach_type":"confidentiality","created_at":"2024-01-15T08:35:00Z","data_categories_affected":["email","name"],"description":"Wykryto nieautoryzowany dostęp do bazy danych","discovered_at":"2024-01-15T08:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","immediate_actions":["Zablokowano dostęp"],"mitigation_actions":null,"occurred_at":"2024-01-14T22:00:00Z","organization_id":"660e8400-e29b-41d4-a716-446655440000","reported_by":"Jan Kowalski","resolution_notes":null,"resolved_at":null,"risk_assessment":null,"severity":"high","status":"under_investigation","subjects_notification_required":null,"subjects_notified_at":null,"title":"Wyciek danych klientów"},"properties":{"affected_subjects_count":{"nullable":true,"type":"integer"},"authority_deadline":{"description":"Termin 72h na powiadomienie organu","format":"date-time","nullable":true,"type":"string"},"authority_notification_required":{"description":"Czy wymagane powiadomienie UODO","nullable":true,"type":"boolean"},"authority_notified_at":{"format":"date-time","nullable":true,"type":"string"},"authority_reference":{"description":"Numer referencyjny zgłoszenia do UODO","nullable":true,"type":"string"},"breach_type":{"enum":["confidentiality","integrity","availability","mixed"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"data_categories_affected":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"discovered_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"immediate_actions":{"items":{"type":"string"},"type":"array"},"mitigation_actions":{"description":"Działania naprawcze","items":{"type":"string"},"nullable":true,"type":"array"},"occurred_at":{"format":"date-time","nullable":true,"type":"string"},"organization_id":{"format":"uuid","type":"string"},"reported_by":{"type":"string"},"resolution_notes":{"nullable":true,"type":"string"},"resolved_at":{"format":"date-time","nullable":true,"type":"string"},"risk_assessment":{"description":"Wyniki oceny ryzyka","nullable":true,"type":"object"},"severity":{"enum":["low","medium","high","critical"],"type":"string"},"status":{"description":"Status obsługi naruszenia","enum":["reported","under_investigation","assessed","authority_notified","subjects_notified","resolved"],"type":"string"},"subjects_notification_required":{"description":"Czy wymagane powiadomienie osób (Art. 34)","nullable":true,"type":"boolean"},"subjects_notified_at":{"format":"date-time","nullable":true,"type":"string"},"title":{"type":"string"}},"title":"GdprBreachEntry","type":"object"},"CheckSuppressionRequest":{"description":"Wartość do sprawdzenia na liście blokowanych","properties":{"type":{"description":"Typ wartości (domyślnie: email)","enum":["email","domain","ip"],"example":"email","type":"string"},"value":{"description":"Wartość do sprawdzenia (e-mail, domena lub IP)","example":"user@example.com","type":"string"}},"required":["value"],"title":"CheckSuppressionRequest","type":"object"},"UpdateDomainRequest":{"description":"Domyślne ustawienia śledzenia dla całej domeny. Działają jako wyłącznik\nnadrzędny: gdy `tracking_enabled` jest `false`, żadna wiadomość z tej\ndomeny nie dostanie pixela ani przepisanych linków, niezależnie od pola\n`tracking` w pojedynczym żądaniu wysyłki.\n\nPola pominięte pozostają bez zmian. Pola spoza tej listy (np. `name`,\n`status`, `ownership_verified`) są ignorowane.\n","example":{"tracking_enabled":false},"properties":{"click_tracking":{"description":"Domyślne śledzenie kliknięć (przepisywanie linków)","type":"boolean"},"open_tracking":{"description":"Domyślne śledzenie otwarć (pixel)","type":"boolean"},"tracking_enabled":{"description":"Główny przełącznik śledzenia dla domeny","type":"boolean"}},"title":"UpdateDomainRequest","type":"object"},"EventStatsResponse":{"description":"Statystyki eventów dla określonego okresu czasowego","example":{"by_severity":{"error":20,"info":1180,"warning":50},"by_type":{"bounced":15,"clicked":50,"complained":5,"delivered":480,"opened":200,"sent":500},"from":"2024-01-14T10:30:00Z","to":"2024-01-15T10:30:00Z","total":1250},"properties":{"by_severity":{"additionalProperties":{"type":"integer"},"description":"Liczba eventów według poziomu ważności","example":{"error":20,"info":1180,"warning":50},"type":"object"},"by_type":{"additionalProperties":{"type":"integer"},"description":"Liczba eventów według typu","example":{"bounced":15,"clicked":50,"complained":5,"delivered":480,"opened":200,"sent":500},"type":"object"},"from":{"description":"Początek okresu statystyk","format":"date-time","type":"string"},"to":{"description":"Koniec okresu statystyk","format":"date-time","type":"string"},"total":{"description":"Całkowita liczba eventów","example":1250,"type":"integer"}},"title":"EventStatsResponse","type":"object"},"ValidationChecks":{"properties":{"catchall":{"description":"Czy domena catch-all","nullable":true,"type":"boolean"},"disposable":{"description":"Czy domena disposable","nullable":true,"type":"boolean"},"mx":{"description":"Sprawdzenie rekordów MX","enum":["pass","fail","skip","unknown"],"type":"string"},"role_based":{"description":"Czy adres role-based","nullable":true,"type":"boolean"},"smtp":{"description":"Weryfikacja SMTP","enum":["pass","fail","warn","skip","unknown"],"type":"string"},"suppressed":{"description":"Czy email na liście suppression","nullable":true,"type":"boolean"},"syntax":{"description":"Walidacja składni","enum":["pass","fail","skip","unknown"],"type":"string"}},"title":"ValidationChecks","type":"object"},"UsageResponse":{"description":"Statystyki zużycia dla bieżącego okresu rozliczeniowego","example":{"data":{"api_calls":8420,"emails_sent":12500,"limit":50000,"overage":0,"percentage_used":25.0,"period_end":"2024-02-01T00:00:00Z","period_start":"2024-01-01T00:00:00Z","plan":"professional","remaining":37500}},"properties":{"data":{"properties":{"api_calls":{"description":"Liczba wywołań API","type":"integer"},"emails_sent":{"description":"Wysłane emaile w tym okresie","type":"integer"},"limit":{"description":"Limit emaili w planie","type":"integer"},"overage":{"description":"Emaile ponad limit","type":"integer"},"percentage_used":{"description":"Procent wykorzystania","format":"float","type":"number"},"period_end":{"description":"Koniec okresu","format":"date-time","type":"string"},"period_start":{"description":"Początek okresu","format":"date-time","type":"string"},"plan":{"description":"Aktualny plan","type":"string"},"remaining":{"description":"Pozostałe emaile","type":"integer"}},"type":"object"}},"title":"UsageResponse","type":"object"},"RegisterResponse":{"description":"Odpowiedź po utworzeniu konta","example":{"data":{"api_key":"sk_live_abc123def456ghi789...","organization":{"created_at":"2024-01-15T10:30:00Z","email":"jan.kowalski@example.com","id":"550e8400-e29b-41d4-a716-446655440000","name":"Moja Firma Sp. z o.o.","plan":"free","slug":"moja-firma-sp-z-oo","status":"pending"},"plan":"free"},"message":"Konto zostało utworzone. Sprawdź e-mail, aby zweryfikować adres.","warning":"Zapisz klucz API - jest wyświetlany tylko raz!"},"properties":{"data":{"properties":{"api_key":{"description":"Klucz API - wyświetlany tylko raz!","type":"string"},"organization":{"properties":{"created_at":{"format":"date-time","type":"string"},"email":{"format":"email","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"plan":{"enum":["free","starter","pro","enterprise"],"type":"string"},"slug":{"type":"string"},"status":{"enum":["pending","active","suspended"],"type":"string"}},"type":"object"},"plan":{"description":"Aktywny plan","type":"string"}},"type":"object"},"message":{"description":"Komunikat potwierdzający","type":"string"},"warning":{"description":"Ostrzeżenie o konieczności zapisania klucza API","type":"string"}},"title":"RegisterResponse","type":"object"},"ValidationResponse":{"description":"Wynik walidacji adresu email","example":{"data":{"checks":{"catchall":false,"disposable":false,"mx":"pass","role_based":false,"smtp":"pass","suppressed":false,"syntax":"pass"},"email":"test@gmail.com","engagement":{"grade":"good","score":75},"is_deliverable":true,"is_valid":true,"reason":null,"risk_level":"low","suggestion":null,"validated_at":"2026-02-10T10:30:00Z"}},"properties":{"data":{"properties":{"checks":{"$ref":"#/components/schemas/ValidationChecks"},"email":{"format":"email","type":"string"},"engagement":{"$ref":"#/components/schemas/EngagementData"},"is_deliverable":{"description":"Czy email jest dostarczalny (SMTP verification)","nullable":true,"type":"boolean"},"is_valid":{"description":"Czy email jest poprawny (składnia + podstawowe sprawdzenia)","type":"boolean"},"reason":{"description":"Powód niepowodzenia walidacji","nullable":true,"type":"string"},"risk_level":{"description":"Poziom ryzyka","enum":["low","medium","high","unknown"],"type":"string"},"suggestion":{"description":"Sugestia poprawki (jeśli wykryto typo)","nullable":true,"type":"string"},"validated_at":{"format":"date-time","type":"string"}},"type":"object"}},"title":"ValidationResponse","type":"object"},"CreateApiKeyRequest":{"description":"Dane do utworzenia nowego klucza API","properties":{"allowed_ips":{"description":"Lista dozwolonych adresów IP (opcjonalnie)","example":["192.168.1.0/24","10.0.0.1"],"items":{"type":"string"},"type":"array"},"domain_id":{"description":"ID domeny, z którą klucz API będzie powiązany","example":"550e8400-e29b-41d4-a716-446655440000","format":"uuid","type":"string"},"expires_at":{"description":"Data wygaśnięcia (opcjonalnie)","format":"date-time","nullable":true,"type":"string"},"mode":{"default":"live","description":"live — klucz ob_live_, wysyła naprawdę; test — klucz ob_test_ (sandbox): nic nie jest wysyłane, wiadomości mają sandbox: true, nie wymaga zweryfikowanej domeny i nie liczy się do limitu kluczy planu","enum":["live","test"],"type":"string"},"name":{"description":"Nazwa identyfikująca klucz","example":"Klucz produkcyjny","type":"string"},"permissions":{"description":"Lista uprawnień","example":["send","manage"],"items":{"enum":["send","read","manage"],"type":"string"},"type":"array"}},"required":["name","permissions","domain_id"],"title":"CreateApiKeyRequest","type":"object"},"TemplateVersionsListResponse":{"description":"Historia wersji szablonu","properties":{"data":{"items":{"properties":{"change_summary":{"nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"subject":{"type":"string"},"version":{"type":"integer"}},"type":"object"},"type":"array"}},"title":"TemplateVersionsListResponse","type":"object"},"EmailAddress":{"description":"Adres e-mail z opcjonalną nazwą wyświetlaną","properties":{"email":{"description":"Adres e-mail","example":"user@example.com","format":"email","type":"string"},"name":{"description":"Nazwa wyświetlana","example":"John Doe","nullable":true,"type":"string"}},"required":["email"],"title":"EmailAddress","type":"object"},"CheckoutRequest":{"description":"Dane do utworzenia sesji płatności","example":{"cancel_url":"https://app.example.com/billing/cancel","currency":"PLN","interval":"yearly","plan":"professional","success_url":"https://app.example.com/billing/success"},"properties":{"cancel_url":{"description":"URL przekierowania po anulowaniu płatności","type":"string"},"currency":{"default":"PLN","description":"Waluta płatności","enum":["PLN","EUR","USD"],"type":"string"},"interval":{"default":"monthly","description":"Interwał rozliczeniowy","enum":["monthly","quarterly","yearly"],"type":"string"},"plan":{"description":"Wybrany plan (nie można wybrać 'free')","enum":["starter","professional","enterprise"],"type":"string"},"success_url":{"description":"URL przekierowania po udanej płatności","type":"string"}},"required":["plan"],"title":"CheckoutRequest","type":"object"},"BatchValidationResponse":{"properties":{"data":{"additionalProperties":{"description":"Wynik walidacji (jak ValidationResponse.data)","type":"object"},"description":"Mapa email -> wynik walidacji","type":"object"},"meta":{"properties":{"invalid":{"type":"integer"},"risky":{"type":"integer"},"total":{"type":"integer"},"valid":{"type":"integer"}},"type":"object"}},"title":"BatchValidationResponse","type":"object"},"MessageEventsResponse":{"description":"Historia eventów wiadomości","example":{"data":[{"id":"evt_1","metadata":{},"timestamp":"2024-01-15T10:29:55Z","type":"queued"},{"id":"evt_2","metadata":{},"timestamp":"2024-01-15T10:30:00Z","type":"sent"},{"id":"evt_3","metadata":{},"timestamp":"2024-01-15T10:30:05Z","type":"delivered"},{"id":"evt_4","metadata":{"user_agent":"Mozilla/5.0"},"timestamp":"2024-01-15T11:00:00Z","type":"opened"}]},"properties":{"data":{"items":{"properties":{"id":{"format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"type":"object"},"timestamp":{"format":"date-time","type":"string"},"type":{"enum":["queued","sent","delivered","opened","clicked","bounced","complained","unsubscribed"],"type":"string"}},"type":"object"},"type":"array"}},"title":"MessageEventsResponse","type":"object"},"InboundMessageListResponse":{"description":"Lista wiadomości przychodzących z metadanymi paginacji","example":{"data":[{"attachment_count":0,"from":{"email":"sender@external.com","name":"Sender"},"has_attachments":false,"id":"550e8400-e29b-41d4-a716-446655440000","is_spam":false,"received_at":"2025-01-15T10:30:00Z","subject":"Test email","thread_id":"abc123","to":{"email":"inbox@mydomain.com","name":null}}],"meta":{"limit":50,"offset":0,"total":42}},"properties":{"data":{"items":{"$ref":"#/components/schemas/InboundMessageSummary"},"type":"array"},"meta":{"properties":{"limit":{"description":"Limit wyników na stronę","type":"integer"},"offset":{"description":"Przesunięcie (offset)","type":"integer"},"total":{"description":"Całkowita liczba wiadomości (z uwzględnieniem filtrów)","type":"integer"}},"type":"object"}},"title":"InboundMessageListResponse","type":"object"},"EmailAuthentication":{"description":"Wyniki weryfikacji SPF, DKIM i DMARC","properties":{"dkim":{"description":"Wynik DKIM","enum":["pass","fail","none"],"example":"pass","type":"string"},"dmarc":{"description":"Wynik DMARC","enum":["pass","fail","none"],"example":"pass","type":"string"},"spf":{"description":"Wynik SPF","enum":["pass","fail","softfail","neutral","none"],"example":"pass","type":"string"}},"title":"EmailAuthentication","type":"object"},"CheckoutResponse":{"description":"URL sesji płatności","example":{"data":{"checkout_url":"https://checkout.stripe.com/c/pay/cs_test_abc123...","plan":"professional"},"message":"Przekieruj użytkownika na checkout_url, aby dokończyć płatność."},"properties":{"data":{"properties":{"checkout_url":{"description":"URL do przekierowania użytkownika","format":"uri","type":"string"},"plan":{"description":"Wybrany plan","type":"string"}},"type":"object"},"message":{"description":"Instrukcja dla klienta","type":"string"}},"title":"CheckoutResponse","type":"object"},"ErrorResponse":{"description":"Standardowa odpowiedź błędu","example":{"error":{"code":"unauthorized","message":"Nieprawidłowy klucz API"}},"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"required":["error"],"title":"ErrorResponse","type":"object"},"HealthCheckResponse":{"description":"Status zdrowia API","example":{"checks":{"database":"ok","redis":"not_configured","smtp":"ok"},"status":"healthy","timestamp":"2024-01-15T10:30:00Z","version":"1.0.0"},"properties":{"checks":{"properties":{"database":{"enum":["ok","error"],"type":"string"},"redis":{"enum":["ok","error","not_configured"],"type":"string"},"smtp":{"enum":["ok","error"],"type":"string"}},"type":"object"},"status":{"enum":["healthy","degraded","unhealthy"],"type":"string"},"timestamp":{"format":"date-time","type":"string"},"version":{"type":"string"}},"title":"HealthCheckResponse","type":"object"},"GdprBreachResolveRequest":{"description":"Żądanie zamknięcia sprawy naruszenia","properties":{"resolution_notes":{"description":"Notatki dotyczące rozwiązania/zamknięcia sprawy","example":"Wdrożono dodatkowe zabezpieczenia. Przeszkolono personel.","nullable":true,"type":"string"}},"title":"GdprBreachResolveRequest","type":"object"},"GdprDeletionRequest":{"description":"Żądanie usunięcia danych (Art. 17 RODO - prawo do bycia zapomnianym)","properties":{"reason":{"description":"Powód żądania usunięcia","example":"Wycofanie zgody na przetwarzanie danych","nullable":true,"type":"string"},"request_type":{"description":"Typ żądania usunięcia","enum":["full_deletion","partial_deletion","recipient_deletion"],"example":"recipient_deletion","type":"string"},"requester_email":{"description":"Adres e-mail osoby żądającej usunięcia","example":"user@example.com","format":"email","type":"string"},"target_email":{"description":"Adres e-mail, którego dane mają być usunięte (dla recipient_deletion)","example":"customer@example.com","format":"email","nullable":true,"type":"string"}},"required":["requester_email","request_type"],"title":"GdprDeletionRequest","type":"object"},"EmailThreading":{"description":"Informacje o wątku konwersacji e-mail","properties":{"in_reply_to":{"description":"Message-ID wiadomości, na którą jest odpowiedź","example":"<original-123@example.com>","nullable":true,"type":"string"},"references":{"description":"Łańcuch Message-ID z nagłówka References","example":["<msg-1@example.com>","<msg-2@example.com>"],"items":{"type":"string"},"type":"array"},"thread_id":{"description":"Obliczony identyfikator wątku (hash)","example":"a1b2c3d4e5f6...","type":"string"}},"title":"EmailThreading","type":"object"},"RevokeConsentResponse":{"description":"Odpowiedź po wycofaniu zgody","example":{"data":{"consent_type":"marketing","created_at":"2024-01-15T10:30:00Z","double_opt_in_confirmed_at":null,"double_opt_in_required":false,"granted_at":"2024-01-15T10:30:00Z","id":"550e8400-e29b-41d4-a716-446655440000","recipient_email":"jan@example.com","revoked_at":"2024-01-20T14:00:00Z","source":"api","status":"revoked","updated_at":"2024-01-20T14:00:00Z"},"message":"Consent revoked."},"properties":{"data":{"$ref":"#/components/schemas/ConsentData"},"message":{"description":"Komunikat statusu","type":"string"}},"title":"RevokeConsentResponse","type":"object"},"ActivityListResponse":{"description":"Lista wpisów w logu aktywności z paginacją","example":{"data":[{"category":"email","data":{"recipient":"user@example.com"},"event_type":"delivered","id":"550e8400-e29b-41d4-a716-446655440000","occurred_at":"2026-02-21T10:30:00Z","resource_id":"550e8400-e29b-41d4-a716-446655440001","resource_type":"message","severity":"info"}],"meta":{"limit":100,"offset":0,"retention_days":30,"total":1234}},"properties":{"data":{"items":{"properties":{"category":{"enum":["email","api","domain","api_key","webhook","suppression","inbound","account"],"type":"string"},"data":{"nullable":true,"type":"object"},"event_type":{"type":"string"},"id":{"format":"uuid","type":"string"},"occurred_at":{"format":"date-time","type":"string"},"resource_id":{"type":"string"},"resource_type":{"type":"string"},"severity":{"enum":["info","warning","error"],"type":"string"}},"type":"object"},"type":"array"},"meta":{"properties":{"limit":{"description":"Limit wyników na stronę","type":"integer"},"offset":{"description":"Przesunięcie","type":"integer"},"retention_days":{"description":"Dni retencji dla planu","type":"integer"},"total":{"description":"Całkowita liczba wyników","type":"integer"}},"type":"object"}},"title":"ActivityListResponse","type":"object"},"GdprDeletionConfirmRequest":{"description":"Potwierdzenie żądania usunięcia za pomocą tokenu weryfikacyjnego","properties":{"token":{"description":"Token weryfikacyjny otrzymany mailem","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","type":"string"}},"required":["token"],"title":"GdprDeletionConfirmRequest","type":"object"},"ConsentStatsResponse":{"description":"Statystyki zgód organizacji","example":{"data":{"by_type":{"marketing":500,"newsletter":350,"transactional":150},"confirmed":850,"pending":50,"revoked":100,"total":1000}},"properties":{"data":{"properties":{"by_type":{"additionalProperties":{"type":"integer"},"description":"Statystyki według typu zgody","type":"object"},"confirmed":{"description":"Liczba potwierdzonych zgód","type":"integer"},"pending":{"description":"Liczba oczekujących zgód","type":"integer"},"revoked":{"description":"Liczba wycofanych zgód","type":"integer"},"total":{"description":"Całkowita liczba zgód","type":"integer"}},"type":"object"}},"title":"ConsentStatsResponse","type":"object"},"InboundMessageThreadResponse":{"description":"Lista wiadomości należących do tego samego wątku","properties":{"data":{"items":{"$ref":"#/components/schemas/InboundMessageDetail"},"type":"array"}},"title":"InboundMessageThreadResponse","type":"object"},"UpdateTemplateRequest":{"description":"Dane do aktualizacji szablonu email","properties":{"description":{"nullable":true,"type":"string"},"html_content":{"nullable":true,"type":"string"},"name":{"maxLength":255,"minLength":1,"type":"string"},"settings":{"additionalProperties":true,"type":"object"},"slug":{"type":"string"},"subject":{"maxLength":998,"minLength":1,"type":"string"},"text_content":{"nullable":true,"type":"string"},"type":{"enum":["transactional","marketing","system"],"type":"string"}},"title":"UpdateTemplateRequest","type":"object"},"MessageResponse":{"description":"Szczegóły wiadomości e-mail","example":{"data":{"created_at":"2024-01-15T10:29:55Z","from":"noreply@example.com","id":"550e8400-e29b-41d4-a716-446655440000","message_id":"<abc123@mailingapi.com>","metadata":{"user_id":"123"},"sent_at":"2024-01-15T10:30:00Z","status":"sent","subject":"Witamy!","tags":["welcome"],"to":"user@example.com"}},"properties":{"data":{"properties":{"bounced_at":{"format":"date-time","nullable":true,"type":"string"},"clicked_at":{"format":"date-time","nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"delivered_at":{"format":"date-time","nullable":true,"type":"string"},"from":{"format":"email","type":"string"},"id":{"description":"Unikalny ID wiadomości","format":"uuid","type":"string"},"message_id":{"description":"Message-ID nagłówka e-mail (do użycia w zapytaniach)","type":"string"},"metadata":{"additionalProperties":true,"type":"object"},"opened_at":{"format":"date-time","nullable":true,"type":"string"},"sandbox":{"description":"true — wiadomość z klucza testowego ob_test_, nigdy nie wysłana","type":"boolean"},"sent_at":{"format":"date-time","nullable":true,"type":"string"},"status":{"description":"Status wiadomości","enum":["pending","queued","sent","delivered","bounced","failed"],"type":"string"},"subject":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"to":{"format":"email","type":"string"}},"type":"object"}},"title":"MessageResponse","type":"object"},"UpdatePreferencesResponse":{"description":"Potwierdzenie aktualizacji preferencji","example":{"message":"Preferences updated successfully."},"properties":{"message":{"description":"Komunikat statusu","type":"string"}},"title":"UpdatePreferencesResponse","type":"object"},"BatchJobResponse":{"properties":{"data":{"properties":{"created_at":{"format":"date-time","type":"string"},"job_id":{"description":"ID job'a do sprawdzenia statusu","type":"string"},"status":{"enum":["pending","processing","completed","failed"],"type":"string"},"total_emails":{"type":"integer"}},"type":"object"}},"title":"BatchJobResponse","type":"object"},"GdprBreachReportRequest":{"description":"Zgłoszenie naruszenia ochrony danych osobowych (Art. 33 RODO)","properties":{"affected_subjects_count":{"description":"Szacowana liczba osób, których dane dotyczą","example":1500,"nullable":true,"type":"integer"},"breach_type":{"description":"Typ naruszenia","enum":["confidentiality","integrity","availability","mixed"],"example":"confidentiality","type":"string"},"data_categories_affected":{"description":"Kategorie danych objętych naruszeniem","example":["email","name","phone"],"items":{"type":"string"},"type":"array"},"description":{"description":"Szczegółowy opis naruszenia","example":"Wykryto nieautoryzowany dostęp do bazy danych z adresami e-mail","type":"string"},"discovered_at":{"description":"Data i czas wykrycia naruszenia","example":"2024-01-15T08:30:00Z","format":"date-time","type":"string"},"immediate_actions":{"description":"Podjęte działania natychmiastowe","example":["Zablokowano dostęp do bazy","Zmieniono hasła"],"items":{"type":"string"},"nullable":true,"type":"array"},"occurred_at":{"description":"Szacowana data wystąpienia naruszenia (jeśli znana)","example":"2024-01-14T22:00:00Z","format":"date-time","nullable":true,"type":"string"},"reported_by":{"description":"Osoba zgłaszająca naruszenie","example":"Jan Kowalski (Administrator IT)","type":"string"},"severity":{"description":"Wstępna ocena powagi naruszenia","enum":["low","medium","high","critical"],"example":"high","type":"string"},"title":{"description":"Tytuł/nazwa naruszenia","example":"Wyciek danych klientów z bazy mailingowej","type":"string"}},"required":["title","description","breach_type","discovered_at"],"title":"GdprBreachReportRequest","type":"object"},"PreferenceUrlResponse":{"description":"URL do centrum preferencji odbiorcy","example":{"preference_url":"https://api.mailingapi.com/v1/preferences/abc123token"},"properties":{"preference_url":{"description":"URL do centrum preferencji z tokenem","format":"uri","type":"string"}},"title":"PreferenceUrlResponse","type":"object"},"EventResponse":{"description":"Odpowiedź zawierająca pojedynczy event","example":{"event":{"actor":"smtp_server","data":{"message_id":"abc123@mailingapi.com","recipient":"user@example.com"},"id":"550e8400-e29b-41d4-a716-446655440000","metadata":{},"occurred_at":"2024-01-15T10:30:05Z","organization_id":"123e4567-e89b-12d3-a456-426614174000","recorded_at":"2024-01-15T10:30:06Z","severity":"info","tags":["email","delivery"],"type":"delivered","version":1}},"properties":{"event":{"$ref":"#/components/schemas/Event"}},"required":["event"],"title":"EventResponse","type":"object"},"DomainDnsRecordsResponse":{"description":"Rekordy DNS wymagane do konfiguracji domeny","properties":{"data":{"properties":{"dkim":{"properties":{"name":{"example":"mailingapi._domainkey","type":"string"},"type":{"example":"TXT","type":"string"},"value":{"type":"string"},"verified":{"type":"boolean"}},"type":"object"},"dmarc":{"properties":{"name":{"example":"_dmarc","type":"string"},"type":{"example":"TXT","type":"string"},"value":{"example":"v=DMARC1; p=none; rua=mailto:dmarc@mailingapi.com","type":"string"},"verified":{"type":"boolean"}},"type":"object"},"mx":{"description":"Rekord MX (tylko jeśli inbound jest włączony)","nullable":true,"properties":{"name":{"example":"@","type":"string"},"type":{"example":"MX","type":"string"},"value":{"example":"10 mx.mailingapi.com","type":"string"},"verified":{"type":"boolean"}},"type":"object"},"spf":{"properties":{"name":{"example":"@","type":"string"},"type":{"example":"TXT","type":"string"},"value":{"example":"v=spf1 include:spf.mailingapi.com ~all","type":"string"},"verified":{"type":"boolean"}},"type":"object"}},"type":"object"}},"title":"DomainDnsRecordsResponse","type":"object"},"InboundAttachmentResponse":{"description":"Presigned URL do pobrania załącznika","example":{"data":{"content_type":"application/pdf","expires_in":3600,"filename":"document.pdf","size":102400,"url":"https://r2.cloudflarestorage.com/..."}},"properties":{"data":{"properties":{"content_type":{"type":"string"},"expires_in":{"description":"Czas ważności URL w sekundach","example":3600,"type":"integer"},"filename":{"type":"string"},"size":{"type":"integer"},"url":{"description":"Presigned URL do pobrania (ważny 1h)","format":"uri","type":"string"}},"type":"object"}},"title":"InboundAttachmentResponse","type":"object"},"TemplateStatsResponse":{"description":"Statystyki szablonów organizacji","properties":{"data":{"properties":{"active":{"description":"Liczba aktywnych szablonów","type":"integer"},"archived":{"description":"Liczba zarchiwizowanych","type":"integer"},"draft":{"description":"Liczba szkiców","type":"integer"},"total":{"description":"Łączna liczba szablonów","type":"integer"}},"type":"object"}},"title":"TemplateStatsResponse","type":"object"},"RenderTemplateRequest":{"description":"Dane do wyrenderowania szablonu","example":{"data":{"company":"Acme Corp","name":"Jan Kowalski"}},"properties":{"data":{"additionalProperties":true,"description":"Dane do podstawienia w zmiennych szablonu","example":{"company":"Acme Corp","name":"Jan Kowalski"},"type":"object"}},"title":"RenderTemplateRequest","type":"object"},"InboundAttachment":{"description":"Metadane załącznika wiadomości przychodzącej","properties":{"content_type":{"description":"Typ MIME","example":"application/pdf","type":"string"},"filename":{"description":"Nazwa pliku","example":"document.pdf","type":"string"},"size":{"description":"Rozmiar w bajtach","example":102400,"type":"integer"}},"title":"InboundAttachment","type":"object"},"GdprDeletionResponse":{"description":"Szczegóły żądania usunięcia z komunikatem","example":{"data":{"id":"550e8400-e29b-41d4-a716-446655440000","request_type":"recipient_deletion","requester_email":"user@example.com","status":"scheduled"},"message":"Deletion request confirmed and scheduled."},"properties":{"data":{"$ref":"#/components/schemas/GdprDeletionEntry"},"message":{"description":"Komunikat informacyjny","type":"string"}},"title":"GdprDeletionResponse","type":"object"},"UpdateApiKeyRequest":{"description":"Dane do aktualizacji istniejącego klucza API","example":{"name":"Klucz produkcyjny v2","permissions":["send"]},"properties":{"allowed_ips":{"description":"Lista dozwolonych adresów IP","items":{"type":"string"},"nullable":true,"type":"array"},"expires_at":{"description":"Nowa data wygaśnięcia","format":"date-time","nullable":true,"type":"string"},"name":{"description":"Nowa nazwa klucza","example":"Klucz produkcyjny v2","type":"string"},"permissions":{"description":"Lista uprawnień","items":{"enum":["send","read","manage"],"type":"string"},"type":"array"}},"title":"UpdateApiKeyRequest","type":"object"}},"securitySchemes":{"basic_auth":{"description":"Basic Auth - dowolny użytkownik, hasło = klucz API","scheme":"basic","type":"http"},"bearer_auth":{"bearerFormat":"API Key","description":"Klucz API w formacie ob_live_xxx","scheme":"bearer","type":"http"}}},"info":{"contact":{"email":"support@mailingapi.com","name":"MailingAPI Support","url":"https://mailingapi.com/docs"},"description":"API platformy e-mailowej MailingAPI.\n\n## Autentykacja\n\nWszystkie requesty API muszą zawierać klucz API w nagłówku `Authorization`:\n\n```\nAuthorization: Bearer ob_live_xxx...\n```\n\nAlternatywnie można użyć Basic Auth (użytkownik może być dowolny, hasło to klucz API).\n\n## Rate Limiting\n\nAPI posiada trzystopniowe rate limiting:\n\n**1. Per-second (burst)** — domyślnie 10 req/s, konfigurowalny per API key (`rate_limit_per_second`)\n\n**2. Per-minute** — domyślne limity zależne od akcji:\n\n| Akcja | Domyślny limit | Opis |\n|-------|---------------|------|\n| send  | 100 req/min   | Wysyłka wiadomości |\n| read  | 1000 req/min  | Odczyt danych |\n| manage | 100 req/min  | Zarządzanie zasobami |\n\nLimity mogą być nadpisane per API key (`rate_limit_per_minute`).\n\n**3. Daily (wysyłka)** — opcjonalny limit dzienny per domena (`daily_send_limit`)\n\nNagłówki odpowiedzi:\n- `X-RateLimit-Limit` — maksymalna liczba requestów w oknie\n- `X-RateLimit-Remaining` — pozostała liczba requestów\n- `X-RateLimit-Reset` — timestamp resetu limitu\n- `Retry-After` — sekundy do odczekania (przy 429)\n- `X-Daily-Limit` / `X-Daily-Remaining` — limity dzienne (jeśli skonfigurowane)\n\n## Idempotencja\n\n`POST /v1/messages/send`, `/batch` i `/analyze` przyjmują nagłówek `Idempotency-Key`\n(1–255 znaków, ważny 24 h, w obrębie klucza API). Ponowienie z tym samym kluczem\ni tym samym body zwraca oryginalną odpowiedź z nagłówkiem `Idempotent-Replayed: true`\n— bez ponownej wysyłki. Batch jest jedną całością.\n\n| Sytuacja | Odpowiedź | Ponawiać? |\n|----------|-----------|-----------|\n| Ten sam klucz, inne body | 422 `idempotency_key_reused` | Nie |\n| Pierwsze żądanie wciąż w toku | 409 `idempotency_request_in_progress` + `Retry-After` | Tak |\n| Klucz pusty lub > 255 znaków | 400 `invalid_idempotency_key` | Nie |\n\nOdpowiedzi 5xx i 429 nie są zapisywane — ponowienie wykona żądanie od nowa.\n\n## Paginacja\n\nEndpointy zwracające listy obsługują paginację offset-based:\n\n| Parametr | Opis | Domyślnie |\n|----------|------|-----------|\n| `limit`  | Liczba wyników (1-100) | 50 |\n| `offset` | Przesunięcie od początku | 0 |\n\nOdpowiedź zawiera obiekt `meta` z informacjami o paginacji:\n\n```json\n{\n  \"data\": [...],\n  \"meta\": {\n    \"count\": 50,\n    \"total\": 1234,\n    \"limit\": 50,\n    \"offset\": 0,\n    \"has_more\": true\n  }\n}\n```\n\n## Błędy\n\nAPI zwraca błędy w formacie JSON:\n\n```json\n{\n  \"error\": {\n    \"code\": \"validation_failed\",\n    \"message\": \"Błąd walidacji\",\n    \"details\": {\"subject\": [\"can't be blank\"]}\n  }\n}\n```\n\n`code` jest stabilny — używaj go w kodzie zamiast `message`. `details` występuje\ntylko przy `validation_failed`, `retry_after` (sekundy) tylko przy 429.\n\n| HTTP | Przykładowe `code` | Ponawiać? |\n|------|--------------------|-----------|\n| 400 | `bad_request`, `invalid_idempotency_key` | Nie |\n| 401 | `missing_auth`, `invalid_key`, `insufficient_permissions` | Nie |\n| 403 | `forbidden`, `organization_not_active`, `domain_not_verified`, `daily_limit_reached` | Nie |\n| 404 | `not_found` | Nie |\n| 409 | `idempotency_request_in_progress` | Tak, po `Retry-After` |\n| 409 | `conflict` | Nie |\n| 422 | `validation_failed`, `idempotency_key_reused` | Nie |\n| 429 | `rate_limit_exceeded`, `daily_limit_exceeded`, `recipient_rate_limited` | Tak, po `Retry-After` |\n| 5xx | `internal_error` | Tak, z backoffem i tym samym `Idempotency-Key` |\n","license":{"name":"Proprietary"},"title":"MailingAPI","version":"1.0.0"},"openapi":"3.0.0","paths":{"/v1/inbound/messages":{"get":{"callbacks":{},"description":"Zwraca listę wiadomości przychodzących z filtrowaniem i paginacją.\nWiadomości są sortowane od najnowszych.\n","operationId":"OutboxaApiWeb.V1.InboundMessageController.index","parameters":[{"description":"Liczba wyników na stronę (domyślnie 50, max 100)","in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Filtruj po adresie nadawcy (dokładne dopasowanie)","in":"query","name":"from","required":false,"schema":{"format":"email","type":"string"}},{"description":"Filtruj po adresie odbiorcy (dokładne dopasowanie)","in":"query","name":"to","required":false,"schema":{"format":"email","type":"string"}},{"description":"Wiadomości od tej daty (ISO 8601)","in":"query","name":"since","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Wiadomości do tej daty (ISO 8601)","in":"query","name":"until","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Filtruj po ID domeny","in":"query","name":"domain_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Filtruj po oznaczeniu spam (true/false)","in":"query","name":"is_spam","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundMessageListResponse"}}},"description":"Lista wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista wiadomości przychodzących","tags":["Inbound Messages"]}},"/v1/messages":{"get":{"callbacks":{},"description":"Zwraca listę wiadomości z możliwością filtrowania po statusie, odbiorcy i zakresie dat.","operationId":"OutboxaApiWeb.V1.MessageController.index","parameters":[{"description":"Liczba wyników (1-100, domyślnie 50)","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Przesunięcie (domyślnie 0)","in":"query","name":"offset","required":false,"schema":{"type":"integer"}},{"description":"Filtruj po statusie (queued, sent, delivered, bounced, complained)","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Filtruj po adresie odbiorcy","in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Wiadomości od daty (ISO 8601)","in":"query","name":"since","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Wiadomości do daty (ISO 8601)","in":"query","name":"until","required":false,"schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagesListResponse"}}},"description":"Lista wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista wiadomości","tags":["Messages"]}},"/v1/billing/invoices":{"get":{"callbacks":{},"description":"Zwraca listę faktur i płatności organizacji.\nWyniki są posortowane od najnowszych. Wspiera paginację przez limit i offset.\n","operationId":"OutboxaApiWeb.V1.BillingController.invoices","parameters":[{"description":"Liczba wyników na stronę","in":"query","name":"limit","required":false,"schema":{"default":25,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicesResponse"}}},"description":"Lista faktur"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista faktur","tags":["Billing"]}},"/v1/auth/verify/{token}":{"get":{"callbacks":{},"description":"Weryfikuje adres e-mail na podstawie tokenu otrzymanego w wiadomości.\nPo pomyślnej weryfikacji konto zmienia status z `pending` na `active`.\n","operationId":"OutboxaApiWeb.V1.AuthController.verify_email","parameters":[{"description":"Token weryfikacyjny z e-maila","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailResponse"}}},"description":"E-mail zweryfikowany"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy lub wygasły token weryfikacyjny"}},"security":[],"summary":"Weryfikacja adresu e-mail","tags":["Auth"]}},"/health":{"get":{"callbacks":{},"description":"Zwraca status zdrowia API i wszystkich komponentów (baza danych, kolejki).","operationId":"OutboxaApiWeb.HealthController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponse"}}},"description":"System działa poprawnie"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponse"}}},"description":"System zdegradowany"}},"summary":"Health check","tags":["System"]}},"/v1/messages/{message_id}/events":{"get":{"callbacks":{},"description":"Zwraca historię eventów dla wiadomości (sent, delivered, opened, clicked, bounced, complained).","operationId":"OutboxaApiWeb.V1.MessageController.events","parameters":[{"description":"ID wiadomości","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageEventsResponse"}}},"description":"Lista eventów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie znaleziona"}},"summary":"Lista eventów wiadomości","tags":["Messages"]}},"/v1/events/{id}":{"get":{"callbacks":{},"description":"Zwraca pełne informacje o pojedynczym evencie.","operationId":"OutboxaApiWeb.V1.EventsController.show","parameters":[{"description":"ID eventu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"Szczegóły eventu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Event nie znaleziony"}},"summary":"Szczegóły eventu","tags":["Events"]}},"/v1/events/stats":{"get":{"callbacks":{},"description":"Zwraca zagregowane statystyki eventów dla określonego okresu czasowego.\n\nDomyślnie zwraca statystyki z ostatnich 24 godzin.\nStatystyki zawierają liczniki według typu eventu i poziomu ważności.\n","operationId":"OutboxaApiWeb.V1.EventsController.stats","parameters":[{"description":"Data początkowa (ISO 8601). Domyślnie: 24 godziny wstecz.","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Data końcowa (ISO 8601). Domyślnie: teraz.","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventStatsResponse"}}},"description":"Statystyki eventów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki eventów","tags":["Events"]}},"/v1/templates/{template_id}/versions/{version}/restore":{"post":{"callbacks":{},"description":"Przywraca szablon do wybranej historycznej wersji.","operationId":"OutboxaApiWeb.V1.TemplateController.restore_version","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Numer wersji do przywrócenia","in":"path","name":"version","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon przywrócony"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon lub wersja nie znaleziona"}},"summary":"Przywróć wersję szablonu","tags":["Templates"]}},"/v1/gdpr/breaches/{id}/assess":{"post":{"callbacks":{},"description":"Przeprowadza automatyczną ocenę ryzyka naruszenia na podstawie\nzgromadzonych danych. Wynik określa czy wymagane jest powiadomienie\norganu nadzorczego i/lub osób, których dane dotyczą.\n","operationId":"OutboxaApiWeb.V1.GdprController.assess_breach_risk","parameters":[{"description":"ID naruszenia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachAssessmentRequest"}}},"description":"Dodatkowe informacje","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Ocena zakończona"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Naruszenie nie znalezione"}},"summary":"Oceń ryzyko naruszenia","tags":["GDPR"]}},"/v1/inbox-placement/stats":{"get":{"callbacks":{},"description":"Pobiera zagregowane statystyki inbox placement dla organizacji.","operationId":"OutboxaApiWeb.V1.InboxPlacementController.stats","parameters":[{"description":"Liczba dni wstecz (1-90, domyślnie 30)","in":"query","name":"days","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Statystyki"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki inbox placement","tags":["Inbox Placement"]}},"/v1/messages/{id}":{"get":{"callbacks":{},"description":"Zwraca pełne informacje o wiadomości wraz z jej aktualnym statusem.","operationId":"OutboxaApiWeb.V1.MessageController.show","parameters":[{"description":"ID wiadomości","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}},"description":"Szczegóły wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie znaleziona"}},"summary":"Pobierz szczegóły wiadomości","tags":["Messages"]}},"/v1/validate/single":{"post":{"callbacks":{},"description":"Przeprowadza pełną walidację pojedynczego adresu email.\n\nSprawdzenia obejmują:\n- Walidację składni (RFC 5322)\n- Sprawdzenie rekordów MX domeny\n- Weryfikację SMTP (RCPT TO)\n- Wykrywanie domen disposable\n- Wykrywanie adresów role-based\n- Wykrywanie domen catch-all\n- Sprawdzenie listy suppression\n- Engagement scoring (na podstawie historii)\n","operationId":"OutboxaApiWeb.V1.ValidationController.single","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleValidationRequest"}}},"description":"Dane walidacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}},"description":"Wynik walidacji"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Waliduj pojedynczy adres email","tags":["Email Validation"]}},"/v1/templates/{template_id}/duplicate":{"post":{"callbacks":{},"description":"Tworzy kopię szablonu z nową nazwą. Kopia ma status szkicu.","operationId":"OutboxaApiWeb.V1.TemplateController.duplicate","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateTemplateRequest"}}},"description":"Dane duplikacji","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon zduplikowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Duplikuj szablon","tags":["Templates"]}},"/v1/gdpr/export/recipient":{"post":{"callbacks":{},"description":"Tworzy żądanie eksportu danych konkretnego odbiorcy (np. klienta).\nUżywane do realizacji żądań Art. 15 RODO od osób trzecich.\n","operationId":"OutboxaApiWeb.V1.GdprController.request_recipient_export","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprRecipientExportRequest"}}},"description":"Dane żądania","required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprExportResponse"}}},"description":"Żądanie przyjęte"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Żądanie eksportu danych odbiorcy","tags":["GDPR"]}},"/v1/domains":{"get":{"callbacks":{},"description":"Zwraca listę wszystkich domen przypisanych do organizacji.","operationId":"OutboxaApiWeb.V1.DomainController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainsListResponse"}}},"description":"Lista domen"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista domen","tags":["Domains"]},"post":{"callbacks":{},"description":"Dodaje nową domenę wysyłkową. Po dodaniu należy skonfigurować rekordy DNS i zweryfikować domenę.","operationId":"OutboxaApiWeb.V1.DomainController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"}}},"description":"Dane domeny","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResponse"}}},"description":"Domena utworzona"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Limit osiągnięty"}},"summary":"Dodaj domenę","tags":["Domains"]}},"/v1/consents":{"delete":{"callbacks":{},"description":"Wycofuje zgodę na komunikację dla określonego typu. Odbiorca nie będzie już otrzymywał wiadomości tego typu.","operationId":"OutboxaApiWeb.V1.ConsentController.revoke","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeConsentRequest"}}},"description":"Dane wycofania","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeConsentResponse"}}},"description":"Zgoda wycofana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Zgoda nie znaleziona"}},"summary":"Wycofaj zgodę","tags":["Consents"]},"get":{"callbacks":{},"description":"Zwraca listę zgód z możliwością filtrowania po statusie, typie i adresie e-mail.","operationId":"OutboxaApiWeb.V1.ConsentController.index","parameters":[{"description":"Filtruj po statusie","in":"query","name":"status","required":false,"schema":{"enum":["confirmed","pending","revoked"],"type":"string"}},{"description":"Filtruj po typie zgody","in":"query","name":"consent_type","required":false,"schema":{"enum":["marketing","transactional","newsletter","product_updates","all"],"type":"string"}},{"description":"Filtruj po adresie e-mail","in":"query","name":"email","required":false,"schema":{"format":"email","type":"string"}},{"description":"Liczba wyników na stronę","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentsListResponse"}}},"description":"Lista zgód"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista zgód","tags":["Consents"]},"post":{"callbacks":{},"description":"Nadaje zgodę na komunikację dla odbiorcy. Obsługuje opcjonalne podwójne potwierdzenie (double opt-in),\nktóre wymaga od odbiorcy kliknięcia linku w e-mailu potwierdzającym.\n\nJeśli `double_opt_in` jest ustawione na `true`, zgoda będzie miała status `pending` do momentu\npotwierdzenia przez odbiorcę.\n","operationId":"OutboxaApiWeb.V1.ConsentController.grant","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantConsentRequest"}}},"description":"Dane zgody","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantConsentResponse"}}},"description":"Zgoda nadana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Nadaj zgodę","tags":["Consents"]}},"/v1/inbound/routes":{"get":{"callbacks":{},"description":"Zwraca listę wszystkich reguł routingu przychodzących e-maili dla organizacji.","operationId":"OutboxaApiWeb.V1.InboundRouteController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoutesListResponse"}}},"description":"Lista reguł"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista reguł routingu","tags":["Inbound Routes"]},"post":{"callbacks":{},"description":"Tworzy nową regułę routingu przychodzących e-maili. Reguły określają co zrobić\nz przychodzącą wiadomością na podstawie adresu odbiorcy.\n\n**Typy dopasowania:**\n- `exact` - dokładne dopasowanie adresu\n- `prefix` - dopasowanie początku adresu\n- `suffix` - dopasowanie końca adresu (np. @support.example.com)\n- `regex` - wyrażenie regularne\n- `catchall` - dopasowuje wszystkie wiadomości (najniższy priorytet)\n\n**Akcje:**\n- `webhook` - wysyła POST z danymi wiadomości na URL w action_config\n- `forward` - przekazuje wiadomość na inny adres email\n- `store` - zapisuje wiadomość do późniejszego odbioru przez API\n- `drop` - odrzuca wiadomość\n","operationId":"OutboxaApiWeb.V1.InboundRouteController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInboundRouteRequest"}}},"description":"Dane reguły","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRouteResponse"}}},"description":"Reguła utworzona"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz regułę routingu","tags":["Inbound Routes"]}},"/v1/validate/batch":{"post":{"callbacks":{},"description":"Przeprowadza walidację wielu adresów email.\n\nDla małych list (do 50 emaili) wykonuje synchronicznie.\nDla większych list tworzy asynchroniczny job i zwraca job_id.\n\nMaksymalnie 1000 emaili na request.\n","operationId":"OutboxaApiWeb.V1.ValidationController.batch","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchValidationRequest"}}},"description":"Lista emaili","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchValidationResponse"}}},"description":"Wyniki walidacji (sync)"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchJobResponse"}}},"description":"Job utworzony (async)"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Waliduj wiele adresów email","tags":["Email Validation"]}},"/v1/domains/{domain_id}/dns-records":{"get":{"callbacks":{},"description":"Zwraca listę rekordów DNS (SPF, DKIM, DMARC, MX), które należy skonfigurować dla domeny.","operationId":"OutboxaApiWeb.V1.DomainController.dns_records","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainDnsRecordsResponse"}}},"description":"Rekordy DNS"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Rekordy DNS do konfiguracji","tags":["Domains"]}},"/v1/api-keys/{id}/revoke":{"post":{"callbacks":{},"description":"Natychmiast unieważnia klucz API. Po tej operacji klucz nie może być już używany\ndo autoryzacji żądań. Operacja jest nieodwracalna.\n","operationId":"OutboxaApiWeb.V1.ApiKeyController.revoke","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Klucz unieważniony"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Unieważnij klucz API","tags":["API Keys"]}},"/v1/inbound/routes/{id}":{"delete":{"callbacks":{},"description":"Usuwa regułę routingu. Operacja jest nieodwracalna. Po usunięciu wiadomości nie będą już dopasowywane do tej reguły.","operationId":"OutboxaApiWeb.V1.InboundRouteController.delete","parameters":[{"description":"ID reguły routingu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Reguła usunięta"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Reguła nie znaleziona"}},"summary":"Usuń regułę routingu","tags":["Inbound Routes"]},"get":{"callbacks":{},"description":"Zwraca pełne informacje o regule routingu wraz ze statystykami.","operationId":"OutboxaApiWeb.V1.InboundRouteController.show","parameters":[{"description":"ID reguły routingu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRouteResponse"}}},"description":"Szczegóły reguły"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Reguła nie znaleziona"}},"summary":"Szczegóły reguły routingu","tags":["Inbound Routes"]},"patch":{"callbacks":{},"description":"Aktualizuje istniejącą regułę routingu. Można zmienić dowolne pola oprócz ID, organization_id i domain_id.","operationId":"OutboxaApiWeb.V1.InboundRouteController.update (2)","parameters":[{"description":"ID reguły routingu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInboundRouteRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRouteResponse"}}},"description":"Reguła zaktualizowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Reguła nie znaleziona"}},"summary":"Aktualizuj regułę routingu","tags":["Inbound Routes"]},"put":{"callbacks":{},"description":"Aktualizuje istniejącą regułę routingu. Można zmienić dowolne pola oprócz ID, organization_id i domain_id.","operationId":"OutboxaApiWeb.V1.InboundRouteController.update","parameters":[{"description":"ID reguły routingu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInboundRouteRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRouteResponse"}}},"description":"Reguła zaktualizowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Reguła nie znaleziona"}},"summary":"Aktualizuj regułę routingu","tags":["Inbound Routes"]}},"/v1/templates/{template_id}/versions":{"get":{"callbacks":{},"description":"Zwraca listę historycznych wersji szablonu.","operationId":"OutboxaApiWeb.V1.TemplateController.versions","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateVersionsListResponse"}}},"description":"Lista wersji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Historia wersji szablonu","tags":["Templates"]}},"/v1/domains/{id}":{"delete":{"callbacks":{},"description":"Usuwa domenę z organizacji. Operacja jest nieodwracalna.","operationId":"OutboxaApiWeb.V1.DomainController.delete","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Domena usunięta"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Usuń domenę","tags":["Domains"]},"get":{"callbacks":{},"description":"Zwraca pełne informacje o domenie wraz ze statusem weryfikacji DNS.","operationId":"OutboxaApiWeb.V1.DomainController.show","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResponse"}}},"description":"Szczegóły domeny"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Szczegóły domeny","tags":["Domains"]},"patch":{"callbacks":{},"description":"Ustawia domyślne śledzenie dla całej domeny — nadrzędnie wobec pola\n`tracking` w pojedynczej wysyłce. Pozwala wyłączyć pixel i przepisywanie\nlinków raz dla całej integracji, zamiast pamiętać o tym przy każdym żądaniu.\n\nAktualizacja jest częściowa: pola pominięte zostają bez zmian. Aktualizowalne\nsą wyłącznie trzy przełączniki śledzenia; pozostałe pola domeny (nazwa,\nstatus weryfikacji, klucze DKIM) są ignorowane.\n","operationId":"OutboxaApiWeb.V1.DomainController.update (2)","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainRequest"}}},"description":"Ustawienia śledzenia","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResponse"}}},"description":"Zaktualizowana domena"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Zaktualizuj ustawienia śledzenia domeny","tags":["Domains"]},"put":{"callbacks":{},"description":"Ustawia domyślne śledzenie dla całej domeny — nadrzędnie wobec pola\n`tracking` w pojedynczej wysyłce. Pozwala wyłączyć pixel i przepisywanie\nlinków raz dla całej integracji, zamiast pamiętać o tym przy każdym żądaniu.\n\nAktualizacja jest częściowa: pola pominięte zostają bez zmian. Aktualizowalne\nsą wyłącznie trzy przełączniki śledzenia; pozostałe pola domeny (nazwa,\nstatus weryfikacji, klucze DKIM) są ignorowane.\n","operationId":"OutboxaApiWeb.V1.DomainController.update","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainRequest"}}},"description":"Ustawienia śledzenia","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResponse"}}},"description":"Zaktualizowana domena"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Zaktualizuj ustawienia śledzenia domeny","tags":["Domains"]}},"/v1/gdpr/breaches":{"get":{"callbacks":{},"description":"Zwraca listę zarejestrowanych naruszeń ochrony danych dla organizacji.","operationId":"OutboxaApiWeb.V1.GdprController.list_breaches","parameters":[{"description":"Filtruj po statusie","in":"query","name":"status","required":false,"schema":{"enum":["reported","under_investigation","assessed","authority_notified","subjects_notified","resolved"],"type":"string"}},{"description":"Filtruj po powadze naruszenia","in":"query","name":"severity","required":false,"schema":{"enum":["low","medium","high","critical"],"type":"string"}},{"description":"Maksymalna liczba wyników (domyślnie: 100)","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachListResponse"}}},"description":"Lista naruszeń"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista naruszeń","tags":["GDPR"]},"post":{"callbacks":{},"description":"Rejestruje nowe naruszenie ochrony danych osobowych zgodnie z Art. 33 RODO.\n\nPo zgłoszeniu automatycznie ustawiany jest 72-godzinny termin na powiadomienie\norganu nadzorczego (UODO).\n","operationId":"OutboxaApiWeb.V1.GdprController.report_breach","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachReportRequest"}}},"description":"Dane naruszenia","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Naruszenie zarejestrowane"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Zgłoś naruszenie ochrony danych","tags":["GDPR"]}},"/v1/events":{"get":{"callbacks":{},"description":"Zwraca listę eventów z możliwością filtrowania i paginacji.\n\nEventy reprezentują zdarzenia systemowe takie jak: wysyłka wiadomości (sent),\ndostarczenie (delivered), otwarcie (opened), kliknięcie (clicked),\nodbicie (bounced), skarga (complained), wypisanie (unsubscribed).\n","operationId":"OutboxaApiWeb.V1.EventsController.index","parameters":[{"description":"Filtruj według typu eventu (np. sent, delivered, opened)","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Filtruj według poziomu ważności","in":"query","name":"severity","required":false,"schema":{"enum":["debug","info","warning","error","critical"],"type":"string"}},{"description":"Data początkowa (ISO 8601)","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Data końcowa (ISO 8601)","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Tagi oddzielone przecinkami","in":"query","name":"tags","required":false,"schema":{"type":"string"}},{"description":"Liczba wyników na stronę (max 1000)","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsListResponse"}}},"description":"Lista eventów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista eventów","tags":["Events"]}},"/v1/gdpr/breaches/{id}/resolve":{"post":{"callbacks":{},"description":"Oznacza naruszenie jako rozwiązane/zamknięte. Należy podać notatki\nopisujące podjęte działania naprawcze i wnioski.\n","operationId":"OutboxaApiWeb.V1.GdprController.resolve_breach","parameters":[{"description":"ID naruszenia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResolveRequest"}}},"description":"Notatki zamknięcia","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Naruszenie zamknięte"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Naruszenie nie znalezione"}},"summary":"Zamknij naruszenie","tags":["GDPR"]}},"/v1/messages/batch":{"post":{"callbacks":{},"description":"Wysyła wiele wiadomości e-mail w jednym żądaniu. Maksymalnie 1000 wiadomości.\n\nKażda wiadomość jest przetwarzana niezależnie - błąd w jednej nie blokuje pozostałych.\nOdpowiedź zawiera status każdej wiadomości.\n\nOpcjonalnie można użyć `recipient_variables` do personalizacji treści dla każdego odbiorcy\n(podobnie jak w Mailgun).\n","operationId":"OutboxaApiWeb.V1.MessageController.batch","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSendRequest"}}},"description":"Dane wiadomości batch","required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSendResponse"}}},"description":"Wiadomości zakolejkowane"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Wyślij wiele wiadomości (batch)","tags":["Messages"]}},"/v1/templates/{template_id}/render":{"post":{"callbacks":{},"description":"Renderuje szablon z podanymi danymi (podgląd). Nie aktualizuje statystyk użycia.","operationId":"OutboxaApiWeb.V1.TemplateController.render","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderTemplateRequest"}}},"description":"Dane do renderowania","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderTemplateResponse"}}},"description":"Wyrenderowany szablon"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Renderuj szablon","tags":["Templates"]}},"/v1/billing/usage":{"get":{"callbacks":{},"description":"Zwraca statystyki zużycia dla bieżącego okresu rozliczeniowego.\nObejmuje liczbę wysłanych emaili, limit, pozostałe emaile oraz wykorzystanie API.\n","operationId":"OutboxaApiWeb.V1.BillingController.usage","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}},"description":"Statystyki zużycia"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki zużycia","tags":["Billing"]}},"/v1/gdpr/export/{id}":{"get":{"callbacks":{},"description":"Sprawdza status zadania eksportu danych.","operationId":"OutboxaApiWeb.V1.GdprController.export_status","parameters":[{"description":"ID zadania eksportu (job_id)","in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprExportStatusResponse"}}},"description":"Status eksportu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Eksport nie znaleziony"}},"summary":"Status eksportu","tags":["GDPR"]}},"/v1/billing/checkout":{"post":{"callbacks":{},"description":"Tworzy sesję płatności dla nowej subskrypcji lub upgrade'u.\nZwraca URL do przekierowania użytkownika na stronę płatności.\n","operationId":"OutboxaApiWeb.V1.BillingController.checkout","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"description":"Parametry checkout","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}},"description":"Sesja checkout utworzona"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz sesję checkout","tags":["Billing"]}},"/v1/consents/stats":{"get":{"callbacks":{},"description":"Zwraca zagregowane statystyki zgód dla organizacji.","operationId":"OutboxaApiWeb.V1.ConsentController.stats","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentStatsResponse"}}},"description":"Statystyki zgód"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki zgód","tags":["Consents"]}},"/v1/webhooks":{"get":{"callbacks":{},"description":"Zwraca listę wszystkich skonfigurowanych webhooków dla organizacji.","operationId":"OutboxaApiWeb.V1.WebhookController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhooksListResponse"}}},"description":"Lista webhooków"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista webhooków","tags":["Webhooks"]},"post":{"callbacks":{},"description":"Tworzy nową konfigurację webhooka. Po utworzeniu zostanie wygenerowany secret do weryfikacji podpisów HMAC.","operationId":"OutboxaApiWeb.V1.WebhookController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"description":"Dane webhooka","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Webhook utworzony"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Limit osiągnięty"}},"summary":"Utwórz webhook","tags":["Webhooks"]}},"/v1/preferences/{token}":{"get":{"callbacks":{},"description":"Publiczny endpoint do pobierania preferencji odbiorcy przy użyciu tokenu.\nNie wymaga autoryzacji API - token służy jako autoryzacja.\n\nTen endpoint jest używany przez centrum preferencji do wyświetlenia aktualnych ustawień odbiorcy.\n","operationId":"OutboxaApiWeb.V1.ConsentController.get_preferences","parameters":[{"description":"Token preferencji (z URL)","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPreferencesResponse"}}},"description":"Preferencje odbiorcy"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy lub wygasły token"}},"security":[],"summary":"Pobierz preferencje (publiczny)","tags":["Consents"]},"put":{"callbacks":{},"description":"Publiczny endpoint do aktualizacji preferencji odbiorcy przy użyciu tokenu.\nNie wymaga autoryzacji API - token służy jako autoryzacja.\n\nTen endpoint jest używany przez centrum preferencji do zapisywania zmian ustawień odbiorcy.\n","operationId":"OutboxaApiWeb.V1.ConsentController.update_preferences","parameters":[{"description":"Token preferencji (z URL)","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePreferencesRequest"}}},"description":"Preferencje do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePreferencesResponse"}}},"description":"Preferencje zaktualizowane"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy lub wygasły token"}},"security":[],"summary":"Aktualizuj preferencje (publiczny)","tags":["Consents"]}},"/v1/consents/check":{"get":{"callbacks":{},"description":"Sprawdza czy odbiorca ma aktywną zgodę na określony typ komunikacji.","operationId":"OutboxaApiWeb.V1.ConsentController.check","parameters":[{"description":"Adres e-mail odbiorcy","in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}},{"description":"Typ zgody do sprawdzenia","in":"query","name":"consent_type","required":true,"schema":{"enum":["marketing","transactional","newsletter","product_updates","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckConsentResponse"}}},"description":"Status zgody"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Sprawdź status zgody","tags":["Consents"]}},"/v1/inbox-placement/tests/{id}":{"delete":{"callbacks":{},"description":"Anuluje test inbox placement (jeśli jeszcze nie zakończony).","operationId":"OutboxaApiWeb.V1.InboxPlacementController.cancel_test","parameters":[{"description":"ID testu","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Test anulowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Test nie może być anulowany"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Test nie znaleziony"}},"summary":"Anuluj test","tags":["Inbox Placement"]},"get":{"callbacks":{},"description":"Pobiera szczegóły i wyniki testu inbox placement.","operationId":"OutboxaApiWeb.V1.InboxPlacementController.show_test","parameters":[{"description":"ID testu","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Szczegóły testu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Test nie znaleziony"}},"summary":"Szczegóły testu","tags":["Inbox Placement"]}},"/v1/messages/scheduled":{"get":{"callbacks":{},"description":"Zwraca listę zaplanowanych do wysłania wiadomości.","operationId":"OutboxaApiWeb.V1.MessageController.scheduled","parameters":[{"description":"Od daty (ISO 8601)","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Do daty (ISO 8601)","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Limit wyników (domyślnie 50)","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Offset (domyślnie 0)","in":"query","name":"offset","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagesListResponse"}}},"description":"Lista zaplanowanych wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista zaplanowanych wiadomości","tags":["Messages"]}},"/v1/templates/stats":{"get":{"callbacks":{},"description":"Zwraca statystyki szablonów organizacji.","operationId":"OutboxaApiWeb.V1.TemplateController.stats","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateStatsResponse"}}},"description":"Statystyki"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki szablonów","tags":["Templates"]}},"/v1/templates/{id}":{"delete":{"callbacks":{},"description":"Archiwizuje szablon (soft delete). Szablon nie będzie dostępny do użycia.","operationId":"OutboxaApiWeb.V1.TemplateController.delete","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Szablon usunięty"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Usuń szablon","tags":["Templates"]},"get":{"callbacks":{},"description":"Zwraca pełne informacje o szablonie email.","operationId":"OutboxaApiWeb.V1.TemplateController.show","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szczegóły szablonu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Szczegóły szablonu","tags":["Templates"]},"patch":{"callbacks":{},"description":"Aktualizuje szablon email. Przy zmianie treści tworzona jest nowa wersja.","operationId":"OutboxaApiWeb.V1.TemplateController.update (2)","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Aktualizuj szablon","tags":["Templates"]},"put":{"callbacks":{},"description":"Aktualizuje szablon email. Przy zmianie treści tworzona jest nowa wersja.","operationId":"OutboxaApiWeb.V1.TemplateController.update","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Aktualizuj szablon","tags":["Templates"]}},"/v1/suppressions/stats":{"get":{"callbacks":{},"description":"Zwraca statystyki listy blokowanych/dozwolonych dla organizacji.\nZawiera podsumowanie według typu wpisu, źródła i typu listy.\n","operationId":"OutboxaApiWeb.V1.SuppressionController.stats","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionStatsResponse"}}},"description":"Statystyki"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki suppression list","tags":["Suppressions"]}},"/v1/gdpr/export":{"post":{"callbacks":{},"description":"Tworzy żądanie eksportu wszystkich danych organizacji zgodnie z Art. 15 i 20 RODO\n(prawo dostępu i przenoszenia danych).\n\nEksport jest przetwarzany asynchronicznie. Po zakończeniu, plik będzie dostępny\ndo pobrania przez określony czas.\n","operationId":"OutboxaApiWeb.V1.GdprController.request_export","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprExportRequest"}}},"description":"Parametry eksportu","required":false},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprExportResponse"}}},"description":"Żądanie przyjęte"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Żądanie eksportu danych organizacji","tags":["GDPR"]}},"/v1/inbound/messages/{id}":{"delete":{"callbacks":{},"description":"Usuwa wiadomość przychodzącą wraz z załącznikami z R2.\nOperacja jest nieodwracalna.\n","operationId":"OutboxaApiWeb.V1.InboundMessageController.delete","parameters":[{"description":"ID wiadomości do usunięcia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":"Wiadomość usunięta"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie istnieje"}},"summary":"Usuń wiadomość przychodzącą","tags":["Inbound Messages"]},"get":{"callbacks":{},"description":"Zwraca pełne dane wiadomości przychodzącej wraz z treścią,\nnagłówkami, informacjami o wątku i wynikami autentykacji.\n","operationId":"OutboxaApiWeb.V1.InboundMessageController.show","parameters":[{"description":"ID wiadomości","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundMessageResponse"}}},"description":"Szczegóły wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie istnieje"}},"summary":"Szczegóły wiadomości przychodzącej","tags":["Inbound Messages"]}},"/v1/consents/recipient":{"get":{"callbacks":{},"description":"Zwraca wszystkie zgody dla konkretnego odbiorcy.","operationId":"OutboxaApiWeb.V1.ConsentController.get_recipient_consents","parameters":[{"description":"Adres e-mail odbiorcy","in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientConsentsResponse"}}},"description":"Zgody odbiorcy"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Pobierz zgody odbiorcy","tags":["Consents"]}},"/v1/inbox-placement/seed-lists":{"get":{"callbacks":{},"description":"Pobiera listę dostępnych seed lists do testów inbox placement.","operationId":"OutboxaApiWeb.V1.InboxPlacementController.list_seed_lists","parameters":[{"description":"Filtruj po providerze (gmail, outlook, yahoo)","in":"query","name":"provider","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"type":"object"},"type":"array"}},"type":"object"}}},"description":"Lista seed lists"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista seed lists","tags":["Inbox Placement"]}},"/v1/gdpr/activities/{id}":{"get":{"callbacks":{},"description":"Zwraca szczegóły pojedynczej czynności przetwarzania.","operationId":"OutboxaApiWeb.V1.GdprController.get_activity","parameters":[{"description":"ID czynności przetwarzania","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityResponse"}}},"description":"Szczegóły czynności"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Czynność nie znaleziona"}},"summary":"Szczegóły czynności przetwarzania","tags":["GDPR"]},"put":{"callbacks":{},"description":"Aktualizuje istniejący wpis w rejestrze czynności przetwarzania.","operationId":"OutboxaApiWeb.V1.GdprController.update_activity","parameters":[{"description":"ID czynności przetwarzania","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityUpdateRequest"}}},"description":"Dane do aktualizacji","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityResponse"}}},"description":"Czynność zaktualizowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Czynność nie znaleziona"}},"summary":"Aktualizuj czynność przetwarzania","tags":["GDPR"]}},"/v1/audit-logs":{"get":{"callbacks":{},"description":"Zwraca listę wpisów logu audytu dla organizacji. Można filtrować po akcji,\nkluczu API, statusie, adresie IP oraz zakresie dat.\n","operationId":"OutboxaApiWeb.V1.AuditLogController.index","parameters":[{"description":"Filtruj po ID klucza API","in":"query","name":"api_key_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Filtruj po akcji (np. api_key.created, message.sent)","in":"query","name":"action","required":false,"schema":{"type":"string"}},{"description":"Filtruj po kodzie statusu HTTP","in":"query","name":"status","required":false,"schema":{"type":"integer"}},{"description":"Filtruj po adresie IP","in":"query","name":"ip","required":false,"schema":{"type":"string"}},{"description":"Data początkowa (ISO 8601)","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Data końcowa (ISO 8601)","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Liczba wyników na stronę","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogsListResponse"}}},"description":"Lista logów audytu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista logów audytu","tags":["Audit Logs"]}},"/v1/inbox-placement/tests":{"get":{"callbacks":{},"description":"Pobiera listę testów inbox placement dla organizacji.","operationId":"OutboxaApiWeb.V1.InboxPlacementController.list_tests","parameters":[{"description":"Filtruj po statusie (pending, running, completed, failed)","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit wyników (1-100, domyślnie 50)","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Lista testów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista testów","tags":["Inbox Placement"]},"post":{"callbacks":{},"description":"Tworzy nowy test inbox placement.\n\nTest wysyła wiadomość do adresów z wybranych seed lists,\na następnie sprawdza gdzie trafiła (inbox, spam, promotions, etc.).\n","operationId":"OutboxaApiWeb.V1.InboxPlacementController.create_test","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"check_after_minutes":{"default":15,"description":"Czas oczekiwania przed sprawdzeniem wyników (minuty)","maximum":60,"minimum":5,"type":"integer"},"from_email":{"description":"Adres nadawcy","format":"email","type":"string"},"from_name":{"description":"Nazwa nadawcy","type":"string"},"name":{"description":"Nazwa testu","type":"string"},"seed_list_ids":{"description":"Lista ID seed lists do użycia","items":{"format":"uuid","type":"string"},"type":"array"},"subject":{"description":"Temat wiadomości testowej","type":"string"}},"required":["seed_list_ids"],"type":"object"}}},"description":"Dane testu","required":false},"responses":{"202":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Test utworzony"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz test inbox placement","tags":["Inbox Placement"]}},"/v1/billing/plans":{"get":{"callbacks":{},"description":"Zwraca listę wszystkich dostępnych planów subskrypcyjnych z cenami.\nMożesz filtrować po walucie i interwale rozliczeniowym.\n","operationId":"OutboxaApiWeb.V1.BillingController.plans","parameters":[{"description":"Waluta dla cen","in":"query","name":"currency","required":false,"schema":{"default":"PLN","enum":["PLN","EUR","USD"],"type":"string"}},{"description":"Filtruj ceny do konkretnego interwału","in":"query","name":"interval","required":false,"schema":{"enum":["monthly","quarterly","yearly"],"nullable":true,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlansResponse"}}},"description":"Lista planów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista planów","tags":["Billing"]}},"/v1/suppressions/{id}":{"delete":{"callbacks":{},"description":"Trwale usuwa wpis z listy blokowanych/dozwolonych.","operationId":"OutboxaApiWeb.V1.SuppressionController.delete","parameters":[{"description":"ID wpisu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Wpis usunięty"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wpis nie znaleziony"}},"summary":"Usuń wpis z suppression list","tags":["Suppressions"]},"get":{"callbacks":{},"description":"Zwraca szczegóły pojedynczego wpisu na liście blokowanych/dozwolonych.","operationId":"OutboxaApiWeb.V1.SuppressionController.show","parameters":[{"description":"ID wpisu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionResponse"}}},"description":"Szczegóły wpisu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wpis nie znaleziony"}},"summary":"Szczegóły wpisu","tags":["Suppressions"]}},"/v1/gdpr/activities":{"get":{"callbacks":{},"description":"Zwraca rejestr czynności przetwarzania danych osobowych zgodnie z Art. 30 RODO.\n","operationId":"OutboxaApiWeb.V1.GdprController.list_activities","parameters":[{"description":"Filtruj po statusie czynności","in":"query","name":"status","required":false,"schema":{"enum":["active","inactive","under_review"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityListResponse"}}},"description":"Lista czynności"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista czynności przetwarzania","tags":["GDPR"]},"post":{"callbacks":{},"description":"Dodaje nowy wpis do rejestru czynności przetwarzania danych osobowych (Art. 30 RODO).\n","operationId":"OutboxaApiWeb.V1.GdprController.create_activity","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityCreateRequest"}}},"description":"Dane czynności","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprActivityResponse"}}},"description":"Czynność utworzona"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz czynność przetwarzania","tags":["GDPR"]}},"/v1/messages/{message_id}/schedule":{"delete":{"callbacks":{},"description":"Anuluje zaplanowaną wysyłkę wiadomości.","operationId":"OutboxaApiWeb.V1.MessageController.cancel_scheduled","parameters":[{"description":"ID wiadomości","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}},"description":"Wiadomość anulowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie jest zaplanowana"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie znaleziona"}},"summary":"Anuluj zaplanowaną wiadomość","tags":["Messages"]}},"/v1/activity/{id}":{"get":{"callbacks":{},"description":"Zwraca pełne informacje o wpisie w logu aktywności.","operationId":"OutboxaApiWeb.V1.ActivityController.show","parameters":[{"description":"ID wpisu aktywności","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponse"}}},"description":"Szczegóły wpisu aktywności"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wpis nie znaleziony"}},"summary":"Szczegóły wpisu aktywności","tags":["Activity"]}},"/v1/gdpr/deletion":{"post":{"callbacks":{},"description":"Tworzy nowe żądanie usunięcia danych zgodnie z Art. 17 RODO (prawo do bycia zapomnianym).\n\nPo utworzeniu żądania, na adres e-mail osoby żądającej zostanie wysłany link weryfikacyjny.\nŻądanie musi zostać potwierdzone przed wykonaniem.\n","operationId":"OutboxaApiWeb.V1.GdprController.create_deletion_request","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionRequest"}}},"description":"Dane żądania","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionResponse"}}},"description":"Żądanie utworzone"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz żądanie usunięcia danych","tags":["GDPR"]}},"/v1/gdpr/deletions":{"get":{"callbacks":{},"description":"Zwraca listę żądań usunięcia danych dla organizacji.","operationId":"OutboxaApiWeb.V1.GdprController.list_deletion_requests","parameters":[{"description":"Filtruj po statusie","in":"query","name":"status","required":false,"schema":{"enum":["pending_verification","confirmed","scheduled","in_progress","completed","cancelled"],"type":"string"}},{"description":"Maksymalna liczba wyników (domyślnie: 100)","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionListResponse"}}},"description":"Lista żądań"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista żądań usunięcia","tags":["GDPR"]}},"/v1/gdpr/register/export":{"get":{"callbacks":{},"description":"Eksportuje cały rejestr czynności przetwarzania w wybranym formacie.\nDomyślny format to JSON.\n","operationId":"OutboxaApiWeb.V1.GdprController.export_register","parameters":[{"description":"Format eksportu (json lub pdf)","in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","pdf"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Eksport rejestru"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Format nie zaimplementowany"}},"summary":"Eksport rejestru czynności","tags":["GDPR"]}},"/v1/gdpr/breaches/{id}/notify-subjects":{"post":{"callbacks":{},"description":"Rejestruje fakt powiadomienia osób, których dane dotyczą, o naruszeniu\nzgodnie z Art. 34 RODO. Wymagane gdy naruszenie może powodować wysokie\nryzyko naruszenia praw lub wolności osób fizycznych.\n","operationId":"OutboxaApiWeb.V1.GdprController.notify_subjects","parameters":[{"description":"ID naruszenia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Powiadomienie zarejestrowane"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Naruszenie nie znalezione"}},"summary":"Zarejestruj powiadomienie osób","tags":["GDPR"]}},"/v1/api-keys/{id}":{"delete":{"callbacks":{},"description":"Trwale usuwa klucz API z systemu. Po usunięciu klucz nie może być odzyskany\nani użyty do autoryzacji. Operacja jest nieodwracalna.\n","operationId":"OutboxaApiWeb.V1.ApiKeyController.delete","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Klucz usunięty"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Usuń klucz API","tags":["API Keys"]},"get":{"callbacks":{},"description":"Zwraca pełne informacje o kluczu API.","operationId":"OutboxaApiWeb.V1.ApiKeyController.show","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Szczegóły klucza API"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Szczegóły klucza API","tags":["API Keys"]},"patch":{"callbacks":{},"description":"Aktualizuje dane istniejącego klucza API (nazwę, uprawnienia, datę wygaśnięcia, listę IP).","operationId":"OutboxaApiWeb.V1.ApiKeyController.update (2)","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Klucz API zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Aktualizuj klucz API","tags":["API Keys"]},"put":{"callbacks":{},"description":"Aktualizuje dane istniejącego klucza API (nazwę, uprawnienia, datę wygaśnięcia, listę IP).","operationId":"OutboxaApiWeb.V1.ApiKeyController.update","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Klucz API zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Aktualizuj klucz API","tags":["API Keys"]}},"/v1/messages/send":{"post":{"callbacks":{},"description":"Wysyła nową wiadomość e-mail. Wiadomość zostaje umieszczona w kolejce i wysłana asynchronicznie.","operationId":"OutboxaApiWeb.V1.MessageController.send","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}},"description":"Dane wiadomości","required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}},"description":"Wiadomość zakolejkowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak uprawnień lub limit wysyłki"}},"summary":"Wyślij wiadomość e-mail","tags":["Messages"]}},"/v1/gdpr/breaches/{id}/notify-authority":{"post":{"callbacks":{},"description":"Rejestruje fakt powiadomienia organu nadzorczego (UODO) o naruszeniu\nzgodnie z Art. 33 RODO. Powiadomienie powinno nastąpić w ciągu 72 godzin\nod wykrycia naruszenia.\n","operationId":"OutboxaApiWeb.V1.GdprController.notify_authority","parameters":[{"description":"ID naruszenia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Powiadomienie zarejestrowane"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Naruszenie nie znalezione"}},"summary":"Zarejestruj powiadomienie organu nadzorczego","tags":["GDPR"]}},"/v1/api-keys":{"get":{"callbacks":{},"description":"Zwraca listę wszystkich kluczy API przypisanych do organizacji.","operationId":"OutboxaApiWeb.V1.ApiKeyController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysListResponse"}}},"description":"Lista kluczy API"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista kluczy API","tags":["API Keys"]},"post":{"callbacks":{},"description":"Tworzy nowy klucz API dla organizacji. Zwrócony klucz (pole `key`) jest wyświetlany\ntylko raz przy tworzeniu - należy go zapisać, ponieważ nie będzie można go odzyskać.\n","operationId":"OutboxaApiWeb.V1.ApiKeyController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"description":"Dane klucza API","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Klucz API utworzony"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Limit osiągnięty"}},"summary":"Utwórz klucz API","tags":["API Keys"]}},"/v1/messages/analyze":{"post":"ok"},"/v1/suppressions/check":{"post":{"callbacks":{},"description":"Sprawdza czy podana wartość (e-mail, domena lub IP) znajduje się na liście blokowanych.\nDla typu IP sprawdza czy adres jest na whiteliście (odwrócona logika).\n","operationId":"OutboxaApiWeb.V1.SuppressionController.check","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckSuppressionRequest"}}},"description":"Wartość do sprawdzenia","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckSuppressionResponse"}}},"description":"Wynik sprawdzenia"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Sprawdź czy wartość jest zablokowana","tags":["Suppressions"]}},"/v1/consents/revoke-all":{"post":{"callbacks":{},"description":"Wycofuje wszystkie zgody dla odbiorcy. Używane gdy odbiorca chce całkowicie\nzrezygnować z komunikacji lub na żądanie GDPR \"prawo do bycia zapomnianym\".\n","operationId":"OutboxaApiWeb.V1.ConsentController.revoke_all","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeAllConsentsRequest"}}},"description":"Dane odbiorcy","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeAllConsentsResponse"}}},"description":"Zgody wycofane"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Wycofaj wszystkie zgody","tags":["Consents"]}},"/v1/gdpr/deletion/{id}":{"delete":{"callbacks":{},"description":"Anuluje żądanie usunięcia danych przed jego wykonaniem.\nMożna anulować tylko żądania w statusie pending_verification, confirmed lub scheduled.\n","operationId":"OutboxaApiWeb.V1.GdprController.cancel_deletion","parameters":[{"description":"ID żądania usunięcia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionCancelRequest"}}},"description":"Powód anulowania","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionResponse"}}},"description":"Żądanie anulowane"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Żądanie nie znalezione"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy status żądania"}},"summary":"Anuluj żądanie usunięcia","tags":["GDPR"]}},"/v1/audit-logs/{id}":{"get":{"callbacks":{},"description":"Zwraca pełne informacje o wpisie w logu audytu.","operationId":"OutboxaApiWeb.V1.AuditLogController.show","parameters":[{"description":"ID wpisu audytu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogResponse"}}},"description":"Szczegóły wpisu audytu"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wpis nie znaleziony"}},"summary":"Szczegóły wpisu audytu","tags":["Audit Logs"]}},"/v1/suppressions":{"get":{"callbacks":{},"description":"Zwraca listę wpisów na liście blokowanych/dozwolonych dla organizacji.\nMożna filtrować po typie listy (blacklist/whitelist) oraz typie wpisu (email/domain/ip).\n","operationId":"OutboxaApiWeb.V1.SuppressionController.index","parameters":[{"description":"Filtruj po typie listy","in":"query","name":"list_type","required":false,"schema":{"enum":["blacklist","whitelist"],"type":"string"}},{"description":"Filtruj po typie wpisu","in":"query","name":"type","required":false,"schema":{"enum":["email","domain","ip"],"type":"string"}},{"description":"Maksymalna liczba wyników (domyślnie: 100)","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}},{"description":"Przesunięcie (paginacja)","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionsListResponse"}}},"description":"Lista wpisów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista wpisów suppression list","tags":["Suppressions"]},"post":{"callbacks":{},"description":"Dodaje nowy wpis do listy blokowanych lub dozwolonych.\nMożna blokować adresy e-mail, domeny lub adresy IP.\n","operationId":"OutboxaApiWeb.V1.SuppressionController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSuppressionRequest"}}},"description":"Dane wpisu","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionResponse"}}},"description":"Wpis utworzony"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Dodaj wpis do suppression list","tags":["Suppressions"]}},"/v1/gdpr/breaches/{id}":{"get":{"callbacks":{},"description":"Zwraca szczegóły pojedynczego naruszenia wraz ze statusem terminu\npowiadomienia organu nadzorczego.\n","operationId":"OutboxaApiWeb.V1.GdprController.get_breach","parameters":[{"description":"ID naruszenia","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprBreachResponse"}}},"description":"Szczegóły naruszenia"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Naruszenie nie znalezione"}},"summary":"Szczegóły naruszenia","tags":["GDPR"]}},"/v1/inbound/messages/{id}/attachments/{filename}":{"get":{"callbacks":{},"description":"Zwraca presigned URL do pobrania załącznika wiadomości.\nURL jest ważny przez 1 godzinę.\n","operationId":"OutboxaApiWeb.V1.InboundMessageController.attachment","parameters":[{"description":"ID wiadomości","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Nazwa pliku załącznika","in":"path","name":"filename","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundAttachmentResponse"}}},"description":"URL do pobrania załącznika"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość lub załącznik nie istnieje"}},"summary":"Pobierz załącznik","tags":["Inbound Messages"]}},"/v1/templates":{"get":{"callbacks":{},"description":"Zwraca listę szablonów email organizacji z opcjonalnym filtrowaniem.","operationId":"OutboxaApiWeb.V1.TemplateController.index","parameters":[{"description":"Filtruj po statusie","in":"query","name":"status","required":false,"schema":{"enum":["draft","active","archived"],"type":"string"}},{"description":"Filtruj po typie","in":"query","name":"type","required":false,"schema":{"enum":["transactional","marketing","system"],"type":"string"}},{"description":"Wyszukiwanie po nazwie i opisie","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Numer strony","in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"description":"Elementów na stronę","in":"query","name":"per_page","required":false,"schema":{"default":25,"maximum":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateListResponse"}}},"description":"Lista szablonów"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista szablonów","tags":["Templates"]},"post":{"callbacks":{},"description":"Tworzy nowy szablon email. Zmienne w formacie {{variable}} są automatycznie wykrywane.","operationId":"OutboxaApiWeb.V1.TemplateController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateRequest"}}},"description":"Dane szablonu","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon utworzony"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Utwórz szablon","tags":["Templates"]}},"/v1/consents/preference-url":{"get":{"callbacks":{},"description":"Generuje URL do centrum preferencji dla odbiorcy. Ten URL może być używany w e-mailach\njako link \"Zarządzaj preferencjami\" lub \"Wypisz się\".\n","operationId":"OutboxaApiWeb.V1.ConsentController.get_preference_url","parameters":[{"description":"Adres e-mail odbiorcy","in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferenceUrlResponse"}}},"description":"URL preferencji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Odbiorca nie ma żadnych zgód"}},"summary":"Pobierz URL centrum preferencji","tags":["Consents"]}},"/v1/activity/stats":{"get":{"callbacks":{},"description":"Zwraca zagregowane statystyki aktywności dla organizacji, pogrupowane\npo kategorii i typie eventu.\n","operationId":"OutboxaApiWeb.V1.ActivityController.stats","parameters":[{"description":"Okres do analizy","in":"query","name":"period","required":false,"schema":{"default":"7d","enum":["24h","7d","30d","90d"],"type":"string"}},{"description":"Grupowanie timeline","in":"query","name":"group_by","required":false,"schema":{"default":"day","enum":["hour","day","week"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityStatsResponse"}}},"description":"Statystyki aktywności"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Statystyki aktywności","tags":["Activity"]}},"/v1/inbound/messages/thread/{thread_id}":{"get":{"callbacks":{},"description":"Zwraca wszystkie wiadomości należące do tego samego wątku konwersacji.\nWątek jest identyfikowany przez thread_id (hash z Message-ID i In-Reply-To).\n","operationId":"OutboxaApiWeb.V1.InboundMessageController.thread","parameters":[{"description":"Identyfikator wątku (URL-encoded)","in":"path","name":"thread_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundMessageThreadResponse"}}},"description":"Lista wiadomości w wątku"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista wiadomości w wątku","tags":["Inbound Messages"]}},"/v1/validate/job/{id}":{"get":{"callbacks":{},"description":"Sprawdza status i pobiera wyniki asynchronicznego job'a walidacji.","operationId":"OutboxaApiWeb.V1.ValidationController.job_status","parameters":[{"description":"ID job'a","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}},"description":"Status job'a"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Job nie znaleziony"}},"summary":"Pobierz status job'a walidacji batch","tags":["Email Validation"]}},"/v1/api-keys/{id}/rotate":{"post":{"callbacks":{},"description":"Generuje nowy klucz API zachowując stary przez określony okres karencji (grace period).\nPozwala to na płynną migrację aplikacji na nowy klucz bez przestojów.\n\nPodczas okresu karencji oba klucze (stary i nowy) są aktywne.\nPo upływie tego czasu stary klucz automatycznie wygasa.\n","operationId":"OutboxaApiWeb.V1.ApiKeyController.rotate","parameters":[{"description":"ID klucza API","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateApiKeyRequest"}}},"description":"Parametry rotacji","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRotateResponse"}}},"description":"Klucz zrotowany"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Klucz API nie znaleziony"}},"summary":"Rotuj klucz API","tags":["API Keys"]}},"/v1/activity/messages/{message_id}":{"get":{"callbacks":{},"description":"Zwraca chronologiczną listę eventów dla konkretnej wiadomości:\nsent, delivered, opened, clicked, etc.\n","operationId":"OutboxaApiWeb.V1.ActivityController.message_timeline","parameters":[{"description":"ID wiadomości","in":"path","name":"message_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityTimelineResponse"}}},"description":"Timeline wiadomości"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Wiadomość nie znaleziona"}},"summary":"Timeline wiadomości","tags":["Activity"]}},"/v1/billing/cancel":{"post":{"callbacks":{},"description":"Anuluje aktywną subskrypcję organizacji.\nDomyślnie anulowanie następuje na koniec okresu rozliczeniowego.\nUstaw `at_period_end: false` aby anulować natychmiast.\n","operationId":"OutboxaApiWeb.V1.BillingController.cancel","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelRequest"}}},"description":"Parametry anulowania","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelResponse"}}},"description":"Subskrypcja anulowana"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd - np. już anulowana"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak aktywnej subskrypcji"}},"summary":"Anuluj subskrypcję","tags":["Billing"]}},"/v1/webhooks/{id}":{"delete":{"callbacks":{},"description":"Usuwa konfigurację webhooka. Operacja jest nieodwracalna.","operationId":"OutboxaApiWeb.V1.WebhookController.delete","parameters":[{"description":"ID webhooka","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"content":{"application/json":{}},"description":"Webhook usunięty"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Webhook nie znaleziony"}},"summary":"Usuń webhook","tags":["Webhooks"]},"get":{"callbacks":{},"description":"Zwraca pełne informacje o webhooku wraz ze statusem ostatniego wywołania.","operationId":"OutboxaApiWeb.V1.WebhookController.show","parameters":[{"description":"ID webhooka","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Szczegóły webhooka"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Webhook nie znaleziony"}},"summary":"Szczegóły webhooka","tags":["Webhooks"]},"patch":{"callbacks":{},"description":"Aktualizuje konfigurację webhooka (URL, eventy, status aktywności).","operationId":"OutboxaApiWeb.V1.WebhookController.update (2)","parameters":[{"description":"ID webhooka","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Webhook zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Webhook nie znaleziony"}},"summary":"Aktualizuj webhook","tags":["Webhooks"]},"put":{"callbacks":{},"description":"Aktualizuje konfigurację webhooka (URL, eventy, status aktywności).","operationId":"OutboxaApiWeb.V1.WebhookController.update","parameters":[{"description":"ID webhooka","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"description":"Dane do aktualizacji","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Webhook zaktualizowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Webhook nie znaleziony"}},"summary":"Aktualizuj webhook","tags":["Webhooks"]}},"/v1/domains/{domain_id}/verify":{"post":{"callbacks":{},"description":"Sprawdza poprawność konfiguracji DNS (SPF, DKIM, DMARC) dla domeny.","operationId":"OutboxaApiWeb.V1.DomainController.verify","parameters":[{"description":"ID domeny","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainResponse"}}},"description":"Wynik weryfikacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Domena nie znaleziona"}},"summary":"Weryfikuj domenę","tags":["Domains"]}},"/v1/consents/proof":{"get":{"callbacks":{},"description":"Eksportuje pełną historię zgód dla odbiorcy z metadanymi potrzebnymi do audytu i zgodności z GDPR.\nZawiera adresy IP, user agent, źródła i daty wszystkich operacji na zgodach.\n","operationId":"OutboxaApiWeb.V1.ConsentController.export_proof","parameters":[{"description":"Adres e-mail odbiorcy","in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentProofResponse"}}},"description":"Dowód zgody"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd eksportu"}},"summary":"Eksportuj dowód zgody","tags":["Consents"]}},"/v1/auth/resend-verification":{"post":{"callbacks":{},"description":"Ponownie wysyła e-mail weryfikacyjny na podany adres.\nDziała tylko dla kont w statusie `pending` (oczekujących na weryfikację).\n","operationId":"OutboxaApiWeb.V1.AuthController.resend_verification","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"description":"Adres e-mail","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationResponse"}}},"description":"E-mail weryfikacyjny wysłany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy adres e-mail"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nie znaleziono konta oczekującego na weryfikację"}},"security":[],"summary":"Ponowne wysłanie e-maila weryfikacyjnego","tags":["Auth"]}},"/v1/auth/register":{"post":{"callbacks":{},"description":"Tworzy nowe konto w systemie Outboxa. W ramach rejestracji tworzony jest:\n- Organizacja\n- Domyślna domena (na podstawie domeny z adresu e-mail)\n- Klucz API z pełnymi uprawnieniami\n- Darmowa subskrypcja (plan Free)\n\nPo rejestracji wysyłany jest e-mail weryfikacyjny na podany adres.\nKonto pozostaje w statusie `pending` do momentu weryfikacji.\n\n**Ważne:** Zwrócony klucz API jest wyświetlany tylko raz - należy go zapisać!\n","operationId":"OutboxaApiWeb.V1.AuthController.register","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"description":"Dane rejestracji","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}},"description":"Konto utworzone"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Błąd walidacji"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Konto z tym adresem e-mail już istnieje"}},"security":[],"summary":"Rejestracja nowego konta","tags":["Auth"]}},"/v1/activity":{"get":{"callbacks":{},"description":"Zwraca listę logów aktywności dla organizacji. Można filtrować po kategorii,\ntypie eventu, ID zasobu oraz zakresie dat.\n\n## Kategorie\n- `email` - eventy związane z wiadomościami (sent, delivered, bounced, opened, clicked)\n- `api` - requesty API\n- `domain` - operacje na domenach\n- `api_key` - operacje na kluczach API\n- `webhook` - operacje na webhookach\n- `suppression` - operacje na suppressions\n- `inbound` - przychodzące wiadomości\n- `account` - operacje na koncie\n","operationId":"OutboxaApiWeb.V1.ActivityController.index","parameters":[{"description":"Filtruj po kategorii","in":"query","name":"category","required":false,"schema":{"enum":["email","api","domain","api_key","webhook","suppression","inbound","account"],"type":"string"}},{"description":"Filtruj po typie eventu (np. sent, created, deleted)","in":"query","name":"event_type","required":false,"schema":{"type":"string"}},{"description":"Filtruj po ID zasobu","in":"query","name":"resource_id","required":false,"schema":{"type":"string"}},{"description":"Filtruj po poziomie ważności","in":"query","name":"severity","required":false,"schema":{"enum":["info","warning","error"],"type":"string"}},{"description":"Data początkowa (ISO 8601)","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Data końcowa (ISO 8601)","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Liczba wyników na stronę","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Przesunięcie (ile wyników pominąć)","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityListResponse"}}},"description":"Lista aktywności"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Lista aktywności","tags":["Activity"]}},"/v1/gdpr/deletion/confirm":{"post":{"callbacks":{},"description":"Potwierdza żądanie usunięcia danych za pomocą tokenu weryfikacyjnego.\nToken jest wysyłany na adres e-mail osoby żądającej.\n\nPo potwierdzeniu, usunięcie zostaje zaplanowane i wykonane automatycznie.\n","operationId":"OutboxaApiWeb.V1.GdprController.confirm_deletion","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionConfirmRequest"}}},"description":"Token weryfikacyjny","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprDeletionResponse"}}},"description":"Żądanie potwierdzone"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy lub wygasły token"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Nieprawidłowy status żądania"}},"summary":"Potwierdź żądanie usunięcia","tags":["GDPR"]}},"/v1/templates/{template_id}/publish":{"post":{"callbacks":{},"description":"Zmienia status szablonu na aktywny. Wymaga poprawnie wypełnionego tematu i treści.","operationId":"OutboxaApiWeb.V1.TemplateController.publish","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon opublikowany"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}},"description":"Błąd walidacji (brak wymaganej treści)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Publikuj szablon","tags":["Templates"]}},"/v1/billing/subscription":{"get":{"callbacks":{},"description":"Zwraca szczegóły aktualnej subskrypcji organizacji.\nDla organizacji bez płatnej subskrypcji zwraca dane planu Free.\n","operationId":"OutboxaApiWeb.V1.BillingController.current_subscription","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}},"description":"Szczegóły subskrypcji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Aktualna subskrypcja","tags":["Billing"]}},"/v1/templates/{template_id}/archive":{"post":{"callbacks":{},"description":"Zmienia status szablonu na zarchiwizowany.","operationId":"OutboxaApiWeb.V1.TemplateController.archive","parameters":[{"description":"ID szablonu","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}},"description":"Szablon zarchiwizowany"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Szablon nie znaleziony"}},"summary":"Archiwizuj szablon","tags":["Templates"]}},"/v1/validate/quick":{"post":{"callbacks":{},"description":"Szybka walidacja sprawdzająca tylko:\n- Składnię\n- Disposable domains\n- Role-based emails\n- Lista suppression\n\nNie wykonuje sprawdzenia MX ani SMTP.\n","operationId":"OutboxaApiWeb.V1.ValidationController.quick","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleValidationRequest"}}},"description":"Email","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}},"description":"Wynik walidacji"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Brak autoryzacji"}},"summary":"Szybka walidacja (bez operacji sieciowych)","tags":["Email Validation"]}}},"security":[{"bearer_auth":[]},{"basic_auth":[]}],"servers":[{"description":"Production","url":"https://api.mailingapi.com","variables":{}},{"description":"Development","url":"http://localhost:4000","variables":{}}],"tags":[{"description":"Wysyłanie i zarządzanie wiadomościami e-mail","name":"Messages"},{"description":"Zarządzanie domenami wysyłkowymi","name":"Domains"},{"description":"Szablony wiadomości e-mail","name":"Templates"},{"description":"Konfiguracja webhooków","name":"Webhooks"},{"description":"Walidacja adresów e-mail","name":"Validation"},{"description":"Monitoring dostarczalności do skrzynki odbiorczej","name":"Inbox Placement"},{"description":"Konfiguracja routingu przychodzących e-maili","name":"Inbound Routes"},{"description":"Zarządzanie kluczami API","name":"API Keys"},{"description":"Zarządzanie listą blokowanych adresów","name":"Suppressions"},{"description":"Logi audytu","name":"Audit Logs"},{"description":"Zdarzenia systemowe (wysyłka, dostarczenie, otwarcie, kliknięcie, itp.)","name":"Events"},{"description":"Zgodność z GDPR - eksport danych, usuwanie, rejestr czynności","name":"GDPR"},{"description":"Zarządzanie zgodami marketingowymi","name":"Consents"},{"description":"Rozliczenia i subskrypcje","name":"Billing"},{"description":"Rejestracja i weryfikacja użytkownika","name":"Auth"},{"description":"Preferencje subskrypcji odbiorcy (publiczne)","name":"Preferences"}]}