Przejdź do głównej zawartości

Dokumentacja API

Kompletna dokumentacja wszystkich punktów końcowych Notifer API.

Interaktywna dokumentacja

Najbardziej aktualna i interaktywna dokumentacja API dostępna jest na:

Bazowy URL

https://app.notifer.io

Publikowanie wiadomości

Publikowanie wiadomości

Publikowanie wiadomości do tematu.

POST /{topic}
PUT /{topic}

Nagłówki:

Content-Type: text/plain
X-Title: Message title (optional)
X-Priority: 1-5 (optional, default: 3)
X-Tags: tag1,tag2,tag3 (optional)
Authorization: Bearer <token> (optional, for private topics)
X-API-Key: <api_key> (optional, alternative auth)

Treść żądania:

Plain text message content

Przykład:

curl -X POST https://app.notifer.io/server-alerts \
-H "X-Title: Server Down" \
-H "X-Priority: 1" \
-H "X-Tags: critical,server,production" \
-d "Production server prod-web-01 is not responding"

Odpowiedź: 200 OK

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"topic": "server-alerts",
"message": "Production server prod-web-01 is not responding",
"title": "Server Down",
"priority": 1,
"tags": ["critical", "server", "production"],
"timestamp": "2025-01-15T10:30:00Z"
}

Tematy

Lista wszystkich tematów

Pobieranie wszystkich tematów ze statystykami (publiczny endpoint).

GET /api/topics

Parametry zapytania:

  • limit (int, opcjonalne): Maksymalna liczba tematów (domyślnie: 50, max: 100)
  • offset (int, opcjonalne): Liczba tematów do pominięcia (domyślnie: 0)

Odpowiedź: 200 OK

[
{
"id": "uuid",
"name": "server-alerts",
"owner_id": "uuid",
"team_id": null,
"access_level": "private",
"description": "Production server monitoring",
"is_discoverable": false,
"icon_name": "server",
"icon_color": "red",
"message_count": 42,
"subscriber_count": 5,
"created_at": "2025-01-01T00:00:00Z",
"last_message_at": "2025-01-15T10:30:00Z"
}
]

Lista moich tematów

Pobieranie tematów należących do bieżącego użytkownika.

GET /api/topics/my

Nagłówki:

Authorization: Bearer <token>

Parametry zapytania:

  • limit (int, opcjonalne): Maksymalna liczba tematów (domyślnie: 50, max: 100)
  • offset (int, opcjonalne): Liczba tematów do pominięcia (domyślnie: 0)

Odpowiedź: 200 OK (ten sam format co Lista wszystkich tematów, z can_manage: true)

Lista publicznych tematów

Pobieranie wszystkich publicznych/odkrywalnych tematów (dla zakładki Odkryj).

GET /api/topics/public

Parametry zapytania:

  • limit (int, opcjonalne): Maksymalna liczba tematów (domyślnie: 50, max: 100)
  • offset (int, opcjonalne): Liczba tematów do pominięcia (domyślnie: 0)

Odpowiedź: 200 OK (ten sam format co Lista wszystkich tematów)

Tworzenie tematu

Utworzenie nowego tematu.

POST /api/topics

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"name": "my-topic",
"access_level": "public|private",
"description": "Opis tematu (wymagany dla odkrywalnych tematów publicznych)",
"is_discoverable": true,
"icon_name": "bell",
"icon_color": "blue",
"team_id": "uuid (opcjonalne, dla tematów zespołowych)"
}

Odpowiedź: 201 Created

{
"id": "uuid",
"name": "my-topic",
"access_level": "public",
"description": "Opis tematu",
"is_discoverable": true,
"created_at": "2025-01-15T10:30:00Z",
"message_count": 0,
"last_message_at": null,
"subscription_warning": null
}

Pobieranie tematu

Pobieranie szczegółów tematu po nazwie.

GET /api/topics/{name}

Odpowiedź: 200 OK

{
"id": "uuid",
"name": "server-alerts",
"owner_id": "uuid",
"team_id": null,
"access_level": "private",
"description": "Production server monitoring",
"is_discoverable": false,
"icon_name": "server",
"icon_color": "red",
"message_count": 42,
"subscriber_count": 5,
"connection_count": 3,
"created_at": "2025-01-01T00:00:00Z",
"last_message_at": "2025-01-15T10:30:00Z",
"can_manage": false
}

