Dokumentacja API
Kompletna dokumentacja wszystkich punktów końcowych Notifer API.
Najbardziej aktualna i interaktywna dokumentacja API dostępna jest na:
- Swagger UI: https://app.notifer.io/docs
- ReDoc: https://app.notifer.io/redoc
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 datydate_to(ISO datetime, opcjonalne): Filtrowanie wiadomości do tej datyinclude_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}
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}
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 czasupoll(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 tematutags(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 daciedate_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 przecinkamipriority_min(int, opcjonalne): Minimalny priorytet (1-5)priority_max(int, opcjonalne): Maksymalny priorytet (1-5)tags(string, opcjonalne): Lista tagów oddzielonych przecinkamiquery(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/sessionstopics(string, alternatywa): Lista nazw tematów oddzielonych przecinkamitoken(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ówsince_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
}
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"
}
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 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"
}
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 (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
| Kod | Znaczenie |
|---|---|
| 200 | Sukces |
| 201 | Utworzono |
| 204 | Brak treści (pomyślne usunięcie) |
| 400 | Nieprawidłowe żądanie |
| 401 | Nieuwierzytelniony |
| 403 | Zabronione |
| 404 | Nie znaleziono |
| 409 | Konflikt |
| 422 | Błąd walidacji |
| 429 | Przekroczono limit częstotliwości |
| 500 | Wewnętrzny błąd serwera |
Ograniczanie częstotliwości
Zobacz Przegląd API - Ograniczanie częstotliwości dla szczegółów.
Następne kroki
- Przewodnik uwierzytelniania - Poznaj metody uwierzytelniania
- Przegląd API - Zrozumienie struktury API
- Przewodnik publikowania - Publikowanie wiadomości
- Przewodnik SSE - Subskrypcje w czasie rzeczywistym
Interaktywna dokumentacja
Najbardziej kompleksowa i aktualna dokumentacja API dostępna jest w interaktywnym Swagger UI:
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