List report metadata
const url = 'https://secure.ethicsportal.eu/organizations/example/whistleblower/reports.json?limit=50&status=received';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/whistleblower/reports.json?limit=50&status=received' \ --header 'Authorization: Bearer <token>'List report metadata for one organisation: status, assignment, deadlines and overdue flags. Filter by status or creation date and page with a cursor. A personal token lists only the reports its user can open: every report for administrators and viewers, and for members only the reports assigned to them or in which they participate. An organisation token lists every report.
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.
Exclusive lower receipt-time bound.
Exclusive upper receipt-time bound.
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”Metadata only. Dates describe recorded workflow state, not proof of notification delivery.
object
object
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": "aBcDef", "organization_id": "gHiJkl", "status": "received", "assigned": false, "created_at": "2026-11-07T10:00:00Z", "acknowledged_at": null, "feedback_given_at": null, "closed_at": null, "acknowledgment_due_at": "2026-11-14T10:00:00Z", "feedback_due_at": "2027-02-14T10:00:00Z", "acknowledgment_overdue": false, "feedback_overdue": false, "url": "https://secure.ethicsportal.eu/organizations/gHiJkl/whistleblower/reports/aBcDef.json", "web_url": "https://secure.ethicsportal.eu/organizations/gHiJkl/whistleblower/reports/aBcDef", "audit_trail_url": "https://secure.ethicsportal.eu/organizations/gHiJkl/whistleblower/reports/aBcDef/audit-log.json" } ], "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 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, invalid, expired or revoked bearer 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" }}Headers
Section titled “Headers”Bearer realm=“EthicsPortal”
Required agreement not accepted or permission denied
object
object
Where to tell EthicsPortal what went wrong: POST product feedback here with the same token.
Example
{ "error": { "code": "agreement_required", "feedback_url": "https://secure.ethicsportal.eu/me/feedback.json" }}Missing or inaccessible organisation or resource, or feature disabled
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 limit exceeded
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" }}Headers
Section titled “Headers”60 seconds