Pobieranie statystyk tematu

Pobieranie statystyk tematu (alias dla GET /api/topics/{name}).

GET /api/topics/{name}/stats

Odpowiedź: 200 OK (ten sam format co Pobieranie tematu)

Wyszukiwanie wiadomości w temacie

Wyszukiwanie lub lista wiadomości w określonym temacie.

GET /api/topics/{name}/messages

Parametry zapytania:

  • q (string, opcjonalne): Zapytanie wyszukiwania (przeszukuje tytuł i treść)
  • limit (int, opcjonalne): Maksymalna liczba wiadomości na stronę (domyślnie: 50, max: 100)
  • offset (int, opcjonalne): Liczba wiadomości do pominięcia (domyślnie: 0)
  • priority_min (int, opcjonalne): Minimalny priorytet (1-5)
  • priority_max (int, opcjonalne): Maksymalny priorytet (1-5)
  • tags (string, opcjonalne): Filtrowanie według tagów (oddzielone przecinkami)
  • date_from (ISO datetime, opcjonalne): Filtrowanie wiadomości od tej daty
  • date_to (ISO datetime, opcjonalne): Filtrowanie wiadomości do tej daty
  • include_deleted (bool, opcjonalne): Uwzględnij usunięte wiadomości (domyślnie: false)

Odpowiedź: 200 OK

{
"messages": [...],
"total": 150,
"limit": 50,
"offset": 0,
"query": "server down",
"topic": "alerts"
}

Aktualizacja tematu

Aktualizacja ustawień tematu (tylko właściciel lub administrator zespołu).

PATCH /api/topics/{topic_id}
Parametr ścieżki

Ten endpoint używa UUID tematu ({topic_id}), nie nazwy tematu.

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"name": "new-topic-name",
"description": "Zaktualizowany opis",
"is_discoverable": false,
"icon_name": "server",
"icon_color": "red",
"access_level": "private"
}

Odpowiedź: 200 OK

Usunięcie tematu

Trwałe usunięcie tematu (tylko właściciel lub administrator zespołu).

DELETE /api/topics/{topic_id}
Parametr ścieżki

Ten endpoint używa UUID tematu ({topic_id}), nie nazwy tematu.

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content


Wiadomości

Pobieranie historii wiadomości

Pobieranie historii wiadomości dla tematu (format JSON).

GET /{topic}/json

Parametry zapytania:

  • limit (int, opcjonalne): Maksymalna liczba wiadomości (domyślnie: 50)
  • since (string, opcjonalne): Pobierz wiadomości od tego znacznika czasu
  • poll (int, opcjonalne): Tryb odpytywania (0 lub 1)

Nagłówki (opcjonalne):

X-Topic-Token: <topic_access_token> (dla prywatnych tematów)

Przykład:

curl "https://app.notifer.io/server-alerts/json?limit=50"

Odpowiedź: 200 OK

{
"messages": [
{
"id": "uuid",
"topic_id": "uuid",
"message": "Server is down",
"title": "Alert",
"priority": 1,
"tags": ["critical"],
"timestamp": "2025-01-15T10:30:00Z",
"expires_at": "2025-02-14T10:30:00Z",
"is_deleted": false,
"is_edited": false
}
],
"topic": "server-alerts",
"count": 1
}

Wyszukiwanie wiadomości

Wyszukiwanie wiadomości z pełnotekstowym wyszukiwaniem i filtrami.

GET /api/messages/search

Parametry zapytania:

  • q (string, opcjonalne): Zapytanie wyszukiwania (przeszukuje tytuł i treść)
  • topic (string, opcjonalne): Filtrowanie według nazwy tematu
  • tags (tablica, opcjonalne): Filtrowanie według tagów (dopasowuje DOWOLNY tag)
  • priority_min (int, opcjonalne): Minimalny priorytet (1-5)
  • priority_max (int, opcjonalne): Maksymalny priorytet (1-5)
  • date_from (ISO datetime, opcjonalne): Filtrowanie wiadomości po tej dacie
  • date_to (ISO datetime, opcjonalne): Filtrowanie wiadomości przed tą datą
  • limit (int, opcjonalne): Maksymalna liczba wyników (domyślnie: 50, max: 100)
  • offset (int, opcjonalne): Przesunięcie wyników dla paginacji (domyślnie: 0)

