mobieusKnow mobieusCore API — Event-type reference History #402
Author
system
Submitted
Jun 19, 2026 9:19pm
Reviewed
Jun 19, 2026 9:19pm
Summary
B6: add listing.reply.created, calendar_event.*, follow.created, reaction.created to the catalog
# Event-type reference
Every event lands in the per-tenant event log and (if matching) gets fanned out to any subscribed webhook endpoint. The catalog grows over time; this page is the canonical list of what fires today.
## Event envelope
```json
{
"id": "evt_01j0wnp3a2…", // ULID-style, sortable
"type": "post.created", // public type (this catalog)
"created_at":"2026-05-29T13:42:11.812Z",
"data": { /* per-type shape */ }
}
```
## Catalog
| Type | Fires when |
|-------------------------------|-----------------------------------------------------------------------------|
| `post.created` | A new thread OP or reply is posted. |
| `post.edited` | A post is edited. |
| `post.deleted` | A post is soft-deleted. |
| `user.joined` | A user completes registration. |
| `user.left` | A user schedules account deletion. |
| `listing.created` | A marketplace listing goes live. *(2026-05-29)* |
| `listing.updated` | A marketplace listing is edited. *(2026-05-29)* |
| `listing.sold` | A listing's final unit sells out. *(2026-05-29)* |
| `listing.withdrawn` | A listing is withdrawn by owner or moderator. *(2026-05-29)* |
| `file.uploaded` | A file upload completes quarantine and is recorded. *(2026-05-29)* |
| `report.created` | A user submits a moderation report. *(2026-05-29)* |
| `report.resolved` | A report is resolved (via UI or `POST /api/v1/reports/{id}/resolve`). |
| `moderation.action_taken` | A moderator acts on a report. The `data.action` field tells you which action: `warn`, `suspend`, `ban`, `shadow_ban`, or `dismiss`. *(2026-05-29)* |
| `moderation.user_banned` | Legacy alias for `moderation.action_taken` with `action="ban"`. Will be deprecated. |
| `moderation.user_shadow_banned` | Legacy alias. Will be deprecated. |
| `moderation.user_suspended` | Legacy alias. Will be deprecated. |
| `moderation.user_warned` | Legacy alias. Will be deprecated. |
| `moderation.content_removed` | A moderator removes flagged content. |
| `moderation.content_flagged` | Content is reported for moderation. |
| `listing.reply.created` | A Q&A reply is posted on a marketplace listing. *(2026-06-19)* |
| `calendar_event.created` | A community calendar event is created. *(2026-06-19)* |
| `calendar_event.deleted` | A community calendar event is deleted. *(2026-06-19)* |
| `calendar_event.rsvp.created` | Someone RSVPs to a community calendar event. *(2026-06-19)* |
| `follow.created` | A member follows another member. *(2026-06-19)* |
| `reaction.created` | A member reacts to a post. *(2026-06-19)* |
| `sla.breached` | A help desk ticket misses its first-response or resolution SLA target. *(2026-06-20)* |
## New event-data shapes (2026-05-29)
### `listing.created`
```json
{
"listing_id": 42, "slug": "atari-2600-light-sixer",
"title": "Atari 2600 Light Sixer", "price_cents": 12500,
"category_id": 7,
"seller": { "id": 312, "username": "retroseller" }
}
```
### `listing.sold`
```json
{ "listing_id": 42, "slug": "atari-2600-light-sixer", "seller_id": 312 }
```
### `file.uploaded`
```json
{
"file_id": 18, "area_slug": "atari-2600-disks",
"title": "Centipede (1981)", "size_bytes": 16384,
"mime": "application/octet-stream",
"uploader": { "id": 312, "username": "retroseller" }
}
```
### `report.created`
```json
{
"report_id": 91, "reporter": { "id": 7 },
"reported_user_id": 312, "reported_post_id": 4501,
"reason_category": "spam", "source_url": "/thread/foo"
}
```
### `moderation.action_taken`
```json
{
"action": "suspend",
"target_user_id": 312, "report_id": 91,
"duration_hours": 168,
"actor": { "id": 9, "username": "mod_alice" }
}
```
### `sla.breached`
```json
{
"ticket_id": 1043, "breach_type": "first_response",
"queue_id": 3, "priority": "high", "status": "open"
}
```
The `breach_type` is `first_response` or `resolution`.
## Filtering
`GET /api/v1/events?type=post.created&since=2026-05-28T00:00:00Z` returns only matching events newest-first. Pass back the `next_cursor` field to walk history.

