Skip to content

List webhook deliveries

GET
/organizations/{organization_id}/webhooks/{webhook_id}/deliveries.json
curl --request GET \
--url 'https://secure.ethicsportal.eu/organizations/example/webhooks/example/deliveries.json?limit=50' \
--header 'Authorization: Bearer <token>'

Deliveries retained for 30 days, oldest first. Receiver response bodies are never stored. A personal token also needs its user to be a current administrator of the organisation.

organization_id
required
string

Obfuscated organisation ID returned by identity.

webhook_id
required
string
limit
integer
default: 50 >= 1 <= 100
cursor
string

Follow the Link response header unchanged. Signed cursor expires after one hour.

If-None-Match
string

The ETag of a response you already hold. If nothing changed, the response is 304 Not Modified with no body. It still counts toward rate limits and, where reads are audited, the audit trail.

Deliveries.

Media typeapplication/json
object
data
required
Array<object>
<= 100 items
object
id
required
string
event_id
required

Matches the payload id and the X-EthicsPortal-Event-Id header.

string
event_type
required
string
Allowed values: report.created report.acknowledged report.feedback_given report.closed report.reopened report.assignment_changed report.due_soon report.overdue webhook.test
status
required
string
Allowed values: pending delivering delivered failed cancelled
attempts
required
integer
response_code
required
integer | null
error_code
required
string | null
Allowed values: connection_failed unsafe_destination
created_at
required
string format: date-time
delivered_at
required
string | null format: date-time
next_attempt_at
required

Earliest time of the next scheduled attempt for a pending delivery of the current configuration; queue delays can postpone it.

string | null format: date-time
next_cursor
required

Pass as the cursor parameter for the next page; null on the last page. The Link header carries the same next page.

string | null

Example

{
"data": [
{
"id": "vWxYza",
"event_id": "bCdEfg",
"event_type": "webhook.test",
"status": "pending",
"attempts": 0,
"response_code": null,
"error_code": null,
"created_at": "2026-11-09T10:05:00Z",
"delivered_at": null,
"next_attempt_at": null
}
],
"next_cursor": null
}
ETag
string

Weak validator of this response body. Send it back as If-None-Match.

Not modified since the ETag sent in If-None-Match. No body.

Invalid query, body or cursor

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: invalid_token forbidden insufficient_scope not_found invalid_request agreement_required rate_limited idempotency_key_reused idempotency_key_in_progress not_retryable channel_inactive invitation_unavailable already_subscribed no_subscription
feedback_url
required

Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.

string format: uri

Example

{
"error": {
"code": "invalid_request",
"feedback_url": "https://secure.ethicsportal.eu/me/feedback.json"
}
}

Missing, unknown, expired or revoked token

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: invalid_token forbidden insufficient_scope not_found invalid_request agreement_required rate_limited idempotency_key_reused idempotency_key_in_progress not_retryable channel_inactive invitation_unavailable already_subscribed no_subscription
feedback_url
required

Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.

string format: uri

Example

{
"error": {
"code": "invalid_token",
"feedback_url": "https://secure.ethicsportal.eu/me/feedback.json"
}
}

The token lacks the required scope (WWW-Authenticate names it), the user’s role does not allow the action, or an agreement must be accepted in the web application

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: invalid_token forbidden insufficient_scope not_found invalid_request agreement_required rate_limited idempotency_key_reused idempotency_key_in_progress not_retryable channel_inactive invitation_unavailable already_subscribed no_subscription
feedback_url
required

Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.

string format: uri

Example

{
"error": {
"code": "insufficient_scope",
"feedback_url": "https://secure.ethicsportal.eu/me/feedback.json"
}
}

Organisation or resource missing or inaccessible, or API access suspended

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: invalid_token forbidden insufficient_scope not_found invalid_request agreement_required rate_limited idempotency_key_reused idempotency_key_in_progress not_retryable channel_inactive invitation_unavailable already_subscribed no_subscription
feedback_url
required

Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.

string format: uri

Example

{
"error": {
"code": "not_found",
"feedback_url": "https://secure.ethicsportal.eu/me/feedback.json"
}
}

Rate limited; retry after the Retry-After interval

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: invalid_token forbidden insufficient_scope not_found invalid_request agreement_required rate_limited idempotency_key_reused idempotency_key_in_progress not_retryable channel_inactive invitation_unavailable already_subscribed no_subscription
feedback_url
required

Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.

string format: uri

Example

{
"error": {
"code": "rate_limited",
"feedback_url": "https://secure.ethicsportal.eu/me/feedback.json"
}
}