Przykład:

curl "https://app.notifer.io/api/messages/search?q=server&tags=critical&priority_max=2" \
-H "Authorization: Bearer $TOKEN"

Odpowiedź: 200 OK

{
"messages": [...],
"total": 150,
"limit": 50,
"offset": 0,
"query": "server",
"filters": {
"topic": null,
"priority_min": null,
"priority_max": 2,
"tags": ["critical"],
"date_from": null,
"date_to": null
}
}

Pobieranie ostatnich wiadomości

Pobieranie ostatnich wiadomości z subskrybowanych tematów.

GET /api/messages/recent

Nagłówki:

Authorization: Bearer <token>

Parametry zapytania:

  • limit (int, opcjonalne): Maksymalna liczba wiadomości (domyślnie: 100, max: 200)
  • topic (string, opcjonalne): Filtrowanie według nazwy tematu

Odpowiedź: 200 OK

[
{
"id": "uuid",
"topic_id": "uuid",
"topic": "server-alerts",
"message": "Server is down",
"title": "Alert",
"priority": 1,
"tags": ["critical"],
"timestamp": "2025-01-15T10:30:00Z"
}
]

Pobieranie aktywności wiadomości

Pobieranie statystyk aktywności wiadomości dla wizualizacji wykresów.

GET /api/messages/activity

Nagłówki:

Authorization: Bearer <token>

Parametry zapytania:

  • start_date (ISO datetime, opcjonalne): Początek zakresu czasowego (domyślnie: 24h temu)
  • end_date (ISO datetime, opcjonalne): Koniec zakresu czasowego (domyślnie: teraz)
  • bucket (string, opcjonalne): Rozmiar przedziału - "hour" lub "day" (automatycznie wybierany na podstawie zakresu)
  • topics (string, opcjonalne): Lista nazw tematów oddzielonych przecinkami
  • priority_min (int, opcjonalne): Minimalny priorytet (1-5)
  • priority_max (int, opcjonalne): Maksymalny priorytet (1-5)
  • tags (string, opcjonalne): Lista tagów oddzielonych przecinkami
  • query (string, opcjonalne): Zapytanie wyszukiwania do filtrowania wiadomości

Odpowiedź: 200 OK

{
"buckets": [
{
"timestamp": "2025-01-15T10:00:00Z",
"priority_1": 2,
"priority_2": 5,
"priority_3": 10,
"priority_4": 3,
"priority_5": 1
}
],
"total": 150,
"bucket_size": "hour",
"start_date": "2025-01-14T10:00:00Z",
"end_date": "2025-01-15T10:00:00Z"
}

Usunięcie wiadomości

Miękkie usunięcie wiadomości (tylko właściciel lub administrator zespołu, plany ESSENTIALS+).

DELETE /api/{topic_name}/messages/{message_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"id": "uuid",
"deleted_at": "2025-01-15T10:30:00Z",
"message": "Message deleted successfully"
}

Edycja wiadomości

Edycja wiadomości (tylko właściciel lub administrator zespołu, plany ESSENTIALS+).

PATCH /api/{topic_name}/messages/{message_id}

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"message": "Zaktualizowana treść wiadomości",
"title": "Zaktualizowany tytuł (opcjonalnie)"
}

Odpowiedź: 200 OK

{
"id": "uuid",
"message": "Zaktualizowana treść wiadomości",
"title": "Zaktualizowany tytuł",
"edited_at": "2025-01-15T10:30:00Z"
}

Subskrypcje w czasie rzeczywistym

Subskrypcja wielu tematów (SSE)

Subskrypcja wielu tematów przez pojedyncze połączenie SSE.

GET /sse

Parametry zapytania:

  • session (string, zalecane): ID sesji z POST /api/sse/sessions
  • topics (string, alternatywa): Lista nazw tematów oddzielonych przecinkami
  • token (string, opcjonalne): Token JWT lub token dostępu do tematu (nie potrzebny z sesją)
  • since_id (string, opcjonalne): Format dla poszczególnych tematów: topic1:id1,topic2:id2

Przykład oparty na sesji (zalecany):

