Klucz dotyczy jednego projektu. Tworzysz go w „Urządzenia i API”. Token pokazujemy tylko raz i przechowujemy jego hash. Klucze mają jawny zakres; decyzje wymagają review, zmiana specyfikacji specify, a utworzenie wydania release. Nie mogą tworzyć organizacji ani zarządzać dostępem.
Authorization: Bearer relay_... Base URL: https://relay-drop-dawid.iwaniuk-dawid.chatgpt.site/api/relay
| Metoda i ścieżka | Zakres | Działanie |
|---|---|---|
| GET /projects/{id} | read | Wymagania, materiały i historia |
| POST /projects/{id}/uploads | upload | Nowa sesja multipart |
| GET /uploads/{id} | upload | Wysłane części i stan sesji |
| PUT /uploads/{id}/parts/{n} | upload | Binarna część + X-Part-SHA256 |
| POST /uploads/{id}/complete | upload | Scalenie i sprawdzenie pliku |
| DELETE /uploads/{id} | upload | Przerwanie otwartej sesji |
| GET/HEAD /assets/{id}/download | read | Załącznik; HTTP Range i status 206 |
| POST /projects/{id}/events | events | Zgłoszenie statusu aplikacji |
export RELAY_API_KEY='TWÓJ_KLUCZ' curl -H "Authorization: Bearer $RELAY_API_KEY" \ 'https://relay-drop-dawid.iwaniuk-dawid.chatgpt.site/api/relay/projects/PROJECT_ID'
1. Utwórz sesję. fingerprint to SHA-256 wybranego identyfikatora pliku, służący do wskazania pliku przy wznowieniu; integralność części jest sprawdzana osobno.
POST /projects/PROJECT_ID/uploads
Content-Type: application/json
{
"requirementId": "video",
"name": "film.mp4",
"size": 10485760,
"mime": "video/mp4",
"fingerprint": "64_znaki_sha256",
"metadata": {},
"supersedes": "OPCJONALNY_ASSET_ID_POPRZEDNIEJ_WERSJI"
}2. Odczytaj id sesji i chunkBytes. Wysyłaj części numerowane od 1. Każda ma dokładnie 5 MiB, oprócz ostatniej. Każdy PUT wymaga nagłówka X-Part-SHA256 z SHA-256 surowych bajtów tej części. Ten sam numer części z tym samym hashem jest idempotentny; z innym hashem jest odrzucany.
3. Po przerwaniu wykonaj GET sesji, porównaj digest części i wyślij tylko brakujące. Następnie POST /uploads/SESSION_ID/complete z pustym JSON. Manifest pliku to SHA-256 tekstu zawierającego hashe części połączone dwukropkiem. Nie jest to hash SHA-256 całego pliku.
POST /projects/PROJECT_ID/events
{
"type": "device_received",
"assetId": "ASSET_ID",
"detail": {"device":"moja-aplikacja","bytes":10485760}
}Dozwolone typy zgłoszeń: opened, download_started, device_received, shared_to_app. Są oznaczane jako client_reported — nie stanowią dowodu tożsamości ani niezależnego potwierdzenia zapisu na urządzeniu.
read: podgląd projektu i pobieranie. upload: wyłącznie sesje i dodawanie materiałów. events: zgłaszanie statusów. Cofnięcie klucza blokuje nowe żądania. Projekty mogą być wyłączone; linki i klucze mają termin ważności. Standardowy projekt: do 250 MiB na plik, 40 transferów i 2 GiB sumarycznej deklarowanej wielkości. Demonstracja: do 5 MiB na plik, 5 transferów, 24 godziny. Sesja wysyłania wygasa po 24 godzinach.
Nie dodawaj kluczy do URL ani kodu strony publicznej. Klucz przechowuj po stronie serwera lub w prywatnym środowisku. Zewnętrzny interfejs może osadzić publiczny link projektu w iframe lub otworzyć go w karcie; klucz API nie jest potrzebny w przeglądarce odbiorcy.
Właściciel może ustawić hasło do linków, zmienić termin i wygląd strony oraz wyłączyć pobieranie lub podgląd. Klucze API pozostają odrębnym uprawnieniem właściciela; polityka pobierania dotyczy również kluczy. Linki publiczne odblokowuje się hasłem przez POST /projects/{id}/unlock. Zwrócony grant jest ważny godzinę i działa tylko dla danej roli linku.
GET /projects/{id}/zip zwraca strumieniową paczkę ZIP najnowszych wersji. Opcjonalnie ids=id1,id2 wybiera pliki. Limit paczki to 1 GiB. POST /projects/{id}/comments przyjmuje assetId i comment; wymaga zakresu events. Wyłączenie pobierania nie zapobiega zapisaniu wyświetlonego podglądu.
Pobierz pomocnika Python. Podaj projekt i docelowy folder. Klucz wklej w ukrytym polu terminala lub ustaw RELAY_API_KEY. Pomocnik pobiera tylko zaakceptowane, najnowsze wersje i porównuje manifest części przed zatwierdzeniem zapisu.
python3 relay-companion.py --project PROJECT_ID --folder ./TRASENT # Jednorazowy odbiór: python3 relay-companion.py --project PROJECT_ID --folder ./TRASENT --once
To wersja testowa: bez gwarancji SLA, audytu bezpieczeństwa, E2EE i automatycznej analizy treści AI. Serwer odczytuje ograniczony zakres nagłówków obrazów, WAV i kontenerów MP4/MOV. Nie jest to pełne dekodowanie ani skanowanie antywirusowe. Retencja usuwa faktyczne obiekty po przetworzeniu kolejki. Harmonogram w tle wymaga aktywnego połączenia; ręczne uruchomienie jest dostępne w Operacjach.
Właściciel włącza codeRequired przez PATCH projektu. Kody dotyczą linków projektu, nie kluczy API. Klucz API nie może generować kodów ani zmieniać polityki dostępu.
PATCH /api/relay/projects/PROJECT_ID
{"codeRequired": true}
POST /api/relay/projects/PROJECT_ID/codes
{"role":"collect","ttl":120,"purpose":"link_unlock"}
GET /api/relay/projects/PROJECT_ID/codes
DELETE /api/relay/projects/PROJECT_ID/codes
{"challengeId":"CHALLENGE_ID"}Te operacje wymagają sesji właściciela i poprawnego Origin. Tworzenie zwraca kod tylko raz. GET zwraca wyłącznie metadane i stany. Dostępne role: collect/review; czas kodu: 120 lub 300 sekund.
POST /api/relay/projects/PROJECT_ID/redeem-code
X-Relay-Link: LINK_TOKEN
{"code":"123456","purpose":"link_unlock"}
// Odpowiedź zawiera grant i expires. Kolejne żądania:
X-Trasent-Code-Grant: GRANTPrzykładowy kod powyżej nie jest aktywnym kodem. Grant otwiera do 600 sekund dostępu, najwyżej do wygaśnięcia projektu. Dla pobierania dostępny jest parametr codeGrant obok access i grant (hasło). Jeśli hasło jest włączone, wymagany jest również osobny grant hasła. Kod i grant nie mogą służyć do tworzenia kluczy, zarządzania projektem ani nadawania innych uprawnień.
Weryfikacja: 5 prób na kod, 10 prób na projekt/IP i 30 prób na projekt w 15-minutowych oknach. Generowanie: do 10 operacji na projekt w takim oknie. Nowy kod cofa poprzedni oczekujący kod dla tej samej roli. Zmiana hasła, rotacja linku, archiwizacja i zmiana polityki kodów unieważniają dotychczasowe sesje kodów. Wygaśnięcie jest egzekwowane na serwerze.
| Ścieżka | Zakres | Znaczenie |
|---|---|---|
| GET /projects/{id}/workflow | read | Lista braków, formularze, kompletność i bieżąca specyfikacja |
| POST /projects/{id}/answers | upload | {revision, answers}; wymagane i warunkowe pola są egzekwowane na serwerze |
| POST /projects/{id}/specifications | specify | {expectedRevision, brief, requirements, fields}; aktualizacja z kontrolą wersji |
| POST /projects/{id}/review | review | {assetId, decision, comment}; approved lub changes_requested |
| POST /projects/{id}/releases | release | {purpose, requestKey}; kampania, montaz, produkty, druk lub archiwum; wyłącznie kompletna aktualna dostawa |
| GET /releases/{id} | read | Kanoniczny manifest, SHA-256 i podpis ECDSA P-256; publiczny klucz |
| GET /releases/{id}/zip | read | Dokładne wersje wydania i manifest |
Nowe skrzynki uczestników są prywatne. Właściciel przydziela wymagania oraz tworzy i cofa linki w zakładce Uczestnicy. Udostępniony link jest uprawnieniem posiadacza, nie identyfikacją człowieka. Starsze wspólne linki zachowują dawną wspólną widoczność.
Nowy pomocnik TRASENT rejestruje skrót wybranego folderu i używa klucza wyłącznie deliveries. Właściciel wybiera wydanie i urządzenie oraz potwierdza operację kodem ważnym 120 sekund. Zmiana folderu lub cofnięcie urządzenia/wydań blokuje odbiór. Helper weryfikuje podpis i manifest części, a po zapisie zgłasza client_reported. Jest to skrypt Python, nie instalator aplikacji desktopowej.
python3 trasent-device.py --device DEVICE_ID --folder ./TRASENT
Wklej klucz w ukrytym polu terminala lub ustaw TRASENT_DEVICE_KEY w prywatnym środowisku. Nie dodawaj go do polecenia ani URL. Starszy relay-companion.py pozostaje dostępny dla wcześniejszych integracji.
Właściciel konfiguruje publiczny adres HTTPS w Operacjach. Sekret trwh_ jest pokazywany raz i szyfrowany w bazie. Żądania mają X-Trasent-Event, X-Trasent-Timestamp oraz X-Trasent-Signature: sha256=HEX. Sprawdź HMAC-SHA256(timestamp + "." + surowe body), okno czasowe i deduplikuj identyfikator zdarzenia. Obsługiwane są ponowienia do 5 prób z rosnącym opóźnieniem; HTTP 2xx potwierdza przyjęcie webhooka, nie pliku. Nie podążamy za przekierowaniami; domena przechodzi publiczną kontrolę DNS. Pełna ochrona przed DNS rebinding wymaga również kontroli sieci docelowego wdrożenia.
Kosz: 7 dni odzyskania; przypięty plik wymaga cofnięcia wydania przed usunięciem. Retencja całego projektu obejmuje także wydania. Eksport metadanych nie stanowi kompletnej kopii magazynu plików. Przypomnienia działają w aplikacji; e-mail, SMS, skaner AV i semantyczne AI nie są podłączone.
Wybór szyfrowania w szybkim transferze uruchamia AES-256-GCM w przeglądarce. Losowy kod ma 128 bitów entropii (22 znaki base64url); HKDF-SHA256 wyprowadza klucz AES-256 oddzielnie dla każdego pliku. Losowa sól i prefiks nonce są osobne dla pliku, a indeks 32-bitowy rozróżnia metadane i bloki 1 MiB. AAD wiąże nagłówek, indeks i kolejność. Oryginalne nazwy i MIME znajdują się w zaszyfrowanych metadanych. Rozmiar, liczba plików, daty i sam fakt transferu pozostają widoczne dla serwera.
To szyfrowanie treści plików, nie tylko hasło do linku. Kod nie trafia do API ani URL; może pozostać w pamięci przeglądarki nadawcy, co interfejs jawnie komunikuje. Przycisk „Kopiuj razem” umieszcza link i kod w jednej wiadomości — odbiorca obu może otworzyć pliki. Serwer nie może odzyskać kodu. Zaszyfrowanej zawartości nie analizujemy ani nie zatwierdzamy technicznie. W tym trybie nie tworzymy serwerowych wydań ani nie odszyfrowujemy plików pomocnikiem Python.
Format pliku: TRASENC1, długość nagłówka uint32 big-endian, JSON nagłówka, kolejne bloki AES-GCM z tagiem 16 bajtów. Dokumentacja formatu i testy są w lib/relay/encryption.ts oraz tests/encryption-library.mjs. Przeglądarka skanuje plik i szyfruje go w ograniczonych blokach; wznowienie jest powiązane z kodem i pełnym odciskiem pliku wyliczonym przez HMAC. Zmiana zawartości wymaga nowego kontenera. Pobieranie w przeglądarkach bez wyboru strumieniowego pliku wymaga pamięci na odszyfrowany plik.
Biblioteka zbiera dostępne pliki projektów oraz własne tablice, notatki i linki. Są widoki kart/listy, filtry typów, wyszukiwanie nazw/notatek/tagów, ulubione i operacje na wielu elementach. Wyszukiwanie nie odczytuje zaszyfrowanej treści. Linki są zapisywane jako adresy; nie pobieramy ich treści, nie generujemy transkrypcji ani nie uruchamiamy AI. Nowy upload rozpoczęty z dysku zachowuje pliki do ręcznego usunięcia; publiczny link ma własny termin. Dotychczasowe pliki zachowują politykę retencji swojej dostawy. Biblioteka pokazuje do 1000 elementów; API sesji przeglądarkowej wymaga zalogowania.