List webhook deliveries
const url = 'https://secure.ethicsportal.eu/organizations/example/webhooks/example/deliveries.json?limit=50';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Obfuscated organisation ID returned by identity.
Query Parameters
Section titled “Query Parameters”Follow the Link response header unchanged. Signed cursor expires after one hour.
Header Parameters
Section titled “Header Parameters”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.
Responses
Section titled “Responses”Deliveries.
object
object
Matches the payload id and the X-EthicsPortal-Event-Id header.
Earliest time of the next scheduled attempt for a pending delivery of the current configuration; queue delays can postpone it.
Pass as the cursor parameter for the next page; null on the last page. The Link header carries the same next page.
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}Headers
Section titled “Headers”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
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
Example
{ "error": { "code": "invalid_request", "feedback_url": "https://secure.ethicsportal.eu/me/feedback.json" }}Missing, unknown, expired or revoked token
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
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
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
Example
{ "error": { "code": "insufficient_scope", "feedback_url": "https://secure.ethicsportal.eu/me/feedback.json" }}Organisation or resource missing or inaccessible, or API access suspended
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
Example
{ "error": { "code": "not_found", "feedback_url": "https://secure.ethicsportal.eu/me/feedback.json" }}Rate limited; retry after the Retry-After interval
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
Example
{ "error": { "code": "rate_limited", "feedback_url": "https://secure.ethicsportal.eu/me/feedback.json" }}