// 1. Utwórz sesję (POST)
const response = await fetch('/api/sse/sessions', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + token,
'Content-Type': 'application/json'
},
body: JSON.stringify({
topics: ['alerts', 'monitoring', 'deployments'],
since_id: {'alerts': 'uuid1'}
})
});
const { session_id } = await response.json();

// 2. Połącz z SSE (GET z krótkim URL)
const eventSource = new EventSource(`/sse?session=${session_id}`);

Tworzenie sesji SSE

Utworzenie sesji subskrypcji SSE dla krótkich URL.

POST /api/sse/sessions

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"topics": ["alerts", "monitoring", "deployments"],
"since_id": {"alerts": "uuid1", "monitoring": "uuid2"}
}

Odpowiedź: 200 OK

{
"session_id": "abc123...",
"topics": ["alerts", "monitoring", "deployments"],
"expires_in": 300
}

Subskrypcja pojedynczego tematu (SSE)

Subskrypcja pojedynczego tematu przez Server-Sent Events.

GET /{topic}/sse

Parametry zapytania:

  • token (string, opcjonalne): Token JWT lub token dostępu do tematu dla prywatnych tematów
  • since_id (uuid, opcjonalne): Wysyłaj tylko wiadomości po tym ID

Przykład:

# Publiczny temat
curl -N https://app.notifer.io/public-topic/sse

# Prywatny temat z JWT
curl -N "https://app.notifer.io/private-topic/sse?token=$JWT_TOKEN"

# Prywatny temat z tokenem dostępu
curl -N "https://app.notifer.io/private-topic/sse?token=tk_your_token_here"

Odpowiedź: Strumień SSE

event: ready
data: {"topic":"server-alerts","message":"Connected to topic","connection_id":"..."}

event: message
data: {"id":"uuid","topic":"server-alerts","message":"Hello",...}

event: ping
data:

Subskrybowanie przez WebSocket

Subskrybowanie tematu przez WebSocket.

WS /{topic}/ws

Parametry zapytania:

  • token (string, opcjonalne): Token JWT lub token dostępu do tematu dla prywatnych tematów

Przykład:

const ws = new WebSocket('wss://app.notifer.io/my-topic/ws?token=<TOKEN>');

ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'message') {
console.log('Nowa wiadomość:', data);
} else if (data.type === 'ping') {
// Heartbeat
}
};

Uwierzytelnianie

Rejestracja

Rejestracja nowego konta użytkownika.

POST /auth/register

Treść żądania:

{
"email": "user@example.com",
"username": "username",
"password": "strong-password",
"terms_accepted": true
}
Wymagana weryfikacja email

Rejestracja wymaga weryfikacji email. Na podany adres zostanie wysłany email z linkiem weryfikacyjnym. Użytkownik musi zweryfikować swój email przed zalogowaniem.

Odpowiedź: 201 Created

{
"message": "Registration successful. Please check your email to verify your account.",
"email": "user@example.com",
"username": "username"
}

Logowanie

Logowanie przez email i hasło.

POST /auth/login

Treść żądania:

{
"email": "user@example.com",
"password": "password"
}

Odpowiedź: 200 OK

{
"access_token": "eyJ...",
"refresh_token": "eyJ...",
"token_type": "bearer",
"user": {
"id": "uuid",
"email": "user@example.com",
"username": "username",
"subscription_tier": "FREE",
"is_verified": true,
"created_at": "2025-01-01T00:00:00Z"
}
}

Google OAuth

Inicjowanie logowania/rejestracji przez Google OAuth.

GET /auth/google/login

Przekierowuje do przepływu Google OAuth. Po pomyślnym uwierzytelnieniu przekierowuje z powrotem do URL wywołania zwrotnego z tokenami.

Apple Sign-In (Mobile)

Logowanie przez Apple Sign-In dla aplikacji iOS.

POST /auth/apple/mobile

Treść żądania:

{
"identity_token": "eyJ...",
"user": "apple-user-id",
"full_name": {
"givenName": "John",
"familyName": "Doe"
}
}

Odpowiedź: 200 OK (ten sam format co Logowanie)

Pobieranie bieżącego użytkownika

Pobieranie profilu uwierzytelnionego użytkownika.

GET /auth/me

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"id": "uuid",
"email": "user@example.com",
"username": "username",
"avatar_url": null,
"subscription_tier": "FREE",
"is_verified": true,
"is_active": true,
"created_at": "2025-01-01T00:00:00Z",
"last_login": "2025-01-15T10:00:00Z",
"oauth_provider": null,
"terms_accepted_at": "2025-01-01T00:00:00Z"
}

