Skip to content
Hoody.com

The Notifications and Events APIs expose the platform audit trail and the per-user inbox. The Events endpoints return the immutable record of resource changes (containers, projects, storage shares, billing, and the rest of the resource catalog) for the calling account, while the Notifications endpoints manage the user-facing inbox, including per-user mark-as-read state and unread counts. Use Events for forensic queries, paginated history exports, and account administration. Use Notifications for in-product banners, polling, and dismissal flows.

The Events endpoints expose the platform’s immutable change log. Events are paginated, filterable by event type, resource type, and time range, and support both offset and keyset (after) paging. The retention window is 90 days from admission; cursors that point before the retained window return 410 (see the EVENTS_CURSOR_EXPIRED and EVENTS_HISTORY_RESET codes under GET /api/v1/events).

Query event history with filtering, pagination, and sorting. Maximum 500 events per page.

NameInTypeRequiredDescription
limitqueryintegerNoNumber of events to return. Max 500. Default: 100.
offsetqueryintegerNoNumber of events to skip. Default: 0. Ignored when after is supplied.
sort_byquerystringNoField to sort by. Allowed values: created_at, event_type. Default: "created_at".
sort_orderquerystringNoSort direction. Allowed values: asc, desc. Default: "desc". In cursor mode, only asc is accepted.
event_typequerystringNoFilter by a specific event type from the Events catalog (for example container.running, notification.created, billing.payment.succeeded).
resource_typequerystringNoFilter by resource type. Allowed values: container, storage_share, notification, project, server, firewall, proxy_alias, proxy_permissions, auth_token, pool, activity_log, container_network, project_permission, vault, account, wallet, payment, invoice, payment_method, user_image, reservation, server_offer.
resource_idquerystringNoFilter by a specific resource ID (24-character hexadecimal).
project_idquerystringNoFilter by project ID.
container_idquerystringNoFilter by container ID.
start_datequerystringNoFilter events after this timestamp (ISO 8601).
end_datequerystringNoFilter events before this timestamp (ISO 8601).
realm_idquerystringNoSelects the realm scope in all modes. A realm_id that conflicts with the realm host or lies outside the realms of the token is refused with 403.
afterquerystringNoCursor mode: return events after this cursor, oldest first. Cannot be combined with offset, sort_by, sort_order other than asc, event_type, resource_type, resource_id, project_id, container_id, start_date, or end_date. The cursor is bound to the realm selected by realm_id; a mismatch is refused with 403.
bootstrapquerybooleanNoReturn no events, only the resumable boundary (next_cursor) and latest_cursor for this scope. Cannot be combined with after.
Terminal window
curl -X GET "https://api.hoody.com/api/v1/events?limit=50&event_type=container.running&sort_order=desc" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Events retrieved successfully",
"data": {
"events": [
{
"id": "507f1f77bcf86cd799439044",
"event_type": "container.running",
"resource_type": "container",
"resource_id": "507f1f77bcf86cd799439033",
"user_id": "507f1f77bcf86cd799439011",
"payload": {
"container": {
"id": "507f1f77bcf86cd799439033",
"name": "web-app-1",
"status": "running",
"project_id": "507f1f77bcf86cd799439022"
}
},
"realm_ids": [
"507f1f77bcf86cd799439022"
],
"created_at": "2025-01-15T10:30:05.123Z"
}
],
"pagination": {
"total": 1523,
"limit": 100,
"offset": 0,
"has_more": true
}
}
}
Error CodeTitleDescriptionResolution

Retrieve detailed information about a specific event by its 24-character hexadecimal ID.

