API Overview
Build powerful integrations with the ExperienceLocal REST API. Manage experiences, bookings, availability, and more programmatically.
Overview
The ExperienceLocal API provides a comprehensive REST interface for integrating your property management systems, booking platforms, and custom applications with our experience commerce platform. Whether you're syncing availability from your PMS, creating bookings from your mobile app, or building custom analytics dashboards, our API has you covered.
Our API follows REST principles, uses JSON for request/response payloads, and implements standard HTTP response codes and authentication patterns. All endpoints are served over HTTPS with TLS 1.2+ encryption.
Fast & Reliable
99.9% uptime SLA with sub-100ms average response times globally
Secure by Default
API key authentication with scoped permissions and IP restrictions
RESTful Design
Intuitive endpoints following REST best practices and conventions
Well Documented
Comprehensive docs with examples in multiple languages
Getting Started
Follow these steps to start using the ExperienceLocal API in under 5 minutes.
Generate an API KeyGrowth plan or higher
Create an API key from your dashboard settings. You'll need at least a Growth plan to access the API.
Make Your First Request
Test your API key by fetching your organization's experiences.
curl https://api.experiencelocal.io/v1/experiences \
-H "Authorization: Bearer el_live_your_api_key_here" \
-H "Content-Type: application/json"Explore Available Endpoints
Browse our API reference to discover all available endpoints and capabilities.
View API ReferenceAuthentication
The ExperienceLocal API uses API keys for authentication. Include your API key in the Authorization header of every request.
API Key Format
All API keys follow this format:
el_{environment}_{random_string}_{checksum}environment: Eitherliveortestrandom_string: 32-character cryptographically secure stringchecksum: 4-character verification hash
Example Request
// Using fetch
const response = await fetch('https://api.experiencelocal.io/v1/experiences', {
headers: {
'Authorization': 'Bearer el_live_k1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6_x7y8',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);Keep Your API Keys Secret
Never expose your API keys in client-side code, public repositories, or version control. Store them securely in environment variables or secret management systems. If a key is compromised, revoke it immediately from your dashboard.
Base URL
All API requests should be made to the following base URL:
https://api.experiencelocal.io/v1API Versioning
We use URL-based versioning (e.g., /v1/) to ensure backwards compatibility. When we release breaking changes, we'll introduce a new version (e.g., /v2/) and maintain the old version for at least 12 months.
Response Format
All API responses are returned in JSON format with consistent structure.
Success Response
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Sunset Wine Tasting",
"status": "published",
// ... additional fields
},
"meta": {
"timestamp": "2026-01-13T10:30:00Z",
"requestId": "req_abc123"
}
}Paginated Response
{
"success": true,
"data": [
{ "id": "...", "name": "Experience 1" },
{ "id": "...", "name": "Experience 2" }
],
"pagination": {
"page": 1,
"limit": 20,
"total": 45,
"totalPages": 3,
"hasNext": true,
"hasPrev": false
},
"meta": {
"timestamp": "2026-01-13T10:30:00Z",
"requestId": "req_abc123"
}
}Error Handling
The API uses conventional HTTP response codes to indicate success or failure. Error responses include detailed information to help you debug issues.
| Status Code | Meaning | Description |
|---|---|---|
200 | OK | Request succeeded |
201 | Created | Resource created successfully |
400 | Bad Request | Invalid request parameters |
401 | Unauthorized | Invalid or missing API key |
403 | Forbidden | API key lacks required permissions |
404 | Not Found | Resource doesn't exist |
429 | Too Many Requests | Rate limit exceeded |
500 | Internal Server Error | Something went wrong on our end |
Error Response Format
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid experience name",
"details": {
"field": "name",
"constraint": "minLength",
"expected": 3,
"received": 1
}
},
"meta": {
"timestamp": "2026-01-13T10:30:00Z",
"requestId": "req_abc123"
}
}Request ID for Support
Every API response includes a requestId in the metadata. Include this when contacting support to help us quickly identify and resolve issues.
Rate Limits
API rate limits vary by plan tier to ensure fair usage and platform stability.
| Plan | Requests/Month | Burst Limit |
|---|---|---|
| Growth | 5,000 | 10 req/sec |
| Scale | 50,000 | 50 req/sec |
| Enterprise | Unlimited | Custom |
Rate Limit Headers
Every API response includes headers to help you track your rate limit usage:
X-RateLimit-Limit: 50000
X-RateLimit-Remaining: 49850
X-RateLimit-Reset: 1705147200Handling Rate Limits
When you exceed your rate limit, the API returns a 429 Too Many Requestsresponse with a Retry-After header indicating when you can retry.
Implement exponential backoff in your application to gracefully handle rate limits. If you consistently hit rate limits, consider upgrading your plan or contact support for a custom limit.
Webhooks Overview
Webhooks allow you to receive real-time notifications when events occur in your ExperienceLocal account. Instead of polling the API, webhooks push data to your server as events happen.
Common Use Cases
- Send confirmation emails when bookings are created
- Update your PMS when reservations are modified
- Sync availability changes to other platforms
- Trigger custom workflows on payment events
Available Events
booking.createdbooking.updatedbooking.cancelledpayment.succeededavailability.updated- View all events →
SDKs & Libraries
While you can use any HTTP client to interact with our API, we provide official SDKs to make integration even easier.
Python
pip install experiencelocalRuby
gem install experiencelocalUse Any HTTP Client
Our REST API works with any HTTP client library in any programming language. Popular choices include fetch (JavaScript), axios (Node.js),requests (Python), curl (command line), and guzzle (PHP).
Quick Start Example
Here's a complete example showing how to fetch experiences and create a booking using vanilla JavaScript and the Fetch API.
// Initialize API client
const API_KEY = process.env.EXPERIENCELOCAL_API_KEY;
const BASE_URL = 'https://api.experiencelocal.io/v1';
const headers = {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
};
// 1. Fetch all experiences
async function getExperiences() {
const response = await fetch(`${BASE_URL}/experiences`, {
method: 'GET',
headers
});
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
const data = await response.json();
return data.data; // Array of experiences
}
// 2. Check availability for an experience
async function checkAvailability(experienceId, date) {
const response = await fetch(
`${BASE_URL}/experiences/${experienceId}/availability?date=${date}`,
{ method: 'GET', headers }
);
const data = await response.json();
return data.data; // Availability slots
}
// 3. Create a booking
async function createBooking(bookingData) {
const response = await fetch(`${BASE_URL}/bookings`, {
method: 'POST',
headers,
body: JSON.stringify({
experienceId: bookingData.experienceId,
date: bookingData.date,
timeSlot: bookingData.timeSlot,
guests: bookingData.guests,
customerInfo: {
firstName: bookingData.firstName,
lastName: bookingData.lastName,
email: bookingData.email,
phone: bookingData.phone
},
paymentMethodId: bookingData.paymentMethodId
})
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
const data = await response.json();
return data.data; // Created booking
}
// 4. Usage example
async function main() {
try {
// Get all experiences
const experiences = await getExperiences();
console.log(`Found ${experiences.length} experiences`);
// Check availability for first experience
const experienceId = experiences[0].id;
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
const dateStr = tomorrow.toISOString().split('T')[0];
const availability = await checkAvailability(experienceId, dateStr);
console.log(`Available slots:`, availability);
// Create a booking (requires valid payment method)
const booking = await createBooking({
experienceId,
date: dateStr,
timeSlot: availability[0].startTime,
guests: 2,
firstName: 'John',
lastName: 'Doe',
email: 'john@example.com',
phone: '+1234567890',
paymentMethodId: 'pm_xxx' // From Stripe
});
console.log(`Booking created:`, booking.id);
} catch (error) {
console.error('Error:', error.message);
}
}
main();Related Documentation
API Reference
Complete documentation of all available endpoints, parameters, and responses.
Webhooks
Set up real-time event notifications for bookings, payments, and more.
Manage API Keys
Create, rotate, and manage your API keys with scoped permissions.
Authentication
Learn about API key security, scopes, and IP restrictions.
Error Handling
Comprehensive guide to API error codes and troubleshooting.
API Rate Limits
Understand rate limits and upgrade options for higher usage.
Ready to Start Building?
Generate your first API key and start integrating ExperienceLocal into your applications today. No credit card required for testing.
Need help? Email us at api-support@experiencelocal.io