Odświeżanie tokenu

Odświeżanie tokenu dostępu przy użyciu tokenu odświeżania.

POST /auth/refresh

Treść żądania:

{
"refresh_token": "eyJ..."
}

Odpowiedź: 200 OK

{
"access_token": "eyJ...",
"refresh_token": "eyJ...",
"token_type": "bearer"
}

Weryfikacja email

Weryfikacja adresu email użytkownika.

GET /auth/verify-email?token={verification_token}

Odpowiedź: Przekierowuje do aplikacji z komunikatem sukcesu/błędu.

Ponowne wysłanie emaila weryfikacyjnego

Ponowne wysłanie linku weryfikacyjnego email.

POST /auth/resend-verification

Treść żądania:

{
"email": "user@example.com"
}

Odpowiedź: 200 OK

Żądanie resetowania hasła

Żądanie emaila do resetowania hasła.

POST /auth/password-reset/request

Treść żądania:

{
"email": "user@example.com"
}

Odpowiedź: 200 OK

Potwierdzenie resetowania hasła

Resetowanie hasła przy użyciu tokenu z emaila.

POST /auth/password-reset/confirm

Treść żądania:

{
"token": "reset-token-from-email",
"new_password": "new-strong-password"
}

Odpowiedź: 200 OK

Zmiana hasła

Zmiana hasła dla uwierzytelnionego użytkownika.

POST /auth/password-change

Nagłówki:

Authorization: Bearer <token>

Treść żądania:

{
"current_password": "current-password",
"new_password": "new-strong-password"
}

Odpowiedź: 200 OK

Akceptacja Regulaminu

Akceptacja lub ponowna akceptacja Regulaminu (dla użytkowników OAuth lub aktualizacji regulaminu).

POST /auth/accept-terms

Nagłówki:

Authorization: Bearer <token>

Treść żądania:

{
"accepted": true,
"consent_method": "web_checkbox"
}

Odpowiedź: 200 OK

Pobieranie historii zgód

Pobieranie historii zgód użytkownika dla zgodności z GDPR.

GET /auth/consent-history

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"consents": [
{
"id": "uuid",
"consent_type": "tos",
"document_version": "1.0",
"accepted_at": "2025-01-01T00:00:00Z",
"consent_method": "web_checkbox",
"is_active": true
}
],
"total": 1
}

Klucze API

Lista kluczy API

Pobieranie wszystkich kluczy API dla uwierzytelnionego użytkownika.

GET /api/keys

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

[
{
"id": "uuid",
"name": "Production Server",
"key_prefix": "noti_abc",
"created_at": "2025-01-01T00:00:00Z",
"expires_at": null,
"last_used_at": "2025-01-15T10:00:00Z"
}
]

Tworzenie klucza API

Utworzenie nowego klucza API.

POST /api/keys

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"name": "CI/CD Pipeline",
"expires_at": "2026-01-01T00:00:00Z"
}

Odpowiedź: 201 Created

{
"id": "uuid",
"key": "noti_abc123...",
"name": "CI/CD Pipeline",
"created_at": "2025-01-15T10:30:00Z",
"expires_at": "2026-01-01T00:00:00Z"
}
Zapisz klucz

Pełny key jest pokazany tylko raz. Zapisz go bezpiecznie!

Odwołanie klucza API

Odwołanie klucza API.

DELETE /api/keys/{key_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content


Tokeny dostępu do tematów

Lista tokenów tematu

Pobieranie wszystkich tokenów dostępu dla tematu.

GET /api/topics/{topic}/access-tokens

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Tworzenie tokenu tematu

Utworzenie nowego tokenu dostępu do tematu.

POST /api/topics/{topic}/access-tokens

Treść żądania:

{
"name": "External Service",
"permissions": ["read", "write"],
"expires_at": "2026-01-01T00:00:00Z"
}

Odpowiedź: 201 Created

Odwołanie tokenu tematu

Odwołanie tokenu dostępu do tematu.

DELETE /api/topics/{topic}/access-tokens/{token_id}

Odpowiedź: 204 No Content


Zespoły

Zespoły wymagają subskrypcji TEAM+.

Lista zespołów

Pobieranie wszystkich zespołów dla uwierzytelnionego użytkownika.

GET /api/teams

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

[
{
"id": "uuid",
"name": "engineering",
"display_name": "Engineering Team",
"description": "DevOps and Backend",
"owner_id": "uuid",
"member_count": 5,
"my_role": "owner",
"is_active": true,
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-15T10:00:00Z"
}
]

Pobieranie statystyk zespołu

Pobieranie statystyk zespołu dla bieżącego użytkownika (jako właściciel).

GET /api/teams/stats

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"base_members": 5,
"additional_members": 0,
"used_members": 3,
"total_members": 5,
"available_members": 2,
"percentage_used": 60.0,
"daily_message_limit": 10000,
"message_retention_days": 30
}