NameInTypeRequiredDescription
idpathstringYesEvent ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/events/507f1f77bcf86cd799439044" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Event retrieved successfully",
"data": {
"id": "507f1f77bcf86cd799439044",
"event_type": "container.running",
"resource_type": "container",
"resource_id": "507f1f77bcf86cd799439033",
"user_id": "507f1f77bcf86cd799439011",
"payload": {
"container": {
"id": "507f1f77bcf86cd799439033",
"name": "web-app-1",
"status": "running",
"project_id": "507f1f77bcf86cd799439022"
}
},
"realm_ids": [
"507f1f77bcf86cd799439022"
],
"created_at": "2025-01-15T10:30:05.123Z"
}
}
Error CodeTitleDescriptionResolution

Get aggregated counts of events over an optional time range, broken down by event type and by resource type.

NameInTypeRequiredDescription
start_datequerystringNoStart of the time range (ISO 8601).
end_datequerystringNoEnd of the time range (ISO 8601).
realm_idquerystringNoFilter by realm.
Terminal window
curl -X GET "https://api.hoody.com/api/v1/events/stats?start_date=2025-01-01T00:00:00.000Z&end_date=2025-01-31T23:59:59.000Z" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Event statistics retrieved successfully",
"data": {
"total_events": 15234,
"by_type": {
"container.running": 3456,
"container.stopped": 2134,
"storage.share.created": 1523,
"notification.created": 8121
},
"by_resource": {
"container": 8765,
"storage_share": 2456,
"notification": 4013
},
"oldest_event": "2024-11-15T10:30:00.000Z",
"newest_event": "2025-01-15T10:30:00.000Z"
}
}
Error CodeTitleDescriptionResolution

Delete events older than the supplied retention window. The response distinguishes deleted rows from shared rows that the caller cannot remove because they belong to other realms or accounts.

NameTypeRequiredDescription
retention_daysintegerYesDelete events older than this many days. Allowed range: 1 to 365.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/events/cleanup" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"retention_days": 30
}'
{
"statusCode": 200,
"message": "Old events cleaned up successfully",
"data": {
"deleted_count": 5432,
"retention_days": 30,
"cutoff_date": "2024-12-15T10:30:00.000Z"
}
}
Error CodeTitleDescriptionResolution

Bulk-delete events matching the supplied filters. At least one filter must be provided, or all must be set to confirm the deletion of every event.

NameTypeRequiredDescription
event_typestringNoDelete all events of this type. Allowed values are the entries in the Events catalog.
resource_typestringNoDelete all events for this resource type. Allowed values: container, storage_share, notification, project, server, firewall, proxy_alias, proxy_permissions, auth_token, pool, activity_log, container_network, project_permission, vault, account, wallet, payment, invoice, payment_method, user_image, reservation, server_offer.
resource_idstringNoDelete all events for this resource (24-character hexadecimal).
before_datestringNoDelete events before this date (ISO 8601).
realm_idstringNoDelete events in this realm (24-character hexadecimal).
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/events" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"resource_type": "container",
"before_date": "2024-12-15T00:00:00.000Z"
}'
{
"statusCode": 200,
"message": "Events deleted successfully",
"data": {
"deleted_count": 1523,
"skipped_count": 0
}
}
Error CodeTitleDescriptionResolution

Permanently delete a single event from history.

NameInTypeRequiredDescription
idpathstringYesEvent ID to delete
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/events/507f1f77bcf86cd799439044" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Event deleted successfully",
"data": {
"deleted_count": 1,
"skipped_count": 0
}
}
Error CodeTitleDescriptionResolution

The Notifications endpoints return the per-user inbox. Each item is a self-contained message with a title, a message, a type, a severity, and visibility flags. The authenticated list, summary, and mark-as-read endpoints share one credential rule: API tokens must hold the resources.read_account permission, and the mark-as-read endpoints refuse API tokens entirely. The public list at GET /api/v1/notifications/public is open and needs no credentials.

Paginated list of the notifications visible to the authenticated user (global notifications plus those targeted to them), newest first. Results are paginated; pagination.next_cursor is the preferred way to walk the inbox because offset paging duplicates or skips rows when a new notification arrives mid-read.