Event-type reference

Every event lands in the per-tenant event log and (if matching) gets fanned out to any subscribed webhook endpoint. The catalog grows over time; this page is the canonical list of what fires today.

Event envelope

{
  "id":        "evt_01j0wnp3a2…",        // ULID-style, sortable
  "type":      "post.created",            // public type (this catalog)
  "created_at":"2026-05-29T13:42:11.812Z",
  "data":      { /* per-type shape */ }
}

Catalog

Type Fires when
post.created A new thread OP or reply is posted.
post.edited A post is edited.
post.deleted A post is soft-deleted.
user.joined A user completes registration.
user.left A user schedules account deletion.
listing.created A marketplace listing goes live. (2026-05-29)
listing.updated A marketplace listing is edited. (2026-05-29)
listing.sold A listing's final unit sells out. (2026-05-29)
listing.withdrawn A listing is withdrawn by owner or moderator. (2026-05-29)
file.uploaded A file upload completes quarantine and is recorded. (2026-05-29)
report.created A user submits a moderation report. (2026-05-29)
report.resolved A report is resolved (via UI or POST /api/v1/reports/{id}/resolve).
moderation.action_taken A moderator acts on a report. The data.action field tells you which action: warn, suspend, ban, shadow_ban, or dismiss. (2026-05-29)
moderation.user_banned Legacy alias for moderation.action_taken with action="ban". Will be deprecated.
moderation.user_shadow_banned Legacy alias. Will be deprecated.
moderation.user_suspended Legacy alias. Will be deprecated.
moderation.user_warned Legacy alias. Will be deprecated.
moderation.content_removed A moderator removes flagged content.
moderation.content_flagged Content is reported for moderation.
listing.reply.created A Q&A reply is posted on a marketplace listing. (2026-06-19)
calendar_event.created A community calendar event is created. (2026-06-19)
calendar_event.deleted A community calendar event is deleted. (2026-06-19)
calendar_event.rsvp.created Someone RSVPs to a community calendar event. (2026-06-19)
follow.created A member follows another member. (2026-06-19)
reaction.created A member reacts to a post. (2026-06-19)

New event-data shapes (2026-05-29)

listing.created

{
  "listing_id": 42, "slug": "atari-2600-light-sixer",
  "title": "Atari 2600 Light Sixer", "price_cents": 12500,
  "category_id": 7,
  "seller": { "id": 312, "username": "retroseller" }
}

listing.sold

{ "listing_id": 42, "slug": "atari-2600-light-sixer", "seller_id": 312 }

file.uploaded

{
  "file_id": 18, "area_slug": "atari-2600-disks",
  "title": "Centipede (1981)", "size_bytes": 16384,
  "mime": "application/octet-stream",
  "uploader": { "id": 312, "username": "retroseller" }
}

report.created

{
  "report_id": 91, "reporter": { "id": 7 },
  "reported_user_id": 312, "reported_post_id": 4501,
  "reason_category": "spam", "source_url": "/thread/foo"
}

moderation.action_taken

{
  "action": "suspend",
  "target_user_id": 312, "report_id": 91,
  "duration_hours": 168,
  "actor": { "id": 9, "username": "mod_alice" }
}

Filtering

GET /api/v1/events?type=post.created&since=2026-05-28T00:00:00Z returns only matching events newest-first. Pass back the next_cursor field to walk history.

# Event-type reference

Every event lands in the per-tenant event log and (if matching) gets fanned out to any subscribed webhook endpoint. The catalog grows over time; this page is the canonical list of what fires today.

