API Reference
Programmatically manage schedules and events with the Event Schedule REST API. Write operations require a Pro plan. A machine-readable OpenAPI spec is also available.
Authentication
Most API endpoints require authentication via an API key in the X-API-Key header. You can get an API key by:
- Using the Register or Login endpoints (for AI agents)
- Generating one from your account settings (for manual use)
Keep your API key secure and never expose it in client-side code. API keys expire after 1 year. Login generates a new key each time, replacing any existing key.
curl -X GET "https://eventschedule.com/api/schedules" \
-H "X-API-Key: your_api_key_here"
Rate Limits
API requests are rate limited per IP address:
| Operation Type | Limit | HTTP Methods |
|---|---|---|
| Read operations | 300 requests/minute | GET |
| Write operations | 30 requests/minute | POST, PUT, DELETE |
Auth endpoints (register, login) have separate per-endpoint rate limits. When rate limited, the API returns a 429 status code.
{
"error": "Rate limit exceeded"
}
Response Format
Successful responses wrap results in a data property. List endpoints include a meta object with pagination. Error responses use an error property.
{
"data": [...],
"meta": {
"current_page": 1,
"total": 50
}
}
{
"error": "Validation failed",
"errors": {
"name": ["The name field is required."]
}
}
Pagination
List endpoints support pagination through query parameters:
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number to retrieve |
per_page | 100 | Number of items per page (max: 500) |
curl -X GET "https://eventschedule.com/api/events?page=2&per_page=50" \
-H "X-API-Key: your_api_key_here"
Register
Registration is a two-step process: first send a verification code, then register with it.
Step 1: Send Verification Code
/api/register/send-code
No authentication required. Rate limited to 5 codes per email per hour.
Step 2: Register
/api/register
No authentication required. Rate limited to 3 registrations per IP per hour.
| Parameter | Required | Description |
|---|---|---|
name | Yes | Your display name |
email | Yes | Email address |
password | Yes | Password (min 8 characters) |
verification_code | Yes | 6-digit code from Step 1 |
timezone | No | Timezone (default: America/New_York) |
language_code | No | Language code (default: en) |
curl -X POST "https://eventschedule.com/api/register/send-code" \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]"}'
{
"data": {
"api_key": "your_new_api_key",
"api_key_expires_at": "2027-02-28T00:00:00Z",
"user": {
"id": "abc123",
"name": "Your Name",
"email": "[email protected]"
}
}
}
Login
/api/login
No authentication required. Returns a new API key on success.
Login generates a new API key each time, replacing any existing key. Store the key securely and avoid calling login repeatedly. Accounts with two-factor authentication must generate API keys from the web UI.
| Parameter | Required | Description |
|---|---|---|
email | Yes | Email address |
password | Yes | Password |
curl -X POST "https://eventschedule.com/api/login" \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "password": "your_password"}'
{
"data": {
"api_key": "your_new_api_key",
"api_key_expires_at": "2027-02-28T00:00:00Z",
"user": {
"id": "abc123",
"name": "Your Name",
"email": "[email protected]"
}
}
}
List Schedules
/api/schedules
Returns a paginated list of your schedules. Supports filtering:
| Parameter | Description |
|---|---|
name | Filter by schedule name (partial match) |
type | Filter by type: venue, talent, or curator |
curl -X GET "https://eventschedule.com/api/schedules?type=venue" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "abc123",
"subdomain": "my-venue",
"name": "My Venue",
"type": "venue",
"email": "[email protected]",
"timezone": "America/New_York",
...
}
],
"meta": { "current_page": 1, "total": 5 }
}
Show Schedule
/api/schedules/{subdomain}
Returns a single schedule by subdomain, including its sub-schedules. Requires owner or admin access.
curl -X GET "https://eventschedule.com/api/schedules/my-venue" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"id": "abc123",
"subdomain": "my-venue",
"name": "My Venue",
"type": "venue",
"groups": [
{ "id": "def456", "name": "Main Stage", "slug": "main-stage" }
],
...
}
}
Create Schedule
/api/schedules
Create a new schedule. New accounts in hosted mode automatically get a Pro trial.
| Parameter | Required | Description |
|---|---|---|
name | Yes | Schedule name (max 255 characters) |
type | Yes | Schedule type: venue, talent, or curator |
email | No | Contact email |
description | No | Markdown description |
timezone | No | Timezone (e.g., America/New_York) |
language_code | No | Language code (e.g., en, es, fr) |
website | No | Website URL |
address1, city, state, postal_code, country_code | No | Venue address fields (for venue type) |
curl -X POST "https://eventschedule.com/api/schedules" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "My Venue", "type": "venue", "city": "New York"}'
Update Schedule
/api/schedules/{subdomain}
Update a schedule. Only include fields you want to change. Requires Pro plan and owner or admin access. Subdomain cannot be changed via API.
curl -X PUT "https://eventschedule.com/api/schedules/my-venue" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "Updated Name", "description": "New description"}'
Delete Schedule
/api/schedules/{subdomain}
Permanently delete a schedule and all associated data. Requires schedule owner access (not just admin).
curl -X DELETE "https://eventschedule.com/api/schedules/my-venue" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"message": "Schedule deleted successfully"
}
}
List Sub-Schedules
/api/schedules/{subdomain}/groups
List all sub-schedules for a schedule. Returns id, name, slug, and color for each.
curl -X GET "https://eventschedule.com/api/schedules/my-venue/groups" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "def456",
"name": "Main Stage",
"slug": "main-stage",
"color": "#FF5733"
}
]
}
Create Sub-Schedule
/api/schedules/{subdomain}/groups
Create a sub-schedule within a schedule. Requires Pro plan. Slug is auto-generated from the name. Names are auto-translated if the schedule language is not English.
| Parameter | Required | Description |
|---|---|---|
name | Yes | Sub-schedule name |
color | No | Display color (e.g., #FF5733) |
curl -X POST "https://eventschedule.com/api/schedules/my-venue/groups" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "Main Stage", "color": "#FF5733"}'
{
"data": {
"id": "def456",
"name": "Main Stage",
"slug": "main-stage",
"color": "#FF5733"
}
}
Update Sub-Schedule
/api/schedules/{subdomain}/groups/{group_id}
Update a sub-schedule's name or color. Requires Pro plan.
curl -X PUT "https://eventschedule.com/api/schedules/my-venue/groups/def456" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "VIP Stage", "color": "#3B82F6"}'
Delete Sub-Schedule
/api/schedules/{subdomain}/groups/{group_id}
Delete a sub-schedule. Events assigned to this sub-schedule will have their sub-schedule reference cleared. Requires Pro plan.
curl -X DELETE "https://eventschedule.com/api/schedules/my-venue/groups/def456" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"message": "Sub-schedule deleted successfully"
}
}
List Events
/api/events
Returns a paginated list of your events, sorted by start date (newest first). Supports filtering:
| Parameter | Description |
|---|---|
subdomain | Filter events by schedule subdomain |
starts_after | Events starting after this date (Y-m-d) |
starts_before | Events starting before this date (Y-m-d) |
venue_id | Filter by venue (encoded venue schedule ID) |
category_id | Filter by category ID |
name | Filter by event name (partial match) |
schedule_type | Filter by type: single or recurring |
tickets_enabled | Filter by whether tickets are enabled (boolean) |
rsvp_enabled | Filter by whether RSVP/registration is enabled (boolean) |
group_id | Filter by sub-schedule (encoded sub-schedule ID) |
curl -X GET "https://eventschedule.com/api/events?subdomain=my-venue&starts_after=2025-01-01" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "evt123",
"name": "Jazz Night",
"starts_at": "2025-03-15 20:00:00",
"duration": 3,
"tickets_enabled": true,
"rsvp_enabled": false,
...
}
],
"meta": { "current_page": 1, "total": 25 }
}
Show Event
/api/events/{id}
Returns a single event by encoded ID, including tickets, members, and agenda parts.
curl -X GET "https://eventschedule.com/api/events/evt123" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"id": "evt123",
"name": "Jazz Night",
"starts_at": "2025-03-15 20:00:00",
"duration": 3,
"tickets": [
{ "id": "tkt1", "type": "General", "price": 25, "quantity": 100 }
],
"event_parts": [
{ "name": "Opening Act", "start_time": "20:00" }
],
...
}
}
Create Event
/api/events/{subdomain}
Create a new event on a schedule. Requires Pro plan and owner or admin access.
| Parameter | Required | Description |
|---|---|---|
name | Yes | Event name |
starts_at | Yes | Start date/time in your timezone (Y-m-d H:i:s) |
duration | No | Duration in hours (0 to 24) |
description | No | Full description (Markdown supported, max 10000 characters) |
short_description | No | Short description (max 500 characters) |
event_url | No | Event or livestream URL |
registration_url | No | External registration URL |
event_password | No | Password to protect the event page |
is_private | No | Make event private (hidden from calendar) |
rsvp_enabled | No | Enable free RSVP/registration (boolean) |
rsvp_limit | No | Maximum number of registrations (integer, min 1) |
category_id | No | Category ID (see List Categories) |
category | No | Category name (alternative to category_id) |
schedule | No | Sub-schedule slug to assign the event to |
schedule_type | No | single or recurring |
recurring_frequency | No | For recurring: daily, weekly, every_n_weeks, monthly_date, monthly_weekday, yearly |
recurring_interval | No | Week interval for every_n_weeks frequency (min 2) |
recurring_end_type | No | How recurrence ends: never, on_date, or after_events |
recurring_end_value | No | End date (Y-m-d) or count, based on recurring_end_type |
tickets_enabled | No | Enable ticketing (boolean) |
ticket_currency_code | No | 3-letter ISO currency code (e.g., USD) |
payment_method | No | Payment method: stripe, invoiceninja, payment_url, or manual |
payment_instructions | No | Payment instructions (max 5000 characters) |
tickets | No | Array of ticket types: [{type, quantity, price, description}] |
event_parts | No | Agenda parts: [{name, description, start_time, end_time}] |
members | No | Array of performers: [{name, email}] |
venue_id | No | Encoded venue schedule ID |
venue_name | No | Venue name (with venue_address1 for auto-matching) |
venue_address1 | No | Venue address (with venue_name for auto-matching) |
curl -X POST "https://eventschedule.com/api/events/my-venue" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Jazz Night",
"starts_at": "2026-08-08 20:00:00",
"duration": 3,
"description": "A wonderful evening of jazz music.",
"tickets_enabled": true,
"tickets": [
{"type": "General Admission", "price": 25, "quantity": 100},
{"type": "VIP", "price": 50, "quantity": 20}
],
"event_parts": [
{"name": "Opening Act", "start_time": "20:00", "end_time": "20:45"},
{"name": "Main Performance", "start_time": "21:00", "end_time": "23:00"}
]
}'
Update Event
/api/events/{id}
Update an event. Accepts the same parameters as Create Event. Supports partial updates - only include the fields you want to change. Recurring configuration, tickets, and agenda parts are preserved when not included in the request. Requires Pro plan.
curl -X PUT "https://eventschedule.com/api/events/evt123" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "Updated Jazz Night", "duration": 4}'
Delete Event
/api/events/{id}
Permanently delete an event. This also removes it from Google Calendar and CalDAV if synced.
curl -X DELETE "https://eventschedule.com/api/events/evt123" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"message": "Event deleted successfully"
}
}
Upload Flyer
/api/events/flyer/{event_id}
Upload a flyer image for an event. Send as multipart form data with a flyer_image field.
curl -X POST "https://eventschedule.com/api/events/flyer/evt123" \
-H "X-API-Key: your_api_key_here" \
-F "flyer_image=@/path/to/flyer.jpg"
{
"data": { ... },
"meta": {
"message": "Flyer uploaded successfully"
}
}
List Categories
/api/categories
Returns all available event categories with their IDs and names. Use the id when creating or updating events.
curl -X GET "https://eventschedule.com/api/categories" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{"id": 1, "name": "Art & Culture"},
{"id": 2, "name": "Business Networking"},
{"id": 3, "name": "Community"},
{"id": 4, "name": "Concerts"},
...
]
}
List Sales
/api/sales
Returns a paginated list of sales for events you own or administer. Supports filtering:
| Parameter | Description |
|---|---|
event_id | Filter by event (encoded event ID) |
subdomain | Filter by schedule subdomain |
status | Filter by status: unpaid, paid, cancelled, refunded, or expired |
email | Filter by buyer email (exact match) |
event_date | Filter by event date (Y-m-d) |
curl -X GET "https://eventschedule.com/api/sales?status=paid&subdomain=my-venue" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "sale123",
"event_name": "Jazz Night",
"name": "John Doe",
"email": "[email protected]",
"status": "paid",
"payment_amount": 50,
"tickets": [
{ "type": "General", "quantity": 2, "price": 25 }
],
...
}
],
"meta": { "current_page": 1, "total": 12 }
}
Show Sale
/api/sales/{id}
Returns a single sale by encoded ID, including ticket details.
curl -X GET "https://eventschedule.com/api/sales/sale123" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"id": "sale123",
"event_id": "evt123",
"event_name": "Jazz Night",
"name": "John Doe",
"email": "[email protected]",
"status": "paid",
"payment_amount": 50,
"total_quantity": 2,
"tickets": [
{ "type": "General", "quantity": 2, "price": 25 }
]
}
}
Create Sale
/api/sales
Create a new sale manually for an event. Sales are created as unpaid (free tickets are auto-marked as paid).
| Parameter | Required | Description |
|---|---|---|
event_id | Yes | Encoded event ID |
name | Yes | Customer name |
email | Yes | Customer email |
tickets | Yes | Object mapping ticket identifiers to quantities. Keys can be encoded ticket IDs or ticket type names. |
event_date | No | Event date in Y-m-d format (default: event start date) |
curl -X POST "https://eventschedule.com/api/sales" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"event_id": "evt123",
"name": "John Doe",
"email": "[email protected]",
"tickets": {"General Admission": 2}
}'
Update Sale Status
/api/sales/{id}
Perform a status action on a sale. Available actions depend on the current status.
| Action | From Status | To Status |
|---|---|---|
mark_paid | unpaid | paid |
refund | paid | refunded |
cancel | unpaid, paid | cancelled |
curl -X PUT "https://eventschedule.com/api/sales/sale123" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"action": "mark_paid"}'
Delete Sale
/api/sales/{id}
Soft-delete a sale. The sale will no longer appear in listings.
curl -X DELETE "https://eventschedule.com/api/sales/sale123" \
-H "X-API-Key: your_api_key_here"
{
"data": {
"message": "Sale deleted successfully"
}
}
List Feedback
/api/feedback
Returns a paginated list of post-event feedback (star ratings and comments) for events on schedules you own or administer. Requires a Pro plan. Supports filtering:
| Parameter | Description |
|---|---|
event_id | Filter by event (encoded event ID) |
subdomain | Filter by schedule subdomain |
event_date | Filter by event date (Y-m-d) |
min_rating | Only return ratings of at least this value (1-5) |
from | Only feedback submitted on or after this date (Y-m-d) |
to | Only feedback submitted on or before this date (Y-m-d) |
curl -X GET "https://eventschedule.com/api/feedback?min_rating=4&subdomain=my-venue" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "fb123",
"event_id": "ev456",
"event_name": "Jazz Night",
"event_date": "2026-07-10",
"rating": 5,
"comment": "Best night out all year",
"attendee_name": "Alex Attendee",
"attendee_email": "[email protected]",
"created_at": "2026-07-11T09:12:00+00:00"
}
],
"meta": { "current_page": 1, "total": 8 }
}
List Fan Content
/api/fan-content
Returns fan comments, photos and videos submitted on your events, newest first. Approved items only by default, which is what you want when displaying them on an external site. Submitter email addresses are never included.
Each kind of submission has its own id sequence, so an id is only unique within a type. Key on the two together when storing rows from this feed.
| Parameter | Description |
|---|---|
type | Limit to one kind: comment, photo, or video |
event_id | Filter by event (encoded event ID) |
subdomain | Filter by schedule subdomain |
event_date | Filter by event date (Y-m-d) |
is_approved | Defaults to true. Pass 0 to read the pending moderation queue instead |
curl -X GET "https://eventschedule.com/api/fan-content?type=photo&subdomain=my-venue" \
-H "X-API-Key: your_api_key_here"
{
"data": [
{
"id": "ph123",
"type": "photo",
"event_id": "ev456",
"event_name": "Jazz Night",
"event_date": "2026-07-10",
"submitted_by": "Dana Guest",
"is_guest_submission": true,
"is_approved": true,
"photo_url": "https://.../crowd.jpg",
"created_at": "2026-07-11T09:12:00+00:00"
}
],
"meta": { "current_page": 1, "total": 24 }
}
Error Handling
The API uses standard HTTP status codes and returns error messages in JSON format.
| Code | Description |
|---|---|
| 200 | Success |
| 201 | Created |
| 401 | Unauthorized (invalid or missing API key) |
| 403 | Forbidden (insufficient permissions or Pro required) |
| 404 | Not found |
| 422 | Validation error (includes field-level errors) |
| 429 | Rate limit exceeded |
| 500 | Server error |
{
"error": "Validation failed",
"errors": {
"name": ["The name field is required."],
"starts_at": ["The starts at must match the format Y-m-d H:i:s."]
}
}
See Also
- OpenAPI Specification - Machine-readable API spec for AI agents and code generators
- Account Settings - Enable API and manage your API key
- Creating Events - Understand event fields and details
- Selling Tickets - Understand tickets and sales