1. Wprowadzenie
Publiczne API EpicPay pozwala pobrać ofertę sklepu na własną stronę, do launchera albo bota, utworzyć zamówienie i sprawdzić jego status. Adres bazowy: https://api.epicpay.eu/v1. Odpowiedzi są w formacie JSON, kwoty w złotych (PLN).
- Limit: 120 zapytań na minutę z jednego adresu IP. Po przekroczeniu API zwraca
429 - poczekaj chwilę i spróbuj ponownie. - Interaktywną wersję dokumentacji (Swagger) z możliwością wysłania zapytania znajdziesz pod https://api.epicpay.eu/docs, a specyfikację OpenAPI pod
https://api.epicpay.eu/v1/openapi.json. - Sklep wskazujesz jego UUID (
{uuid} w ścieżce). Znajdziesz go w panelu: Ustawienia sklepu → Plugin (shop_uuid).
2. Klucze i uwierzytelnianie
| Klucz | Do czego | Gdzie go znajdziesz |
|---|
shop_uuid | identyfikator sklepu w adresach API i w pluginie | Ustawienia sklepu → Plugin |
api_secret | API pluginu (dostawy); nie używaj go na stronie www | Ustawienia sklepu → Plugin |
public_api_key | endpointy z dostępem do danych sklepu (/me, /transactions), nagłówek Authorization: Bearer | Ustawienia sklepu → Klucze API (od pakietu Pro) |
| sekret webhooków | podpis zdarzeń wysyłanych do Twojej aplikacji | Ustawienia sklepu → Webhooki (pakiet Business) |
Większość endpointów (oferta sklepu, zamówienia, vouchery) nie wymaga klucza - zwracają tylko dane, które gracz i tak widzi w sklepie. Klucze generujesz ponownie w panelu, gdy wyciekną; stary przestaje wtedy działać.
Zapytanie z kluczemcurl -H "Authorization: Bearer TWOJ_PUBLIC_API_KEY" \
https://api.epicpay.eu/v1/shops/UUID-SKLEPU/transactions
3. Zakup z własnej strony
- Pobierz produkty:
GET /shops/{uuid}/packages (albo produkty jednego trybu gry). - Pobierz włączone bramki:
GET /shops/{uuid}/gateways. - Utwórz zamówienie:
POST /shops/{uuid}/orders z package_id, nickiem gracza (nickname) i bramką (gateway). - Przekieruj gracza na zwrócony
payment_url. - Sprawdzaj status:
GET /shops/{uuid}/orders/{token} albo odbieraj webhooki. Po opłaceniu plugin sam wyda zakup na serwerze.
Przykład (JavaScript)const res = await fetch('https://api.epicpay.eu/v1/shops/UUID-SKLEPU/orders', {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify({ package_id: 42, nickname: 'Steve123', gateway: 'cashbill' }),
});
const { data } = await res.json();
location.href = data.payment_url;
4. Endpointy publiczne
Wszystkie endpointy poniżej mają adres bazowy https://api.epicpay.eu/v1.
5. Informacje o sklepie - GET /shops/{uuid}
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}
Zwraca publiczne informacje o sklepie: nazwę, logo, konfigurację kolorów, linki social media i aktywne bramki płatności.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Odpowiedź 200{
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "EpicCraft Store",
"logo_url": "https://r2.epicpay.eu/logos/abc.png",
"server_ip": "play.epiccraft.pl",
"accent_color": "#FF6B00",
"button_text_color": "#FFFFFF",
"discord_url": "https://discord.gg/epiccraft",
"youtube_url": null,
"tiktok_url": null,
"terms_url": null,
"gateways": [
{
"type": "cashbill",
"label": "CashBill"
}
]
}
}
| Kod | Kiedy |
|---|
404 | Sklep nie istnieje |
503 | Sklep wyłączony |
6. Lista kategorii - GET /shops/{uuid}/categories
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/categories
Zwraca wszystkie widoczne kategorie (tryby) sklepu posortowane chronologicznie.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Odpowiedź 200{
"data": [
{
"id": 1,
"name": "SkyBlock",
"description": "Rangi i przedmioty na SkyBlock",
"icon": "🏝️",
"slug": "skyblock"
},
{
"id": 2,
"name": "Survival",
"description": "Tryb przetrwania",
"icon": "🌲",
"slug": "survival"
}
]
}
| Kod | Kiedy |
|---|
404 | Sklep nie istnieje |
7. Produkty w kategorii - GET /shops/{uuid}/categories/{categoryId}/packages
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/categories/{categoryId}/packages
Zwraca informacje o kategorii oraz listę widocznych produktów. categoryId może być numerycznym ID lub slugiem tekstowym.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
categoryId | ścieżka | tak | ID lub slug kategorii |
| Kod | Kiedy |
|---|
404 | Zasób nie istnieje |
8. Wszystkie produkty sklepu - GET /shops/{uuid}/packages
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/packages
Zwraca wszystkie widoczne produkty ze wszystkich kategorii danego sklepu.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
| Kod | Kiedy |
|---|
404 | Sklep nie istnieje |
9. Aktywne bramki płatności - GET /shops/{uuid}/gateways
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/gateways
Zwraca listę aktywnych bramek płatności dostępnych w sklepie. Używaj tego endpointu aby dynamicznie wyświetlać dostępne metody płatności na swojej stronie.
Ważne: Odpowiedź nigdy nie zawiera danych uwierzytelniających (kluczy API, sekretów) - tylko publiczne metadane.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Odpowiedź 200{
"data": [
{
"type": "cashbill",
"label": "CashBill",
"enabled": true,
"created_at": "2025-01-15T10:30:00+01:00"
}
]
}
| Kod | Kiedy |
|---|
404 | Sklep nie istnieje |
10. Ogłoszenia sklepu - GET /shops/{uuid}/announcements
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/announcements
Zwraca aktywne ogłoszenia sklepu posortowane od najnowszego.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
| Kod | Kiedy |
|---|
404 | Sklep nie istnieje |
11. Top gracze - GET /shops/{uuid}/top-players
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/top-players
Zwraca 10 graczy z największymi wydatkami w sklepie.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
12. Ostatnie zakupy - GET /shops/{uuid}/recent-purchases
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/recent-purchases
Zwraca 20 ostatnio zakończonych transakcji w sklepie.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
13. Utwórz zamówienie - POST /shops/{uuid}/orders
EndpointPOST https://api.epicpay.eu/v1/shops/{uuid}/orders
Tworzy nowe zamówienie i zwraca URL do strony płatności. Gracz powinien zostać przekierowany na payment_url aby dokończyć płatność.
Przepływ:
- Pobierz listę produktów (
GET /shops/{uuid}/packages) - Utwórz zamówienie podając
package_id, nickname gracza i gateway - Przekieruj gracza na zwrócony
payment_url - Po płatności sprawdź status przez
GET /shops/{uuid}/orders/{token}
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Treść zapytania (JSON)
| Pole | Typ | Wymagane | Opis |
|---|
package_id | integer | tak | ID produktu z listy /packages |
nickname | string | tak | Nick gracza Minecraft (tylko litery, cyfry i podkreślniki) |
gateway | string | tak | Bramka płatności włączona w sklepie (lista: GET /shops/{uuid}/gateways) Możliwe: cashbill, hotpay, simpay, dpay, paybylink, stripe, paypal, oxapay, epichost. |
Odpowiedź 201{
"data": {
"order_token": "550e8400-e29b-41d4-a716-446655440111",
"status": "pending",
"package_name": "Ranga VIP",
"player_nickname": "Steve123",
"price": 19.99,
"payment_url": "https://pay.epicpay.eu/p/550e8400-e29b-41d4-a716-446655440111"
}
}
| Kod | Kiedy |
|---|
404 | Zasób nie istnieje |
422 | Błąd walidacji |
502 | Błąd bramki płatności |
14. Status zamówienia - GET /shops/{uuid}/orders/{token}
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/orders/{token}
Sprawdź aktualny status zamówienia po tokenie. Możliwe statusy: - pending - oczekuje na płatność - success - opłacone i dostarczone - failed - nieudane - expired - wygasło
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
token | ścieżka | tak | Token zamówienia zwrócony przy tworzeniu |
| Kod | Kiedy |
|---|
404 | Zasób nie istnieje |
15. Waliduj voucher - POST /shops/{uuid}/vouchers/validate
EndpointPOST https://api.epicpay.eu/v1/shops/{uuid}/vouchers/validate
Sprawdza czy podany kod vouchera jest ważny dla danego gracza i opcjonalnie dla konkretnego produktu.
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Treść zapytania (JSON)
| Pole | Typ | Wymagane | Opis |
|---|
code | string | tak | Kod vouchera |
nickname | string | tak | Nick gracza |
package_id | integer | nie | Opcjonalnie ID produktu do weryfikacji |
Odpowiedź 200{
"valid": true,
"message": "Voucher jest ważny - 100% zniżki.",
"data": {
"voucher_id": 5,
"code": "GRATIS2025"
}
}
| Kod | Kiedy |
|---|
422 | Voucher nieprawidłowy |
16. Info o sklepie + statystyki - GET /shops/{uuid}/me
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/me
Wymaga nagłówka Authorization: Bearer <public_api_key> (pakiet Pro lub wyższy).
Zwraca pełne dane sklepu wraz ze statystykami finansowymi. Wymaga Authorization: Bearer <public_api_key> (subskrypcja Pro).
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
Odpowiedź 200{
"data": {
"uuid": "550e8400-...",
"name": "EpicCraft Store",
"stats": {
"transactions_count": 1240,
"total_earned": 12489.5,
"categories_count": 4,
"packages_count": 32
}
}
}
| Kod | Kiedy |
|---|
401 | Brak lub nieprawidłowy token |
403 | Wymagana subskrypcja Pro |
17. Lista transakcji - GET /shops/{uuid}/transactions
EndpointGET https://api.epicpay.eu/v1/shops/{uuid}/transactions
Wymaga nagłówka Authorization: Bearer <public_api_key> (pakiet Pro lub wyższy).
Zwraca paginowaną listę transakcji sklepu. Wymaga Authorization: Bearer <public_api_key> (subskrypcja Pro).
Parametry
| Nazwa | Gdzie | Wymagany | Opis |
|---|
uuid | ścieżka | tak | UUID sklepu (widoczny w panelu EpicPay) |
status | zapytanie | nie | Filtr po statusie |
page | zapytanie | nie | Numer strony |
per_page | zapytanie | nie | Wyników na stronę (max 100) |
| Kod | Kiedy |
|---|
401 | Brak lub nieprawidłowy token |
403 | Wymagana subskrypcja Pro |
18. Webhooki
Webhooki (pakiet Business; ustawiasz je w Ustawieniach sklepu → Webhooki) wysyłają zdarzenia ze sklepu na adres Twojej aplikacji metodą POST z treścią JSON. Przycisk testu w panelu wysyła zdarzenie test.
| Zdarzenie | Kiedy |
|---|
purchase.completed | zamówienie zostało opłacone |
delivery.confirmed | plugin potwierdził wydanie zakupu na serwerze |
| Nagłówek | Wartość |
|---|
X-EpicPay-Event | nazwa zdarzenia |
X-EpicPay-Signature | sha256= + HMAC-SHA256 całej treści zapytania, kluczem jest sekret webhooków |
User-Agent | EpicPay-Webhooks/1.0 |
Treść zdarzenia{
"event": "purchase.completed",
"sent_at": "2026-10-21T12:00:00+00:00",
"shop": {
"uuid": "9b1c6f1e-…",
"name": "EpicCraft"
},
"transaction": {
"id": 1234,
"player": "Steve123",
"package_id": 42,
"package": "Ranga VIP",
"quantity": 1,
"price": 19.99,
"currency": "PLN",
"method": "cashbill",
"created_at": "2026-10-21T11:59:30+00:00",
"delivered_at": null
}
}
Odpowiedz kodem 2xx w ciągu 10 sekund. Przy błędzie 5xx albo 429 EpicPay ponowi wysyłkę po 10 s, 1 min i 5 min. Zawsze sprawdzaj podpis:
Sprawdzenie podpisu (PHP)$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, $sekretWebhookow);
if (!hash_equals($expected, $_SERVER['HTTP_X_EPICPAY_SIGNATURE'] ?? '')) {
http_response_code(401);
exit;
}
$event = json_decode($body, true);
Sprawdzenie podpisu (Node.js)import crypto from 'node:crypto';
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-epicpay-signature'] ?? ''));
19. API pluginu (dostawy)
Z tych endpointów korzysta plugin EpicPay. Opisujemy je dla własnych integracji, np. pluginu na inny silnik serwera. Uwierzytelnienie: parametry shop_uuid i secret (api_secret sklepu). Adres bazowy: https://api.epicpay.eu.
Zakupy do wydaniaGET https://api.epicpay.eu/deliveries/pending?shop_uuid=UUID&secret=API_SECRET[&mode_uuid=UUID_TRYBU]
Odpowiedź{
"deliveries": [
{
"id": 1234,
"player_nickname": "Steve123",
"package_name": "Ranga VIP",
"quantity": 1,
"commands": [
"lp user Steve123 parent addtemp vip 30d"
],
"purchased_at": "2026-10-21T11:59:30.000000Z"
}
]
}
Komendy mają już podstawione {player} i {quantity}. Z mode_uuid dostajesz tylko zakupy z jednego trybu gry. Po wykonaniu komend potwierdź dostawę - inaczej zakup wróci w kolejnym pobraniu:
Potwierdzenie dostawyPOST https://api.epicpay.eu/deliveries/1234/confirm?shop_uuid=UUID&secret=API_SECRET
→ {"ok": true, "confirmed": 1}
POST https://api.epicpay.eu/deliveries/confirm?shop_uuid=UUID&secret=API_SECRET[&mode_uuid=UUID_TRYBU]
→ potwierdza wszystkie oczekujące (do 500 naraz)
| Kod | Kiedy |
|---|
401 | brak albo zły shop_uuid / secret |
404 | nieznany mode_uuid albo dostawa |
20. Błędy
Błędy API mają postać JSON z polem error (kod) i message (opis po polsku), np. {"error": "shop_not_found", "message": "Sklep o podanym UUID nie istnieje."}.
| Kod HTTP | Znaczenie |
|---|
401 | brak albo nieprawidłowy klucz |
403 | endpoint wymaga wyższego pakietu (subscription_required) |
404 | nie ma takiego sklepu, produktu albo zamówienia |
422 | błędne dane w zapytaniu (szczegóły w errors) |
429 | przekroczony limit zapytań |
503 | sklep jest wyłączony albo zablokowany (shop_disabled) |