## Event envelope

```json
{
  "id":        "evt_01j0wnp3a2…",        // ULID-style, sortable
  "type":      "post.created",            // public type (this catalog)
  "created_at":"2026-05-29T13:42:11.812Z",
  "data":      { /* per-type shape */ }
}
```

## Catalog

| Type                          | Fires when                                                                 |
|-------------------------------|-----------------------------------------------------------------------------|
| `post.created`                | A new thread OP or reply is posted.                                         |
| `post.edited`                 | A post is edited.                                                           |
| `post.deleted`                | A post is soft-deleted.                                                     |
| `user.joined`                 | A user completes registration.                                              |
| `user.left`                   | A user schedules account deletion.                                          |
| `listing.created`             | A marketplace listing goes live. *(2026-05-29)*                             |
| `listing.updated`             | A marketplace listing is edited. *(2026-05-29)*                             |
| `listing.sold`                | A listing's final unit sells out. *(2026-05-29)*                            |
| `listing.withdrawn`           | A listing is withdrawn by owner or moderator. *(2026-05-29)*                |
| `file.uploaded`               | A file upload completes quarantine and is recorded. *(2026-05-29)*          |
| `report.created`              | A user submits a moderation report. *(2026-05-29)*                          |
| `report.resolved`             | A report is resolved (via UI or `POST /api/v1/reports/{id}/resolve`).       |
| `moderation.action_taken`     | A moderator acts on a report. The `data.action` field tells you which action: `warn`, `suspend`, `ban`, `shadow_ban`, or `dismiss`. *(2026-05-29)* |
| `moderation.user_banned`      | Legacy alias for `moderation.action_taken` with `action="ban"`. Will be deprecated. |
| `moderation.user_shadow_banned` | Legacy alias. Will be deprecated. |
| `moderation.user_suspended`   | Legacy alias. Will be deprecated. |
| `moderation.user_warned`      | Legacy alias. Will be deprecated. |
| `moderation.content_removed`  | A moderator removes flagged content.                                        |
| `moderation.content_flagged`  | Content is reported for moderation.                                         |
| `listing.reply.created`       | A Q&A reply is posted on a marketplace listing. *(2026-06-19)* |
| `calendar_event.created`      | A community calendar event is created. *(2026-06-19)* |
| `calendar_event.deleted`      | A community calendar event is deleted. *(2026-06-19)* |
| `calendar_event.rsvp.created` | Someone RSVPs to a community calendar event. *(2026-06-19)* |
| `follow.created`              | A member follows another member. *(2026-06-19)* |
| `reaction.created`            | A member reacts to a post. *(2026-06-19)* |

## New event-data shapes (2026-05-29)

### `listing.created`
```json
{
  "listing_id": 42, "slug": "atari-2600-light-sixer",
  "title": "Atari 2600 Light Sixer", "price_cents": 12500,
  "category_id": 7,
  "seller": { "id": 312, "username": "retroseller" }
}
```

### `listing.sold`
```json
{ "listing_id": 42, "slug": "atari-2600-light-sixer", "seller_id": 312 }
```

### `file.uploaded`
```json
{
  "file_id": 18, "area_slug": "atari-2600-disks",
  "title": "Centipede (1981)", "size_bytes": 16384,
  "mime": "application/octet-stream",
  "uploader": { "id": 312, "username": "retroseller" }
}
```

### `report.created`
```json
{
  "report_id": 91, "reporter": { "id": 7 },
  "reported_user_id": 312, "reported_post_id": 4501,
  "reason_category": "spam", "source_url": "/thread/foo"
}
```

### `moderation.action_taken`
```json
{
  "action": "suspend",
  "target_user_id": 312, "report_id": 91,
  "duration_hours": 168,
  "actor": { "id": 9, "username": "mod_alice" }
}
```

## Filtering

`GET /api/v1/events?type=post.created&since=2026-05-28T00:00:00Z` returns only matching events newest-first. Pass back the `next_cursor` field to walk history.