- One registration operation. Demio accepts both
PUTandPOSTon/event/registerwith identical behaviour. The plugin exposes one operation,registrations.create, sent asPOST. - Filtering events.
events.listtakestype, one ofupcoming,pastorautomated. Omit it to receive every event with its nearest date, ordered by date, ascending. - Identifying the event.
registrations.createtakes eitheridorref_url, the event’s public registration page link. Omitdate_idto put the registrant on the event’s next date, and pass one to choose a date. - Registration is the only write. It adds a person to an event and sends them a join link. Every other operation reads.
- On-demand dates. Inside
events.get, an on-demand date reportsstatus: 'on-demand'withtimestamp,datetimeandzoneall null.events.getDatedescribes the same date asstatus: 'running'with the current time as itstimestamp. - The participant status has two spellings. Filter with
did-not-attendandleft-early; each participant comes back withdid not attendandleft early. Demio itself ignores astatusit does not recognise and returns every registrant, but the plugin only accepts the five hyphenated values and rejects anything else before the request, so a misspelled filter fails validation instead of widening the list. - Rate limits answer 417, not 429. Each endpoint accepts 180 requests a minute, and accounts also carry a daily call allowance. A per-minute limit is retried up to twice: a
Retry-Afterfrom Demio sets the wait, and without one the plugin waits the documented minute, because a shorter delay would retry inside the same window. A spent daily allowance fails immediately, since no retry restores it. - No paging. The events and participants operations return the whole set with no page parameters and no cursor, so a large account receives every record in one answer.
- Registration needs a verified account email. A live registration against an account whose owner has not confirmed their address answers 400
{"errors":["Your email is not verified. Please, verify your email address."]}. Verify the address Demio sent to the account owner before relying onregistrations.create. - A bad event or date id answers 403, not 404. Demio returns
{"errors":["You haven't access to this Event"]}for an id that does not exist, a date that is not on the event, and a report on an unknown date, so a missing resource and a forbidden one look the same. The plugin does not retry either. - An unidentified registration answers 422. Omitting both
idandref_urlgets{"errors":["Not enough params."]}with status 422, which the published specification does not list. The plugin rejects that body before sending, so the 422 only appears if the provider changes. - Webhooks. The plugin does not receive webhooks; the Demio API offers no delivery or registration call.
- 6 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
Check the credential pairWhat’s next
API reference
Every
demio.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.