Lista dezaktywowanych zespołów

Lista wszystkich dezaktywowanych zespołów należących do bieżącego użytkownika.

GET /api/teams/deactivated

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Tworzenie zespołu

Utworzenie nowego zespołu (wymaga subskrypcji TEAM+).

POST /api/teams

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"name": "engineering",
"display_name": "Engineering Team",
"description": "DevOps and Backend"
}

Odpowiedź: 201 Created

Pobieranie szczegółów zespołu

Pobieranie szczegółowych informacji o zespole (tylko członkowie).

GET /api/teams/{team_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"id": "uuid",
"name": "engineering",
"display_name": "Engineering Team",
"description": "DevOps and Backend",
"owner_id": "uuid",
"member_count": 5,
"is_active": true,
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-15T10:00:00Z",
"members": [
{
"id": "uuid",
"team_id": "uuid",
"user_id": "uuid",
"username": "john",
"email": "john@example.com",
"role": "owner",
"joined_at": "2025-01-01T00:00:00Z",
"is_active": true
}
],
"my_role": "owner"
}

Aktualizacja zespołu

Aktualizacja szczegółów zespołu (tylko administrator lub właściciel).

PATCH /api/teams/{team_id}

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"display_name": "Zaktualizowana nazwa zespołu",
"description": "Zaktualizowany opis"
}

Odpowiedź: 200 OK

Usunięcie zespołu

Usunięcie zespołu (tylko właściciel).

DELETE /api/teams/{team_id}

Nagłówki:

Authorization: Bearer <token>

Parametry zapytania:

  • delete_topics (bool, opcjonalne): Jeśli true, usuń tematy zespołu. Jeśli false (domyślnie), przekonwertuj na prywatne tematy.

Odpowiedź: 204 No Content

Reaktywacja zespołu

Reaktywacja dezaktywowanego zespołu (tylko właściciel, wymaga poziomu TEAM+).

POST /api/teams/{team_id}/reactivate

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Lista członków zespołu

Lista wszystkich członków zespołu (tylko członkowie).

GET /api/teams/{team_id}/members

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Aktualizacja roli członka

Aktualizacja roli członka zespołu (tylko administrator lub właściciel).

PATCH /api/teams/{team_id}/members/{user_id}

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"role": "admin"
}

Odpowiedź: 200 OK

Usunięcie członka zespołu

Usunięcie członka zespołu (tylko administrator lub właściciel, nie można usunąć właściciela).

DELETE /api/teams/{team_id}/members/{user_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content

Zaproszenie członka zespołu

Zaproszenie nowego członka zespołu (tylko administrator lub właściciel, wymaga aktywnego zespołu).

POST /api/teams/{team_id}/invites

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"email": "member@example.com",
"role": "member"
}

Odpowiedź: 201 Created

{
"id": "uuid",
"team_id": "uuid",
"email": "member@example.com",
"role": "member",
"invited_by_id": "uuid",
"created_at": "2025-01-15T10:00:00Z",
"expires_at": "2025-01-22T10:00:00Z",
"is_expired": false
}

Lista zaproszeń zespołu

Lista oczekujących zaproszeń do zespołu (tylko administrator lub właściciel).

GET /api/teams/{team_id}/invites

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Akceptacja zaproszenia do zespołu

Akceptacja zaproszenia do zespołu.

POST /api/teams/invites/accept

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"token": "invitation-token"
}

Odpowiedź: 200 OK

Ponowne wysłanie zaproszenia do zespołu

Ponowne wysłanie emaila z zaproszeniem do zespołu.

