What’s the story, Dublin?
Events API
Upcoming public events in Dublin for the next 30 days, for apps, student projects and community tools.
- Address
https://whatsthestorydublin.ie/api/v1 - AccessFree API key, by email
- Limits60 a minute, 2,000 a day
- UpdatedOnce or twice a day
Quick start
- Get a key. Email hello@whatsthestorydublin.ie with your name, what you’re building and roughly how often you’ll call the API.
- Ask for some events. Send the key in an
Authorizationheader, from your server. Never put it in a website or app, where anyone could copy it.curl -G "https://whatsthestorydublin.ie/api/v1/events" \ -H "Authorization: Bearer YOUR_KEY" \ -d from=2026-11-14 -d to=2026-11-15 \ -d tag=Music,Comedy \ -d limit=5 - Read the reply. Events come in start-time order, one page at a time. Follow
links.nextfor the next page; it’snullon the last one.{ "data": [ { "id": "3dce71a0-…", "title": "Example Gig", "start": "2026-10-24T19:30:00.000Z", "end": "2026-10-24T22:30:00.000Z", "all_day": false, "status": "available", "category": "Music", "tags": ["Music", "Jazz"], "is_free": false, "price": "€15", "venue": { "name": "Example Venue", "area": "City Centre South", … }, "source_url": "https://example-venue.ie/whats-on/example-gig", … } ], "meta": { "total": 214, "limit": 5, "has_more": true, "next_cursor": "eyJ2Ijox…" }, "links": { "next": "https://whatsthestorydublin.ie/api/v1/events?…" }, "attribution": { "text": "Event data from What's the story, Dublin?", … } }
What’s not included: descriptions, pictures and organiser names. Those belong to the organisers, so link each event to its source_url for the full details. Events we only know about from ticketing platforms or other listings sites aren’t included either, because those sites publish under their own terms.
Endpoints
| Request | Returns |
|---|---|
GET /v1/events | Upcoming events, filtered and paged (see Filters). |
GET /v1/events/{id} | One event. 404 means it’s no longer listed. |
GET /v1/tags | Every tag and category in use, with how many events have it. |
GET /v1/areas | Every Dublin area, its slug for the area filter, and its event count. |
Both event endpoints also take fields, to return only what you need.
Filters for /v1/events
Combine any of these. Unknown or repeated parameters are refused with a 400, so a typo can’t quietly return the wrong events.
| Parameter | Example | What it does |
|---|---|---|
from | 2026-10-24 | First Dublin date. Default: today. Multi-day events running that day are included. |
to | 2026-10-26 | Last Dublin date. Default: 30 days ahead. |
q | jazz brunch | Words in the title, venue, area or tags. Every word must match; accents don't matter. |
area | smithfield-stoneybatter | One or more area slugs, comma-separated. See /v1/areas. |
tag | Music,Comedy | One or more tags or categories, comma-separated (any match). See /v1/tags. |
status | available,sold_out | Only these statuses. Default: all. |
free | true | true: only free events. false: only events not marked free. |
online | exclude | include (default), exclude, or only. |
fields | title,start,venue.name | Return only these fields (id is always included). |
limit | 100 | Events per page, 1 to 200. Default: 50. |
cursor | eyJ2Ijox… | Next page. Use meta.next_cursor, or just follow links.next. |
A page link keeps working even if events are added or removed between pages. Keep the same filters when you pass a cursor.
Fields
| Field | Meaning |
|---|---|
id | Stable identifier while the event is listed. |
title | Event name as published. |
start | Start time, UTC (ISO 8601). Events happen in Dublin time. |
end | End time, UTC, or null if the organiser didn't give one. |
all_day | True for open-all-day / drop-in listings: ignore the clock time in start. |
status | available, sold_out, cancelled or postponed. Treat unknown values as available. |
category | Main category, e.g. Music. |
tags | All tags, e.g. ["Music", "Jazz"]. |
is_free | true / false, or null when the page didn't say. |
price | Price as published, e.g. "€15 / €12 concession". |
is_online | true for online-only events. |
is_recurring | true for a regular series (weekly class, monthly quiz). |
venue | Object with the five venue fields below. |
venue.name | Venue name. |
venue.address | Street address. |
venue.area | Dublin area, e.g. "Smithfield / Stoneybatter". |
venue.area_slug | The same area as a value for the area filter. |
venue.postcode | Dublin postcode, e.g. D7. |
source_url | The organiser's or venue's own page. Link here. |
source_domain | Website the event came from. |
listing_url | The event on whatsthestorydublin.ie. |
New fields may appear at any time. Ignore the ones you don’t recognise.
Errors and limits
| Status | Meaning | What to do |
|---|---|---|
304 | Nothing changed since your last request | Keep your copy. To get these, send the ETag from your last reply as If-None-Match. They don’t count towards your daily limit. |
400 | A parameter is wrong or unknown | Read error.message. |
401 | Missing or wrong key | Check the Authorization: Bearer header. |
404 | That event is no longer listed | Delete your copy. |
429 | You hit a limit | Wait the number of seconds in the Retry-After header. |
503 | Temporarily unavailable | Try again in a few minutes. |
Our errors look like {"error": {"code", "message", "request_id"}}. Quote the request_id if you report a problem. 401 and 429 come from our gateway in the standard application/problem+json shape instead.
Limits per key: 60 requests a minute and 2,000 a day.
Using the data well
Suggestions, not rules. The rules are in the terms.
- Refresh once a day, and drop events that disappear. Events leave the feed when they end, are cancelled or are taken down. The data changes once or twice a day, so checking more than hourly gains nothing.
- Send the
ETagback asIf-None-Match. When nothing changed you get an empty304, which doesn’t count towards your daily limit. - Link each event to its
source_url. The organiser’s page has the full details and tickets. - Show the status. Label cancelled, postponed and sold-out events rather than leaving them looking available.
- Ask only for what you need with
fields, and use the largestlimityou can handle to make fewer requests.
Changes
Version 1 only grows: new fields, filters and endpoints, never removals or renames. If we ever have to break something, it will be a new /v2 address, and /v1 will keep running for at least six months after we email key holders.
Terms of use
Last updated 17 October 2026.
These terms apply to anyone using an API key. “The data” means anything the API returns. If you don’t agree, don’t use the API.
You must
- Credit us visibly wherever you show the data, with a link to https://whatsthestorydublin.ie.
- Remove an event within 7 days if we ask you to (for example, because its organiser asked us to take it down).
- Keep your key secret. Use it only from your own server, never in a website, app bundle or public code. Use one key per project, and don’t share it.
- Follow data protection law (including GDPR) for the data you keep. Titles and venues can name real people.
You must not
- Sell, license or pass on the data, or offer it, or anything built mainly from it, as a feed, API or dataset. Showing it to people in your own product is fine.
- Use it to identify, track or profile people, or to contact organisers or performers for marketing.
- Misrepresent events by changing their title, time, place, price or status, or suggest that we or the organisers endorse your product.
- Get around the limits, for example by using several keys for one project.
Our side
- The data comes as is. We work to keep it accurate, but we don’t guarantee it’s complete, correct or always available; organisers change plans. So far as the law allows, we aren’t liable for losses from using it.
- We change the API only as described under Changes. We’ll email key holders at least 30 days before a change to these terms takes effect.
- We may withdraw a key at any time: straight away if these terms are broken, otherwise with notice. If we do, stop using the data.
How we handle the personal data involved, including your key and request logs, is on our privacy page.