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.
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.
cursor?stringnext_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.
length <= 500type?stringOnly events of this type. Use a type such as listing.live, or a group such as listing.*, project.* or report.*.
length <= 40project?stringOnly events about this project.
^prj_[0-9A-Za-z]{22}$limit?integerHow many items to return, 1 to 100. Defaults to 20.
1 <= value <= 10020The next events, oldest first.
application/json- response
The next events, oldest first.
object*stringAlways list.
data*array<>The events on this page, oldest first.
has_more*booleantrue when more events are ready now; false when you have caught up.
next_cursor*stringNever null. Store it and send it as cursor next time to get only newer events, also after has_more is false.
length <= 500Typical errors
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"}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.
event_id*stringThe event's id, which is also the webhook-id header of its deliveries.
^evt_[0-9A-Za-z]{22}$The event.
application/json- response
One change. The type is always <object>.<new status>, and data.previous_status holds the status before it.
type | data.object | data.previous_status |
|---|---|---|
project.launched | project | draft |
project.listings_added | project | null |
project.in_progress, project.action_required, project.on_hold, project.completed | project | the project's status before |
listing.in_progress, listing.action_required, listing.submitted, listing.live, listing.not_accepted, listing.cancelled | listing | the listing's status before |
report.ready, report.failed | report | building |
ping | webhook endpoint | null |
A listing that returns to pending after a correction sends no event; the next one is listing.in_progress.
object*stringAlways event.
id*stringThe event's id, and the webhook-id header of its deliveries.
^evt_[0-9A-Za-z]{22}$type*stringWhat happened. See the table above for what data holds.
"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*stringWhen the change was recorded, exact to the second and within about a minute of the change.
date-timelivemode*booleantrue for live events, false for test events.
project*|The project the event is about. null for ping.
^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" }}