Connector Reference
Each connector section covers the authentication method, required credentials, available data, known limitations, and a TypeScript code example.
Legend
| Symbol | Meaning |
|---|---|
| ✅ | Fully supported |
| ⚠️ | Partial / requires extra access |
| ❌ | Not available |
Using connectors in TypeScript
Install the Spekta connector package (or import directly from your repo):
import { createConnector } from '@/lib/connectors/registry';
const connector = createConnector('eventbrite', {
type: 'oauth2',
accessToken: process.env.EVENTBRITE_ACCESS_TOKEN!,
});
const events = await connector.getEvents({ page: 1, pageSize: 50 });
All connectors share the same interface:
interface BaseConnector {
getEvents(options?: PaginationOptions): Promise<PaginatedResult<UnifiedEvent>>;
getTickets(eventId: string, options?: PaginationOptions): Promise<PaginatedResult<UnifiedTicket>>;
getAttendees(eventId: string, options?: PaginationOptions): Promise<PaginatedResult<UnifiedAttendee>>;
getRevenue(eventId: string): Promise<UnifiedRevenue>;
healthCheck(): Promise<HealthCheckResult>;
}
1. Eventbrite
| Auth | OAuth 2.0 |
| Website | https://www.eventbrite.com |
| API Docs | https://www.eventbrite.com/platform/api |
Required credentials
| Field | Where to find it |
|---|---|
clientId | Account Settings → Developer → Your apps → Client ID |
clientSecret | Account Settings → Developer → Your apps → Client Secret |
accessToken | Returned after the OAuth flow |
refreshToken | Returned after the OAuth flow |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- Webhook-based real-time updates require an Eventbrite-approved webhook endpoint.
- Large organisations with thousands of events may hit the 1 000 events/page API limit; Spekta paginates automatically.
Code example
const connector = createConnector('eventbrite', {
type: 'oauth2',
accessToken: 'EAxxxxxx',
refreshToken: 'RExxxxxx',
clientId: 'your_client_id',
clientSecret: 'your_client_secret',
});
const revenue = await connector.getRevenue('event-id-123');
console.log(revenue.grossRevenue, revenue.currency);
2. Weezevent
| Auth | API key (query parameter) |
| Website | https://www.weezevent.com |
| API Docs | https://api.weezevent.com/doc |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | My account → API → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- Weezevent returns amounts as floating-point EUR values; Spekta passes these through as-is (no minor-unit conversion needed).
Code example
const connector = createConnector('weezevent', {
type: 'api_key',
apiKey: 'wze_live_xxxxxxxx',
});
const attendees = await connector.getAttendees('event-id-456', { page: 1 });
3. TicketTailor
| Auth | API key (HTTP Basic — key as username, empty password) |
| Website | https://www.tickettailor.com |
| API Docs | https://developers.tickettailor.com |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Settings → Integrations → API → Secret key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- TicketTailor returns dates as UNIX timestamps (seconds); Spekta multiplies by 1 000 to produce JS
Dateobjects.
Code example
const connector = createConnector('ticket-tailor', {
type: 'api_key',
apiKey: 'sk_live_xxxxxxxx',
});
const events = await connector.getEvents({ since: new Date('2025-01-01') });
4. DICE
| Auth | API key (Bearer token) |
| Website | https://dice.fm |
| API Docs | https://api.dice.fm/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | DICE Partner Hub → Settings → API credentials |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ❌ | ✅ |
Known limitations
- Attendee-level data is not exposed through the DICE partner API; only aggregate ticket counts are available.
Code example
const connector = createConnector('dice', {
type: 'api_key',
apiKey: 'dice_live_xxxxxxxx',
});
const tickets = await connector.getTickets('event-id-789');
5. Shotgun
| Auth | API key (Bearer token) |
| Website | https://shotgun.live |
| API Docs | https://developers.shotgun.live |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Promoter dashboard → Settings → API |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('shotgun', {
type: 'api_key',
apiKey: 'sg_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('event-abc');
6. See Tickets (UK)
| Auth | API key (X-API-Key header) |
| Website | https://www.seetickets.com |
| API Docs | https://developers.seetickets.com |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Promoter portal → Account → API keys |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('see-tickets', {
type: 'api_key',
apiKey: 'see_live_xxxxxxxx',
});
const events = await connector.getEvents({ pageSize: 100 });
7. Ticketmaster
| Auth | API key (query parameter) |
| Website | https://www.ticketmaster.com |
| API Docs | https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/ |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | developer.ticketmaster.com → My Apps → Consumer Key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ❌ | ❌ | ❌ |
Known limitations
- The Discovery API (public) provides event listings only. Ticket sales, attendees, and revenue data require the Ticketmaster Partner API, which is available only to approved venue and promoter partners. Contact Ticketmaster directly if you need this access.
Code example
const connector = createConnector('ticketmaster', {
type: 'api_key',
apiKey: 'your_consumer_key',
});
const events = await connector.getEvents({ page: 1, pageSize: 100 });
8. AXS
| Auth | OAuth 2.0 |
| Website | https://www.axs.com |
| API Docs | https://api.axs.com/docs |
Required credentials
| Field | Where to find it |
|---|---|
clientId | AXS Developer Portal → My Apps → Client ID |
clientSecret | AXS Developer Portal → My Apps → Client Secret |
accessToken | Returned after OAuth flow |
refreshToken | Returned after OAuth flow |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- AXS requires an approved partner account for API access. Contact
partner@axs.com.
Code example
const connector = createConnector('axs', {
type: 'oauth2',
accessToken: 'axs_at_xxxxxxxx',
refreshToken: 'axs_rt_xxxxxxxx',
clientId: 'axs_client_id',
clientSecret: 'axs_client_secret',
});
const attendees = await connector.getAttendees('axs-event-id');
9. FIXR
| Auth | API key (Bearer token) |
| Website | https://fixr.co |
| API Docs | https://api.fixr.co/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | FIXR Organiser → Settings → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('fixr', {
type: 'api_key',
apiKey: 'fixr_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('fixr-event-id');
10. Billetto
| Auth | API key (Token header) |
| Website | https://billetto.co.uk |
| API Docs | https://api.billetto.co.uk/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Account Settings → API token |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- Revenue is returned in minor units (cents/pence); Spekta divides by 100 automatically.
Code example
const connector = createConnector('billetto', {
type: 'api_key',
apiKey: 'blt_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('billetto-event-id');
// grossRevenue is already in major units (e.g. 1234.50)
11. Eventix
| Auth | OAuth 2.0 |
| Website | https://eventix.io |
| API Docs | https://docs.eventix.io |
Required credentials
| Field | Where to find it |
|---|---|
clientId | Eventix Dashboard → Integrations → OAuth → Client ID |
clientSecret | Eventix Dashboard → Integrations → OAuth → Client Secret |
accessToken | Returned after OAuth flow |
refreshToken | Returned after OAuth flow |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('eventix', {
type: 'oauth2',
accessToken: 'evx_at_xxxxxxxx',
refreshToken: 'evx_rt_xxxxxxxx',
clientId: 'evx_client_id',
clientSecret: 'evx_client_secret',
});
const events = await connector.getEvents();
12. Yurplan
| Auth | API key (Bearer token) |
| Website | https://www.yurplan.com |
| API Docs | https://api.yurplan.com/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Yurplan organiser account → API → Generate key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('yurplan', {
type: 'api_key',
apiKey: 'yur_live_xxxxxxxx',
});
const attendees = await connector.getAttendees('yurplan-event-id');
13. Mapado
| Auth | API key (Bearer token) |
| Website | https://www.mapado.com |
| API Docs | https://developers.mapado.com |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Mapado Partner Portal → Settings → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('mapado', {
type: 'api_key',
apiKey: 'map_live_xxxxxxxx',
});
const events = await connector.getEvents({ pageSize: 50 });
14. HelloAsso
| Auth | OAuth 2.0 |
| Website | https://www.helloasso.com |
| API Docs | https://api.helloasso.com/v5/docs |
Required credentials
| Field | Where to find it |
|---|---|
clientId | HelloAsso → Your organisation → API → Client ID |
clientSecret | HelloAsso → Your organisation → API → Client Secret |
accessToken | Returned after OAuth flow |
refreshToken | Returned after OAuth flow |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- HelloAsso is primarily a non-profit/association platform. Events sold by for-profit entities may not be accessible.
Code example
const connector = createConnector('helloasso', {
type: 'oauth2',
accessToken: 'ha_at_xxxxxxxx',
refreshToken: 'ha_rt_xxxxxxxx',
clientId: 'ha_client_id',
clientSecret: 'ha_client_secret',
});
const revenue = await connector.getRevenue('helloasso-event-id');
15. Festicket
| Auth | API key (Bearer token) |
| Website | https://www.festicket.com |
| API Docs | https://api.festicket.com/api/v1/docs/ |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Festicket Partner Portal → Integrations → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('festicket', {
type: 'api_key',
apiKey: 'fk_live_xxxxxxxx',
});
const tickets = await connector.getTickets('festicket-event-id');
16. Resident Advisor
| Auth | API key (X-Api-Key header) |
| Website | https://ra.co |
| API Docs | https://ra.co/api/v1/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | RA Pro → Settings → API integration → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
- API access requires an RA Pro account. Standard promoter accounts do not have API access.
Code example
const connector = createConnector('resident-advisor', {
type: 'api_key',
apiKey: 'ra_live_xxxxxxxx',
});
const events = await connector.getEvents({ since: new Date('2025-06-01') });
17. Skiddle
| Auth | API key (query parameter) |
| Website | https://www.skiddle.com |
| API Docs | https://www.skiddle.com/api/ |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Skiddle Promoter → Account → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('skiddle', {
type: 'api_key',
apiKey: 'skd_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('skiddle-event-id');
18. Ticket Arena
| Auth | API key (Bearer token) |
| Website | https://www.ticketarena.co.uk |
| API Docs | https://api.ticketarena.co.uk/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Ticket Arena Promoter → Settings → API credentials |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('ticket-arena', {
type: 'api_key',
apiKey: 'ta_live_xxxxxxxx',
});
const attendees = await connector.getAttendees('ta-event-id');
19. TicketSellers
| Auth | API key (Token header) |
| Website | https://www.ticketsellers.co.uk |
| API Docs | https://api.ticketsellers.co.uk/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | TicketSellers account → Integrations → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('ticketsellers', {
type: 'api_key',
apiKey: 'ts_live_xxxxxxxx',
});
const events = await connector.getEvents();
20. SeeTickets US
| Auth | API key (X-API-Key header) |
| Website | https://www.seetickets.us |
| API Docs | https://api.seetickets.us/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | SeeTickets US account → API → Generate key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('seetickets-us', {
type: 'api_key',
apiKey: 'seus_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('seus-event-id');
21. Universe
| Auth | OAuth 2.0 |
| Website | https://www.universe.com |
| API Docs | https://www.universe.com/api-docs |
Required credentials
| Field | Where to find it |
|---|---|
clientId | Universe Developer → Apps → Client ID |
clientSecret | Universe Developer → Apps → Client Secret |
accessToken | Returned after OAuth flow |
refreshToken | Returned after OAuth flow |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('universe', {
type: 'oauth2',
accessToken: 'uni_at_xxxxxxxx',
refreshToken: 'uni_rt_xxxxxxxx',
clientId: 'uni_client_id',
clientSecret: 'uni_client_secret',
});
const events = await connector.getEvents();
22. Accelevents
| Auth | API key (X-API-Key header) |
| Website | https://www.accelevents.com |
| API Docs | https://api.accelevents.com/v1/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Accelevents account → Integrations → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('accelevents', {
type: 'api_key',
apiKey: 'ae_live_xxxxxxxx',
});
const attendees = await connector.getAttendees('ae-event-id');
23. RegFox
| Auth | API key (query parameter) |
| Website | https://www.regfox.com |
| API Docs | https://developer.webconnex.com/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | RegFox / Webconnex account → Integrations → API token |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('regfox', {
type: 'api_key',
apiKey: 'rfx_live_xxxxxxxx',
});
const revenue = await connector.getRevenue('regfox-event-id');
24. RSVPify
| Auth | API key (Bearer token) |
| Website | https://rsvpify.com |
| API Docs | https://api.rsvpify.com/v1/docs |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | RSVPify account → Settings → Integrations → API key |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Code example
const connector = createConnector('rsvpify', {
type: 'api_key',
apiKey: 'rsvp_live_xxxxxxxx',
});
const attendees = await connector.getAttendees('rsvpify-event-id');
25. Pretix
| Auth | API key (Token header) — self-hosted or Pretix-hosted |
| Website | https://pretix.eu |
| API Docs | https://docs.pretix.eu/en/latest/api/index.html |
Required credentials
| Field | Where to find it |
|---|---|
apiKey | Pretix admin → Your account → API access → Create token |
baseUrl | Your Pretix instance URL (e.g. https://pretix.your-domain.com) |
organizer | Your organiser short-form slug (visible in Pretix URLs) |
Data available
| Events | Tickets | Attendees | Revenue |
|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ |
Known limitations
baseUrlis required; Pretix supports self-hosted instances so there is no single API host.- The organiser slug is part of all API paths — incorrect slug → 404 errors.
Code example
const connector = createConnector('pretix', {
type: 'api_key',
apiKey: 'pretix_live_xxxxxxxx',
baseUrl: 'https://pretix.your-domain.com',
organizer: 'your-organizer-slug',
});
const events = await connector.getEvents({ pageSize: 100 });
const revenue = await connector.getRevenue('pretix-event-id');
Provider capability matrix
| Provider | Auth | Events | Tickets | Attendees | Revenue |
|---|---|---|---|---|---|
| Eventbrite | OAuth2 | ✅ | ✅ | ✅ | ✅ |
| Weezevent | API key | ✅ | ✅ | ✅ | ✅ |
| TicketTailor | API key | ✅ | ✅ | ✅ | ✅ |
| DICE | API key | ✅ | ✅ | ❌ | ✅ |
| Shotgun | API key | ✅ | ✅ | ✅ | ✅ |
| See Tickets (UK) | API key | ✅ | ✅ | ✅ | ✅ |
| Ticketmaster | API key | ✅ | ❌ | ❌ | ❌ |
| AXS | OAuth2 | ✅ | ✅ | ✅ | ✅ |
| FIXR | API key | ✅ | ✅ | ✅ | ✅ |
| Billetto | API key | ✅ | ✅ | ✅ | ✅ |
| Eventix | OAuth2 | ✅ | ✅ | ✅ | ✅ |
| Yurplan | API key | ✅ | ✅ | ✅ | ✅ |
| Mapado | API key | ✅ | ✅ | ✅ | ✅ |
| HelloAsso | OAuth2 | ✅ | ✅ | ✅ | ✅ |
| Festicket | API key | ✅ | ✅ | ✅ | ✅ |
| Resident Advisor | API key | ✅ | ✅ | ✅ | ✅ |
| Skiddle | API key | ✅ | ✅ | ✅ | ✅ |
| Ticket Arena | API key | ✅ | ✅ | ✅ | ✅ |
| TicketSellers | API key | ✅ | ✅ | ✅ | ✅ |
| SeeTickets US | API key | ✅ | ✅ | ✅ | ✅ |
| Universe | OAuth2 | ✅ | ✅ | ✅ | ✅ |
| Accelevents | API key | ✅ | ✅ | ✅ | ✅ |
| RegFox | API key | ✅ | ✅ | ✅ | ✅ |
| RSVPify | API key | ✅ | ✅ | ✅ | ✅ |
| Pretix | API key | ✅ | ✅ | ✅ | ✅ |