Referencja API
Webhooki
Adres webhooka i sekret podpisu.
Klucz testowy w przykładach
Wklej klucz sk_test_ z panelu (zakładka Deweloperzy), a każdy przykład będzie gotowy do uruchomienia. Klucz zostaje w tej karcie przeglądarki, nie wysyłamy go nigdzie.
Przykłady używają Twojego klucza testowego. Produkcyjnego klucza nie przyjmujemy.
Obiekt webhook_endpoint#
Adres webhooka (we_) trybu klucza: jeden na tryb. Sekret whsec_ wraca tylko przy utworzeniu i przy rotate_secret.
Pola
-
id string wymagane
-
object string wymagane
Nazwa typu obiektu, zawsze "webhook_endpoint".
-
url string (uri) wymagane
-
enabled_events array of string wymagane
Lista typów zdarzeń albo ["*"] dla wszystkich.
-
status string wymaganeenabled
-
secret string
Sekret podpisu whsec_ (tylko przy utworzeniu i rotacji).
-
livemode boolean wymagane
true dla obiektów produkcyjnych (klucz sk_live_), false dla piaskownicy (sk_test_).
-
created integer
Chwila utworzenia jako znacznik czasu Unix (sekundy, UTC).
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
],
"status": "enabled",
"secret": "whsec_Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90",
"livemode": false,
"created": 1760000000
}
Zapisz adres webhooka#
POST /v1/webhook_endpoints
Adres https na publicznym serwerze i lista zdarzeń (albo ["*"]). Odpowiedź zawiera sekret whsec_ do sprawdzania podpisu; zapisz go, nie wraca w GET. Ponowny POST zastępuje adres i wydaje nowy sekret.
Nagłówki opcjonalne: Oplac-Version, Idempotency-Key
Treść żądania JSON
-
url string (uri) wymagane
Do 500 znaków.
-
enabled_events array of string
Domyślnie
["*"].payment.createdpayment.succeededpayment.failedpayment.canceledpayment.routedpayment_link.expiredaccount.verifiedpayout.paidrefund.createdrefund.succeededrefund.failedcustomer.createdcustomer.updatedcustomer.deletedsubscription.createdsubscription.updatedsubscription.renewedsubscription.payment_failedsubscription.recoveredsubscription.canceledinvoice.issuedinvoice.paidinvoice.ksef_acceptedinvoice.ksef_rejected*
Odpowiedź
HTTP 201: obiekt webhook_endpoint.
Błędy tej operacji:
parameter_missing, parameter_invalid, metadata_invalid, expand_invalid, api_version_invalid, idempotency_key_reused, idempotency_key_invalid, api_key_invalid, rate_limited, api_error .
Każdy błąd to ten sam obiekt error, opisany w przewodniku Błędy.
curl https://oplac.pl/api/v1/webhook_endpoints \
-H "Authorization: Bearer sk_test_TWOJ_KLUCZ" \
-H "Idempotency-Key: 5f0c2a4e-7d1b-4e8a-9b2f-1c3d5e7f9a0b" \
-H "Content-Type: application/json" \
-d '{
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
]
}'
$ch = curl_init('https://oplac.pl/api/v1/webhook_endpoints');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sk_test_TWOJ_KLUCZ',
'Idempotency-Key: 5f0c2a4e-7d1b-4e8a-9b2f-1c3d5e7f9a0b',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://sklep.example.com/oplac/webhook',
'enabled_events' => ['payment.succeeded', 'payment.failed', 'refund.succeeded'],
]),
CURLOPT_RETURNTRANSFER => true,
]);
$webhook_endpoint = json_decode(curl_exec($ch), true);
const res = await fetch('https://oplac.pl/api/v1/webhook_endpoints', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_test_TWOJ_KLUCZ',
'Idempotency-Key': '5f0c2a4e-7d1b-4e8a-9b2f-1c3d5e7f9a0b',
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://sklep.example.com/oplac/webhook',
enabled_events: ['payment.succeeded', 'payment.failed', 'refund.succeeded'],
}),
});
const webhookEndpoint = await res.json();
import requests
res = requests.post(
"https://oplac.pl/api/v1/webhook_endpoints",
headers={
"Authorization": "Bearer sk_test_TWOJ_KLUCZ",
"Idempotency-Key": "5f0c2a4e-7d1b-4e8a-9b2f-1c3d5e7f9a0b",
},
json={
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": ["payment.succeeded", "payment.failed", "refund.succeeded"],
},
)
webhook_endpoint = res.json()
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
],
"status": "enabled",
"secret": "whsec_Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90",
"livemode": false,
"created": 1760000000
}
Pobierz adres webhooka#
GET /v1/webhook_endpoints/{id}
Adres po identyfikatorze (bez sekretu).
Nagłówki opcjonalne: Oplac-Version
Parametry ścieżki
-
id string wymagane
Identyfikator we_.
Odpowiedź
HTTP 200: obiekt webhook_endpoint.
Błędy tej operacji:
parameter_missing, parameter_invalid, metadata_invalid, expand_invalid, api_version_invalid, idempotency_key_reused, idempotency_key_invalid, api_key_invalid, resource_missing, rate_limited, api_error .
Każdy błąd to ten sam obiekt error, opisany w przewodniku Błędy.
curl https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh \
-H "Authorization: Bearer sk_test_TWOJ_KLUCZ"
$ch = curl_init('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer sk_test_TWOJ_KLUCZ'],
CURLOPT_RETURNTRANSFER => true,
]);
$webhook_endpoint = json_decode(curl_exec($ch), true);
const res = await fetch('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh', {
headers: {Authorization: 'Bearer sk_test_TWOJ_KLUCZ' },
});
const webhookEndpoint = await res.json();
import requests
res = requests.get(
"https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh",
headers={"Authorization": "Bearer sk_test_TWOJ_KLUCZ"},
)
webhook_endpoint = res.json()
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
],
"status": "enabled",
"secret": "whsec_Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90",
"livemode": false,
"created": 1760000000
}
Zmień adres webhooka#
POST /v1/webhook_endpoints/{id}
url, enabled_events, rotate_secret (true: nowy sekret w odpowiedzi, stary przestaje działać od razu).
Nagłówki opcjonalne: Oplac-Version, Idempotency-Key
Parametry ścieżki
-
id string wymagane
Identyfikator we_.
Treść żądania JSON, opcjonalna
-
url string (uri)
-
enabled_events array of string
-
rotate_secret boolean
Domyślnie
false.
Odpowiedź
HTTP 200: obiekt webhook_endpoint.
Błędy tej operacji:
parameter_missing, parameter_invalid, metadata_invalid, expand_invalid, api_version_invalid, idempotency_key_reused, idempotency_key_invalid, api_key_invalid, resource_missing, rate_limited, api_error .
Każdy błąd to ten sam obiekt error, opisany w przewodniku Błędy.
curl https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh \
-H "Authorization: Bearer sk_test_TWOJ_KLUCZ" \
-H "Content-Type: application/json" \
-d '{
"url": "https://sklep.example.com/powrot",
"enabled_events": [],
"rotate_secret": false
}'
$ch = curl_init('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sk_test_TWOJ_KLUCZ',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://sklep.example.com/powrot',
'enabled_events' => [],
'rotate_secret' => false,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$webhook_endpoint = json_decode(curl_exec($ch), true);
const res = await fetch('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_test_TWOJ_KLUCZ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://sklep.example.com/powrot',
enabled_events: [],
rotate_secret: false,
}),
});
const webhookEndpoint = await res.json();
import requests
res = requests.post(
"https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh",
headers={"Authorization": "Bearer sk_test_TWOJ_KLUCZ"},
json={
"url": "https://sklep.example.com/powrot",
"enabled_events": [],
"rotate_secret": False,
},
)
webhook_endpoint = res.json()
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
],
"status": "enabled",
"secret": "whsec_Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90",
"livemode": false,
"created": 1760000000
}
Lista adresów webhooka#
GET /v1/webhook_endpoints
Adres webhooka trybu klucza (jeden na tryb) albo pusta lista.
Nagłówki opcjonalne: Oplac-Version
Odpowiedź
HTTP 200:
lista {object: "list", url, has_more, data} z obiektami
webhook_endpoint od najnowszego. Stronicowanie kursorem opisuje przewodnik.
Błędy tej operacji:
parameter_missing, parameter_invalid, metadata_invalid, expand_invalid, api_version_invalid, idempotency_key_reused, idempotency_key_invalid, api_key_invalid, rate_limited, api_error .
Każdy błąd to ten sam obiekt error, opisany w przewodniku Błędy.
curl https://oplac.pl/api/v1/webhook_endpoints \
-H "Authorization: Bearer sk_test_TWOJ_KLUCZ"
$ch = curl_init('https://oplac.pl/api/v1/webhook_endpoints');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer sk_test_TWOJ_KLUCZ'],
CURLOPT_RETURNTRANSFER => true,
]);
$webhook_endpoints = json_decode(curl_exec($ch), true);
const res = await fetch('https://oplac.pl/api/v1/webhook_endpoints', {
headers: {Authorization: 'Bearer sk_test_TWOJ_KLUCZ' },
});
const webhookEndpoints = await res.json();
import requests
res = requests.get(
"https://oplac.pl/api/v1/webhook_endpoints",
headers={"Authorization": "Bearer sk_test_TWOJ_KLUCZ"},
)
webhook_endpoints = res.json()
{
"object": "list",
"url": "/v1/webhook_endpoints",
"has_more": false,
"data": [
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"url": "https://sklep.example.com/oplac/webhook",
"enabled_events": [
"payment.succeeded",
"payment.failed",
"refund.succeeded"
],
"status": "enabled",
"secret": "whsec_Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90",
"livemode": false,
"created": 1760000000
}
]
}
Usuń adres webhooka#
DELETE /v1/webhook_endpoints/{id}
Zdarzenia zostają w historii (GET /v1/events), nic nie jest wysyłane.
Nagłówki opcjonalne: Oplac-Version, Idempotency-Key
Parametry ścieżki
-
id string wymagane
Identyfikator we_.
Odpowiedź
HTTP 200:
obiekt {id, object, deleted: true}; usuniętego obiektu nie da się już zmieniać.
Błędy tej operacji:
parameter_missing, parameter_invalid, metadata_invalid, expand_invalid, api_version_invalid, idempotency_key_reused, idempotency_key_invalid, api_key_invalid, resource_missing, rate_limited, api_error .
Każdy błąd to ten sam obiekt error, opisany w przewodniku Błędy.
curl https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh \
-X DELETE \
-H "Authorization: Bearer sk_test_TWOJ_KLUCZ"
$ch = curl_init('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer sk_test_TWOJ_KLUCZ'],
CURLOPT_RETURNTRANSFER => true,
]);
$deleted = json_decode(curl_exec($ch), true);
const res = await fetch('https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh', {
method: 'DELETE',
headers: {Authorization: 'Bearer sk_test_TWOJ_KLUCZ' },
});
const deleted = await res.json();
import requests
res = requests.delete(
"https://oplac.pl/api/v1/webhook_endpoints/we_test_Ab12Cd34Ef56Gh",
headers={"Authorization": "Bearer sk_test_TWOJ_KLUCZ"},
)
deleted = res.json()
{
"id": "we_test_Ab12Cd34Ef56Gh",
"object": "webhook_endpoint",
"deleted": true,
"livemode": false
}
Klucz testowy dostajesz od razu po zapisie
Adres e-mail, kod z maila i piaskownica z kodami BLIK. Produkcję włączasz sam w panelu: plan, dostawca płatności, klucz sk_live_. Wolisz, żeby wdrożenie w sklepie zrobił nasz zespół? To też jest za darmo.