Events

Every change to your projects, listings and reports, in order. Events are kept for 90 days. Read the feed with a cursor to keep your records in sync, or receive the same events as webhooks.

An event's created_at is exact to the second and shows when the change was recorded, within about a minute of the change itself. Listing times inside the event stay rounded down to the hour.

The feed has no gaps: a cursor returns every event recorded after it, in order. Each change sends one event, and a launch sends project.launched once instead of one event per new listing.

List events

GET
/events

Returns every change to your projects, listings and reports, oldest first. Store next_cursor and send it back as cursor to read only what is new; it is never null here. Filter by type or project.

Query Parameters

cursor?string

next_cursor from your last call. Leave it out to start at the oldest event kept (90 days). A cursor older than that returns 410 cursor_expired.

Lengthlength <= 500
type?string

Only events of this type. Use a type such as listing.live, or a group such as listing.*, project.* or report.*.

Lengthlength <= 40
project?string

Only events about this project.

Match^prj_[0-9A-Za-z]{22}$
limit?integer

How many items to return, 1 to 100. Defaults to 20.

Range1 <= value <= 100
Default20

Response Body

The next events, oldest first.

application/json
  1. response

The next events, oldest first.

object*string

Always list.

data*array<>

The events on this page, oldest first.

has_more*boolean

true when more events are ready now; false when you have caught up.

next_cursor*string

Never null. Store it and send it as cursor next time to get only newer events, also after has_more is false.

