Read report metadata
const url = 'https://secure.ethicsportal.eu/organizations/example/whistleblower/reports/example.json';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/example.json \ --header 'Authorization: Bearer <token>'Read the metadata of one report: status, assignment, acknowledgement and feedback deadlines, and overdue flags. Report content is never returned. A personal token reads only a report its user can open; any other report returns 404. An organisation token reads every report.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Obfuscated organisation ID returned by identity.
Obfuscated report ID; not the reporter access code.
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
Example
{ "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"}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