Webhooks
Webhooks let your application receive real-time notifications when events occur in Pixee PIM — such as a product being updated, an import completing, or a supplier being created.
Event types
| Event | Description |
|---|---|
product.created | A new product was added to the catalog |
product.updated | A product's data was modified |
product.deleted | A product was removed |
import.started | An import job began processing |
import.completed | An import job finished successfully |
import.failed | An import job encountered a critical error |
supplier.created | A new supplier was added |
supplier.updated | Supplier data was modified |
ean.resolved | An EAN lookup returned a result |
test | Test event sent via the test endpoint |
List available events
Returns the event types your account can subscribe to, as a live list — use this instead of hardcoding the table above so new event types show up automatically.
Request
curl https://api.pixeepim.com/api/v1/webhooks/events \
-H "Authorization: Bearer {api_key}"
Response
{
"events": [
"product.created", "product.updated", "product.deleted",
"import.started", "import.completed", "import.failed",
"supplier.created", "supplier.updated", "ean.resolved", "test"
],
"total": 10
}
Register a webhook
Creates a new webhook endpoint.
Body parameters
- Name
name- Type
- string
- Description
Descriptive name for the webhook.
- Name
url- Type
- string
- Description
HTTPS URL to receive events. Must be publicly accessible.
- Name
events- Type
- array
- Description
List of event types to subscribe to (see Event types).
- Name
secret- Type
- string
- Description
Optional signing secret used to compute the
X-PM-Signatureheader for payload verification.
- Name
headers- Type
- object
- Description
Additional headers to include in each request (e.g.
{"X-API-Key": "..."}).
- Name
max_retries- Type
- integer
- Description
Number of delivery retries on failure.
0–10(default:3).
- Name
timeout_seconds- Type
- integer
- Description
Request timeout in seconds.
1–60(default:10).
Request
curl -X POST https://api.pixeepim.com/api/v1/webhooks \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "ERP Product Sync",
"url": "https://yourapp.com/webhooks/pixeepim",
"events": ["product.created", "product.updated", "import.completed"],
"secret": "your_signing_secret"
}'
Response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "ERP Product Sync",
"url": "https://yourapp.com/webhooks/pixeepim",
"events": ["product.created", "product.updated", "import.completed"],
"is_active": true,
"max_retries": 3,
"created_at": "2026-09-17T10:30:00Z"
}
List webhooks
Returns all configured webhooks.
Query parameters
- Name
active_only- Type
- boolean
- Description
Return only active webhooks.
- Name
page- Type
- integer
- Description
Page number (default:
1).
- Name
per_page- Type
- integer
- Description
Items per page, max
100(default:50).
Request
curl "https://api.pixeepim.com/api/v1/webhooks?active_only=true" \
-H "Authorization: Bearer {api_key}"
Response
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "ERP Product Sync",
"url": "https://yourapp.com/webhooks/pixeepim",
"events": ["product.created", "product.updated"],
"is_active": true,
"created_at": "2026-09-17T10:30:00Z"
}
],
"meta": {
"total": 1,
"page": 1,
"per_page": 50,
"total_pages": 1,
"has_next": false,
"has_previous": false
}
}
Get a webhook
Returns a single webhook's configuration.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Request
curl https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer {api_key}"
Update a webhook
Updates a webhook's configuration. All fields are optional, following the same schema as Register a webhook.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Request
curl -X PATCH https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{"max_retries": 5, "timeout_seconds": 15}'
Delete a webhook
Removes a webhook endpoint.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Request
curl -X DELETE https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer {api_key}"
Toggle a webhook
Activates or deactivates a webhook without deleting its configuration.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Body parameters
- Name
is_active- Type
- boolean
- Description
trueto enable delivery,falseto pause it.
Request
curl -X POST https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000/toggle \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{"is_active": false}'
Test a webhook
Sends a test test event to the webhook URL to verify connectivity.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Request
curl -X POST https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000/test \
-H "Authorization: Bearer {api_key}"
Response
{
"status": "success",
"status_code": 200,
"duration_ms": 125,
"response_body": "OK"
}
Webhook payload
Each webhook POST request contains a JSON body:
Webhook payload example
{
"id": "evt_01HQ...",
"event": "product.updated",
"timestamp": "2026-09-17T10:30:00Z",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"ean": "3760000000001",
"name": "Produit exemple",
"updated_fields": ["price", "is_active"]
}
}
Verifying signatures
Every webhook request includes an X-PM-Signature header — an HMAC-SHA256 digest of the raw request body signed with your webhook secret.
Verify signature (Python)
import hmac
import hashlib
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature)
Verify signature (Node.js)
const crypto = require('crypto')
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(`sha256=${expected}`),
Buffer.from(signature)
)
}
Always verify the signature before processing a webhook payload. Reject requests where the signature does not match.
Delivery logs
Returns the delivery history for a webhook endpoint. Failed deliveries can be retried individually.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
Query parameters
- Name
page- Type
- integer
- Description
Page number (default:
1).
- Name
per_page- Type
- integer
- Description
Items per page, max
100(default:50).
List logs
curl "https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000/logs?page=1" \
-H "Authorization: Bearer {api_key}"
Retry a delivery
curl -X POST https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000/logs/550e8400-e29b-41d4-a716-000000000030/retry \
-H "Authorization: Bearer {api_key}"
Log entry
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-000000000030",
"event": "product.updated",
"status_code": 500,
"success": false,
"duration_ms": 3002,
"attempt": 3,
"error_message": "Connection timeout",
"triggered_at": "2026-09-17T10:30:00Z"
}
],
"meta": { "total": 1, "page": 1, "per_page": 50, "total_pages": 1, "has_next": false, "has_previous": false }
}
Retry a delivery
Manually replays a single failed delivery.
Path parameters
- Name
webhook_id- Type
- string
- Description
The webhook UUID.
- Name
log_id- Type
- string
- Description
The delivery log entry ID.
Request
curl -X POST https://api.pixeepim.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000/logs/550e8400-e29b-41d4-a716-000000000030/retry \
-H "Authorization: Bearer {api_key}"
Retry policy
If your endpoint returns a non-2xx status code, Pixee PIM retries delivery with exponential backoff (base 2s, capped at 5 minutes per attempt), up to max_retries (0–10, default 3) configured on the webhook:
| Attempt | Approx. delay |
|---|---|
| 1st retry | ~2 seconds |
| 2nd retry | ~4 seconds |
| 3rd retry | ~8 seconds |
| ... | capped at 5 minutes |
After all retries are exhausted, the delivery is marked as undeliverable. Use the delivery logs endpoint to manually replay failed events.
Inbound connector webhooks
The endpoints above are for outbound webhooks — events Pixee PIM sends to your application. Some e-commerce platforms also push data into Pixee PIM via their own inbound webhook — Shopify, WooCommerce, BigCommerce, and Magento 2. Those are documented on the Connectors page: each is verified with the platform's own HMAC scheme and protected against replay with a 24-hour Redis deduplication window keyed on the platform's delivery ID.