Lengthlength <= 500
curl "https://api.submitator.com/v1/events" \  -H "Authorization: Bearer $SUBMITATOR_API_KEY"
{  "object": "list",  "data": [    {      "object": "event",      "id": "evt_6Lr3Kx8Wq2Nt7Vb1Rz5MpA",      "type": "listing.action_required",      "created_at": "2026-10-08T09:13:30Z",      "livemode": false,      "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",      "data": {        "object": {          "object": "listing",          "id": "lst_2Tz6Kp9Wm3Qx8Lr5Vb1NcJ",          "livemode": false,          "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",          "directory": {            "id": "dir_3Vb8Qm2Xk6Lt9Wr4Nc1ZpG",            "name": "Uneed",            "domain_rating": 58,            "logo_url": "https://feed.example.net/a/u7Nd3Kc.w5Rb"          },          "status": "action_required",          "reason": null,          "action": {            "code": "install_badge",            "waiting_on": "client",            "client_message": "Please add the directory badges block to https://ledgerly.test. Uneed lists Ledgerly once its badge shows on the site."          },          "live_url": null,          "proof_url": null,          "created_at": "2026-10-04T10:00:00Z",          "submitted_at": null,          "live_at": null        },        "previous_status": "in_progress"      }    },    {      "object": "event",      "id": "evt_6Mz4Kq9Wr3Lt8Vb2Nx6HcE",      "type": "project.action_required",      "created_at": "2026-10-08T09:13:30Z",      "livemode": false,      "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",      "data": {        "object": {          "object": "project",          "id": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",          "livemode": false,          "status": "action_required",          "hold_reason": null,          "action": {            "code": "install_badge",            "waiting_on": "client",            "client_message": "Please add the directory badges block to https://ledgerly.test. 9 directories list Ledgerly once their badges show on the site."          },          "url": "https://ledgerly.test",          "name": "Ledgerly",          "maker_name": "Maya Chen",          "contact_email": "founder@ledgerly.test",          "tagline": "Double-entry bookkeeping for solo founders",          "short_description": "Ledgerly keeps the books for one-person companies: bank sync, invoices and a year-end pack for your accountant.",          "long_description": null,          "category": "saas",          "pricing_model": "freemium",          "price_amount_cents": 1200,          "price_period": "monthly",          "launch_date": null,          "twitter_url": null,          "competitors": [],          "tags": [            "accounting",            "bookkeeping",            "invoicing"          ],          "audience": {            "b2b": false,            "ai": false,            "directory": false          },          "promo_code": null,          "promo_description": null,          "logo": {            "object": "image",            "id": "img_5Mx2Kq8Wt3Lr9Vb7Nz1HdQ",            "status": "ready",            "url": "https://feed.example.net/a/Lq7Wx2Km.r9Tz4",            "error": null          },          "screenshots": [            {              "object": "image",              "id": "img_2Kr9Lx3Wq7Mt5Vb8Nz1HcF",              "status": "ready",              "url": "https://feed.example.net/a/Sv3Nk8Qp.m2Wx7",              "error": null            }          ],          "autofill": {            "status": "complete",            "name_source": "site",            "filled": [              "name",              "tagline",              "short_description"            ],            "image_candidates": [              {                "url": "https://ledgerly.test/apple-touch-icon.png",                "suggested_as": "logo",                "width": 180,                "height": 180              },              {                "url": "https://ledgerly.test/og-image.png",                "suggested_as": "screenshot",                "width": 1200,                "height": 630              }            ]          },          "readiness": {            "ready": true,            "missing": []          },          "domain_rating": 34,          "badge": {            "status": "not_found",            "checked_at": "2026-10-08T09:12:44Z"          },          "auto_replace": true,          "excluded_directories": [],          "allowance": {            "total": 100,            "used": 78,            "reserved": 14,            "available": 8          },          "progress": {            "total": 96,            "pending": 0,            "in_progress": 5,            "action_required": 9,            "submitted": 9,            "live": 69,            "not_accepted": 3,            "cancelled": 1          },          "external_id": "crm_8812",          "metadata": {            "account_owner": "Priya",            "crm_stage": "onboarding"          },          "created_at": "2026-10-03T13:58:12Z",          "updated_at": "2026-10-08T09:13:30Z",          "launched_at": "2026-10-03T14:05:40Z"        },        "previous_status": "in_progress"      }    },    {      "object": "event",      "id": "evt_5Rt8Wq2Lm7Xn3Kb9Vz1PdJ",      "type": "listing.live",      "created_at": "2026-10-08T14:17:01Z",      "livemode": false,      "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",      "data": {        "object": {          "object": "listing",          "id": "lst_7Hk2Qn4Rt9Vx1Bm6Cz3LdK",          "livemode": false,          "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",          "directory": {            "id": "dir_2Lm8Wq3Zk7Rt1Xc5Vb9NdF",            "name": "BetaList",            "domain_rating": 73,            "logo_url": "https://feed.example.net/a/x1Lq7Rt.k9Zm"          },          "status": "live",          "reason": null,          "action": null,          "live_url": "https://betalist.com/startups/ledgerly",          "proof_url": "https://feed.example.net/a/Pf8Kq2Wm.t6Lx9",          "created_at": "2026-10-03T14:00:00Z",          "submitted_at": "2026-10-04T09:00:00Z",          "live_at": "2026-10-08T14:00:00Z"        },        "previous_status": "submitted"      }    }  ],  "has_more": false,  "next_cursor": "cur_Ev7Kq2Wx9Lt3Nb5R"}

Read an event

GET
/events/{event_id}

Returns one event from the last 90 days. A webhook delivery's webhook-id header is the event id, so you can fetch the event to confirm a delivery came from us.

Path Parameters

event_id*string

The event's id, which is also the webhook-id header of its deliveries.

Match^evt_[0-9A-Za-z]{22}$

Response Body

The event.

application/json
  1. response

One change. The type is always <object>.<new status>, and data.previous_status holds the status before it.

typedata.objectdata.previous_status
project.launchedprojectdraft
project.listings_addedprojectnull
project.in_progress, project.action_required, project.on_hold, project.completedprojectthe project's status before
listing.in_progress, listing.action_required, listing.submitted, listing.live, listing.not_accepted, listing.cancelledlistingthe listing's status before
report.ready, report.failedreportbuilding
pingwebhook endpointnull

A listing that returns to pending after a correction sends no event; the next one is listing.in_progress.

object*string

Always event.

id*string

The event's id, and the webhook-id header of its deliveries.

Match^evt_[0-9A-Za-z]{22}$
type*string

What happened. See the table above for what data holds.

Value in"project.launched""project.listings_added""project.in_progress""project.action_required""project.on_hold""project.completed""listing.in_progress""listing.action_required""listing.submitted""listing.live""listing.not_accepted""listing.cancelled""report.ready""report.failed""ping"
created_at*string

When the change was recorded, exact to the second and within about a minute of the change.

Formatdate-time
livemode*boolean

true for live events, false for test events.

project*|

The project the event is about. null for ping.

Match^prj_[0-9A-Za-z]{22}$
data*

The object as it was right after the change.

Typical errors

curl "https://api.submitator.com/v1/events/evt_5Rt8Wq2Lm7Xn3Kb9Vz1PdJ" \  -H "Authorization: Bearer $SUBMITATOR_API_KEY"
{  "object": "event",  "id": "evt_5Rt8Wq2Lm7Xn3Kb9Vz1PdJ",  "type": "listing.live",  "created_at": "2026-10-08T14:17:01Z",  "livemode": false,  "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",  "data": {    "object": {      "object": "listing",      "id": "lst_7Hk2Qn4Rt9Vx1Bm6Cz3LdK",      "livemode": false,      "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",      "directory": {        "id": "dir_2Lm8Wq3Zk7Rt1Xc5Vb9NdF",        "name": "BetaList",        "domain_rating": 73,        "logo_url": "https://feed.example.net/a/x1Lq7Rt.k9Zm"      },      "status": "live",      "reason": null,      "action": null,      "live_url": "https://betalist.com/startups/ledgerly",      "proof_url": "https://feed.example.net/a/Pf8Kq2Wm.t6Lx9",      "created_at": "2026-10-03T14:00:00Z",      "submitted_at": "2026-10-04T09:00:00Z",      "live_at": "2026-10-08T14:00:00Z"    },    "previous_status": "submitted"  }}