NameInTypeRequiredDescription
pagequeryintegerNoPage number for offset paging. Default: 1. Ignored when before is supplied.
limitqueryintegerNoRows per page. Max 100. Default: 20.
unread_onlyquerybooleanNoReturn only notifications the user has not read. Mutually exclusive with read_only. Default: false.
read_onlyquerybooleanNoReturn only notifications the user has read (the archive half of the inbox). pagination.total counts the same filtered set, so it can drive page numbers directly. Mutually exclusive with unread_only; sending both is a 400, not an empty page. Default: false.
beforequerystringNoKeyset cursor from a previous response’s pagination.next_cursor (format <created_at>,<id>). Prefer this over page for an inbox: offset paging duplicates or skips rows when a new notification arrives mid-read.
Terminal window
curl -X GET "https://api.hoody.com/api/v1/notifications/?limit=20&unread_only=true" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Notifications retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439030",
"title": "System Maintenance Notice",
"message": "Scheduled maintenance will occur on January 25th at 2:00 AM UTC.",
"type": "MAINTENANCE",
"severity": "WARNING",
"is_public": true,
"is_global": true,
"expires_at": "2025-01-26T00:00:00.000Z",
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:00:00.000Z",
"is_read": false,
"read_at": null
}
],
"pagination": {
"total": 41,
"page": 1,
"limit": 20,
"totalPages": 3,
"next_cursor": "2025-01-20T10:00:00.000Z,507f1f77bcf86cd799439030"
}
}
Error CodeTitleDescriptionResolution

Return every public notification (those flagged is_public: true) without authentication. Use this as a fallback when an API token cannot read the inbox, or to render a status banner in a context where the user is not yet signed in.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/notifications/public"
{
"statusCode": 200,
"message": "Public notifications retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439030",
"title": "System Maintenance Notice",
"message": "Scheduled maintenance will occur on January 25th at 2:00 AM UTC.",
"type": "MAINTENANCE",
"severity": "WARNING",
"is_public": true,
"is_global": true,
"expires_at": "2025-01-26T00:00:00.000Z",
"created_at": "2025-01-20T10:00:00.000Z",
"updated_at": "2025-01-20T10:00:00.000Z"
}
]
}
Error CodeTitleDescriptionResolution

Lightweight polling endpoint: returns the unread count and the newest notification position without any notification bodies. Use this to detect new notifications; fetch the list only when something changed.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/notifications/summary" \
-H "Authorization: Bearer <token>"
{
"statusCode": 200,
"message": "Notification summary retrieved successfully",
"data": {
"unread_count": 3,
"is_capped": false,
"unread_cap": 100,
"latest_id": "507f1f77bcf86cd799439030",
"latest_created_at": "2025-01-20T10:00:00.000Z",
"poll_interval_seconds": 300
}
}
Error CodeTitleDescriptionResolution

Mark a single notification as read. The HTTP method is PUT; PATCH is also accepted on the same endpoint with identical behavior.

NameInTypeRequiredDescription
idpathstringYesUnique identifier of the notification to mark as read
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/notifications/507f1f77bcf86cd799439030/read" \
-H "Authorization: Bearer <jwt-from-account-login>"
{
"statusCode": 200,
"message": "Notification marked as read",
"data": {
"id": "507f1f77bcf86cd799439150",
"notification_id": "507f1f77bcf86cd799439030",
"is_read": true,
"read_at": "2025-01-21T21:30:00.000Z"
}
}
Error CodeTitleDescriptionResolution

Mark every visible notification as read. The HTTP method is PUT; PATCH is also accepted on the same endpoint with identical behavior.

Terminal window
curl -X PUT "https://api.hoody.com/api/v1/notifications/read-all" \
-H "Authorization: Bearer <jwt-from-account-login>"
{
"statusCode": 200,
"message": "All notifications marked as read",
"data": {
"count": 5
}
}
Error CodeTitleDescriptionResolution