POST /api/teams/invites/{invite_id}/resend

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content

Anulowanie zaproszenia do zespołu

Anulowanie zaproszenia do zespołu.

DELETE /api/teams/invites/{invite_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content


Urządzenia

Rejestracja urządzenia

Rejestracja urządzenia mobilnego do powiadomień push.

POST /api/devices/register

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"push_token": "ExponentPushToken[xxx]",
"platform": "ios|android|expo",
"device_id": "unique-device-id",
"device_name": "iPhone 13 Pro",
"app_version": "1.0.0"
}

Odpowiedź: 201 Created

{
"id": "uuid",
"user_id": "uuid",
"push_token": "ExponentPushToken[xxx]",
"platform": "ios",
"device_id": "unique-device-id",
"device_name": "iPhone 13 Pro",
"app_version": "1.0.0",
"is_active": true,
"created_at": "2025-01-15T10:00:00Z",
"last_seen": "2025-01-15T10:00:00Z"
}

Lista moich urządzeń

Pobieranie wszystkich urządzeń dla bieżącego użytkownika.

GET /api/devices/my

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Pobieranie urządzenia

Pobieranie urządzenia po ID.

GET /api/devices/{device_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

Aktualizacja urządzenia

Aktualizacja informacji o urządzeniu.

PUT /api/devices/{device_id}

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"push_token": "ExponentPushToken[new_token]",
"device_name": "Nowa nazwa urządzenia",
"app_version": "1.1.0"
}

Odpowiedź: 200 OK

Usunięcie urządzenia

Usunięcie urządzenia (zatrzymuje powiadomienia push).

DELETE /api/devices/{device_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content

Wysłanie testowego powiadomienia

Wysłanie testowego powiadomienia push do urządzenia.

POST /api/devices/{device_id}/test

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"message": "Test notification sent",
"device_id": "uuid"
}

Subskrypcje

Zunifikowane zarządzanie subskrypcjami dla powiadomień webowych i mobilnych.

Lista subskrypcji

Pobieranie wszystkich subskrypcji dla bieżącego użytkownika.

GET /api/subscriptions

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"subscriptions": [
{
"id": "uuid",
"user_id": "uuid",
"topic_id": "uuid",
"topic_name": "server-alerts",
"topic_description": "Production server monitoring",
"access_level": "PRIVATE",
"team_id": null,
"icon_name": "server",
"icon_color": "red",
"created_at": "2025-01-01T00:00:00Z",
"last_viewed_at": "2025-01-15T10:00:00Z",
"last_notified_at": "2025-01-15T09:30:00Z",
"web_notifications_enabled": true,
"mobile_notifications_enabled": true,
"mobile_notification_settings": {
"priority_threshold": 5,
"sound_enabled": true,
"vibrate_enabled": true,
"tags_filter": [],
"notification_sound": "default"
},
"is_pinned": false,
"topic_last_message_at": "2025-01-15T10:30:00Z",
"unread_count": 5,
"message_count": 42,
"subscriber_count": 10
}
],
"total": 1
}

Utworzenie subskrypcji

Subskrybowanie tematu (zunifikowane web + mobile).

POST /api/subscriptions

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"topic_name": "server-alerts",
"web_notifications_enabled": true,
"mobile_notifications_enabled": true,
"mobile_notification_settings": {
"priority_threshold": 3,
"sound_enabled": true,
"vibrate_enabled": true,
"tags_filter": ["urgent", "critical"],
"notification_sound": "alert"
}
}

Odpowiedź: 201 Created

Aktualizacja subskrypcji

Aktualizacja ustawień powiadomień subskrypcji.

PATCH /api/subscriptions/{subscription_id}

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"web_notifications_enabled": false,
"mobile_notifications_enabled": true,
"mobile_notification_settings": {
"priority_threshold": 2,
"sound_enabled": true,
"vibrate_enabled": false
},
"is_pinned": true
}

Odpowiedź: 200 OK

Usunięcie subskrypcji

Anulowanie subskrypcji tematu.

DELETE /api/subscriptions/{subscription_id}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content

Usunięcie subskrypcji po nazwie tematu

Anulowanie subskrypcji tematu po nazwie.

DELETE /api/subscriptions/by-topic/{topic_name}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 204 No Content

Sprawdzenie subskrypcji

Sprawdzenie czy użytkownik jest subskrybentem tematu.

GET /api/subscriptions/check/{topic_name}

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"subscribed": true,
"topic_name": "server-alerts"
}

Zarządzanie użytkownikami

Pobieranie bieżącego użytkownika

Pobieranie informacji o profilu bieżącego użytkownika.

GET /api/users/me

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK

{
"id": "uuid",
"email": "user@example.com",
"username": "username",
"avatar_url": null,
"subscription_tier": "FREE",
"subscription_expires_at": null,
"is_active": true,
"is_verified": true,
"created_at": "2025-01-01T00:00:00Z",
"last_login": "2025-01-15T10:00:00Z"
}

Aktualizacja bieżącego użytkownika

Aktualizacja profilu bieżącego użytkownika.

PATCH /api/users/me

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"username": "new-username",
"email": "new-email@example.com"
}
Zmiana email

Zmiana email ustawi is_verified na false i będzie wymagać ponownej weryfikacji email.

Odpowiedź: 200 OK

Eksport danych użytkownika (GDPR)

Eksport wszystkich danych użytkownika (GDPR Artykuł 15 - Prawo dostępu, Artykuł 20 - Przenoszenie danych).

GET /api/users/me/data

Nagłówki:

Authorization: Bearer <token>

Odpowiedź: 200 OK (pobieranie pliku JSON)

{
"export_metadata": {
"exported_at": "2025-01-15T10:00:00Z",
"user_id": "uuid",
"data_categories": ["account", "topics", "messages", "devices", "subscriptions", "api_keys", "access_tokens"]
},
"account": {
"user_id": "uuid",
"email": "user@example.com",
"username": "username",
"subscription_tier": "FREE",
"created_at": "2025-01-01T00:00:00Z"
},
"topics": [...],
"messages": [...],
"devices": [...],
"api_keys": [...],
"topic_access_tokens": [...],
"subscriptions": [...],
"statistics": {
"total_topics": 5,
"total_messages": 150,
"total_devices": 2,
"total_subscriptions": 10,
"total_api_keys": 3,
"account_age_days": 14
}
}

Usunięcie bieżącego użytkownika (GDPR)

Usunięcie konta bieżącego użytkownika i wszystkich powiązanych danych (GDPR Artykuł 17 - Prawo do usunięcia).

DELETE /api/users/me

Nagłówki:

Authorization: Bearer <token>
Content-Type: application/json

Treść żądania:

{
"password": "current-password"
}
Nieodwracalna akcja

Ta akcja jest NIEODWRACALNA. Wszystkie dane użytkownika zostaną usunięte, w tym:

  • Konto użytkownika
  • Wszystkie tematy utworzone przez użytkownika
  • Wszystkie wiadomości opublikowane przez użytkownika
  • Wszystkie zarejestrowane urządzenia
  • Wszystkie subskrypcje
  • Wszystkie klucze API
  • Wszystkie tokeny dostępu
Użytkownicy OAuth

Użytkownicy OAuth (Google, Apple) nie mogą usunąć konta przez ten endpoint. Prosimy o kontakt z pomocą techniczną.

Odpowiedź: 204 No Content


Odpowiedzi błędów

Wszystkie odpowiedzi błędów mają następujący format:

{
"detail": "Error message"
}

Powszechne kody statusu

KodZnaczenie
200Sukces
201Utworzono
204Brak treści (pomyślne usunięcie)
400Nieprawidłowe żądanie
401Nieuwierzytelniony
403Zabronione
404Nie znaleziono
409Konflikt
422Błąd walidacji
429Przekroczono limit częstotliwości
500Wewnętrzny błąd serwera

Ograniczanie częstotliwości

Zobacz Przegląd API - Ograniczanie częstotliwości dla szczegółów.


Następne kroki


Interaktywna dokumentacja

Najbardziej kompleksowa i aktualna dokumentacja API dostępna jest w interaktywnym Swagger UI:

https://app.notifer.io/docs

Interaktywna dokumentacja pozwala na:

  • Wykonywanie wywołań API bezpośrednio z przeglądarki
  • Przeglądanie wszystkich schematów żądań/odpowiedzi
  • Wyświetlanie szczegółowych opisów parametrów
  • Testowanie przepływów uwierzytelniania