Introduction
API documentation for Let's Calendar application
This documentation aims to provide all the information you need to work with our API.
Authenticating requests
To authenticate requests, include an Authorization
header with the value "Bearer access_token"
.
All authenticated endpoints are marked with a requires authentication
badge in the documentation below.
You can obtain an API access_token by using the /api/lc/access_token endpoint with your API client key and secret key.
Authentication
Generate Access Token
This endpoint allows you to obtain an access token by providing your API client key and secret key. Use this token with the 'Bearer' prefix in the Authorization header for all subsequent API requests.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"client_key\": \"lc_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6\",
\"secret_key\": \"abcdef1234567890abcdef1234567890abcde\"
}"
Example response (200, Success):
{
"status": "success",
"message": "Authentication successful",
"access_token": "1|a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0",
"token_type": "Bearer",
"expires_in": 172800
}
Example response (400, Validation Error):
{
"client_key": [
"Valid Client Key is required"
]
}
Example response (401, Invalid Credentials):
{
"error": "Unauthorized"
}
Example response (401, Expired Secret):
{
"error": "API key secret has expired"
}
Example response (401, Inactive API Key):
{
"error": "API key is inactive"
}
Example response (404, User Not Found):
{
"error": "User not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
APIs
Get the list of timezones
This endpoint returns a list of available timezones.
Example request:
curl --request GET \
--get "https://panel.letscalendar.com/api/lc/timezone-list" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
Example response (200):
{
"timezones": [
"America/New_York",
"Europe/London",
...
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a new campaign
requires authentication
This endpoint allows you to create a new campaign.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/create-campaign" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Spring Marketing Webinar\",
\"subject\": \"Join our Spring Marketing Webinar\",
\"event_type\": \"online for Webinar, offline for Webinar with common login URL, physical for Physical\\/In-Person Event\",
\"sender_email_id\": 123,
\"start_date\": \"2023-05-15\",
\"start_time\": \"14:00\",
\"end_date\": \"2023-05-15\",
\"end_time\": \"15:00\",
\"timezone\": \"America\\/New_York\",
\"description\": \"Learn about our new products\",
\"email_content\": \"<p>Join us for an exciting webinar!<\\/p>\",
\"location\": \"New York Convention Center\",
\"login_url\": \"https:\\/\\/mycompany.zoom.us\\/j\\/123456\"
}"
Example response (201):
{
"message": "Campaign created successfully",
"campaign": {
"id": "camp_abcdef123456",
"title": "Spring Marketing Webinar",
"start_datetime": "2023-05-15 14:00:00",
"end_datetime": "2023-05-15 15:00:00",
"timezone": "America/New_York"
}
}
Example response (400):
{
"error": {
"title": [
"The title field is required."
],
"sender_email_id": [
"The selected sender email id is invalid."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List campaigns
requires authentication
This endpoint returns a list of all active campaigns for the authenticated user's organization. You can optionally search for campaigns by title, keyword in description, campaign_id.
Example request:
curl --request GET \
--get "https://panel.letscalendar.com/api/lc/campaigns?page=1" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
Example response (200):
{
"campaigns": {
"current_page": 1,
"data": [
{
"campaign_id": "Q2Q4g1rr333lcxZXkzW4",
"title": "APIs Campaign",
"subject": "APIs Campaign",
"start_datetime": "2026-04-23 13:00:00",
"end_datetime": "2026-04-23 14:00:00",
"timezone": "Asia/Kolkata",
"created_on": "2025-04-24 10:47:22"
},
{
"campaign_id": "oiecUCUxawMzDeEAv4EW",
"title": "G to A New Normal Email Body With SURL",
"subject": "G to A New Normal Email Body With SURL",
"start_datetime": "2025-07-21 17:00:00",
"end_datetime": "2025-07-21 18:00:00",
"timezone": "Europe/London",
"created_on": "2025-04-14 15:34:52"
},
...
],
"first_page_url": "https://panel.letscalendar.com/api/lc/campaigns?page=1",
"from": 1,
"last_page": 20,
"last_page_url": "https://panel.letscalendar.com/api/lc/campaigns?page=3",
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://panel.letscalendar.com/api/lc/campaigns?page=1",
"label": "1",
"active": true
},
{
"url": "https://panel.letscalendar.com/api/lc/campaigns?page=2",
"label": "2",
"active": false
},
{
"url": "https://panel.letscalendar.com/api/lc/campaigns?page=3",
"label": "3",
"active": false
},
{
"url": "https://panel.letscalendar.com/api/lc/campaigns?page=2",
"label": "Next »",
"active": false
}
],
"next_page_url": "https://panel.letscalendar.com/api/lc/campaigns?page=2",
"path": "https://panel.letscalendar.com/api/lc/campaigns",
"per_page": 15,
"prev_page_url": null,
"to": 15,
"total": 39
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Toggle campaign automation status
requires authentication
This endpoint allows you to enable or disable the automation for sending invites for a campaign. When enabled, invites will be sent automatically every hour to new attendees.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/toggle-automation" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"architecto\",
\"enabled\": false
}"
Example response (200):
{
"message": "Automation enabled successfully",
"status": "enabled"
}
Example response (200):
{
"message": "Automation disabled successfully",
"status": "disabled"
}
Example response (400):
{
"error": {
"campaign_id": [
"The campaign_id field is required."
],
"enabled": [
"The enabled field is required."
]
}
}
Example response (404):
{
"error": "Campaign not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Add Single Contact to Campaign
requires authentication
This endpoint allows you to add one contact at a time to a campaign. When adding a single contact, provide contact details directly in the request.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/add-single-contact" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\",
\"firstname\": \"John\",
\"lastname\": \"Doe\",
\"email\": \"[email protected]\",
\"loginurl\": \"https:\\/\\/example.com\\/login\",
\"username\": \"johndoe\",
\"password\": \"Password123\"
}"
Example response (200):
{
"message": "Contact added successfully",
"contact_id": 123
}
Example response (400):
{
"error": {
"campaign_id": [
"The campaign_id field is required."
]
}
}
Example response (400):
{
"error": "The email address format is invalid"
}
Example response (404):
{
"error": "Campaign not found"
}
Example response (500):
{
"error": "An error occurred while processing your request"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Add Multiple Contacts to Campaign
requires authentication
This endpoint allows you to add one or multiple contacts to a campaign. Provide an array of contacts in the 'contacts' field.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/add-contacts" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\",
\"contacts\": [
[
\"firstname\": \"John\",
\"lastname\": \"Doe\",
\"email\": \"[email protected]\",
\"loginurl\": \"https:\\/\\/example.com\\/login\",
\"username\": \"johndoe\",
\"password\": \"Password123\"
],
[
\"firstname\": \"Jane\",
\"lastname\": \"Smith\",
\"email\": \"[email protected]\",
],
[
\"firstname\": \"\",
\"email\": \"peterj@example\",
]
]
}"
Example response (200):
{
"message": "2 contacts added successfully",
"valid_count": 2,
"invalid_count": 1,
"duplicate_count": 0,
"invalid_contacts": [
{
"index": 2,
"data": {
"firstname": "Invalid",
"email": "invalid-email"
},
"errors": [
"The email address format is invalid"
]
}
],
"duplicate_emails": []
}
Example response (400):
{
"error": {
"campaign_id": [
"The campaign_id field is required."
]
}
}
Example response (400):
{
"error": "The email address format is invalid"
}
Example response (404):
{
"error": "Campaign not found"
}
Example response (500):
{
"error": "An error occurred while processing your request"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Upload contacts in bulk from CSV or Excel file
requires authentication
This endpoint allows you to upload multiple contacts from a CSV or Excel file. The uploaded file should have the format: firstname, lastname, email, loginurl, username, password
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/upload-contacts" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: multipart/form-data" \
--header "Accept: application/json" \
--form "campaign_id=camp_12345"\
--form "allow_duplicates="\
--form "file=@/private/var/folders/rp/qbf3s5317c76m1zzs6tlk3z40000gn/T/php1cjtDQ"
Example response (200):
{
"message": "File upload received. Contacts are being imported in the background.",
"import_id": "org123abc456"
}
Example response (400):
{
"error": {
"campaign_id": [
"The campaign id field is required."
],
"file": [
"The file field is required."
]
}
}
Example response (400):
{
"error": "File must be a CSV or Excel document (xlsx, xls, csv)"
}
Example response (404):
{
"error": "Campaign not found"
}
Example response (500):
{
"error": "An error occurred while processing your request"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Send calendar invites to attendees
requires authentication
This endpoint allows you to send calendar invites to attendees for a specific campaign. You can send to all attendees or specific attendees by providing their IDs.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/send-invite" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\"
}"
Example response (200):
{
"message": "Invites sending initiated. You will get email once it is completed"
}
Example response (400):
{
"error": "No New Attendees to Send Calendar Invite"
}
Example response (404):
{
"error": "Campaign not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update and send calendar invites
requires authentication
This endpoint allows you to mark invites for update and send them. You can update and send to all attendees or specific attendees by providing their IDs.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/update-invite" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\"
}"
Example response (200):
{
"message": "Invites sending initiated. You will get email once it is completed"
}
Example response (400):
{
"error": "No attendees to update"
}
Example response (404):
{
"error": "Campaign not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Schedule calendar invites to be sent later
requires authentication
This endpoint allows you to schedule calendar invites to be sent at a later time.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/schedule-invite" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\",
\"schedule_date\": \"2025-05-01\",
\"schedule_time\": \"19:00\",
\"timezone\": \"America\\/Hermosillo\"
}"
Example response (200):
{
"message": "Invites scheduled successfully",
"schedule_id": 123,
"scheduled_time": "2025-04-30 16:00:00",
"timezone": "America/Hermosillo"
}
Example response (400):
{
"error": "Invalid schedule time. Schedule time must be in the future."
}
Example response (404):
{
"error": "Campaign not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cancel scheduled invites
requires authentication
This endpoint allows you to cancel previously scheduled invites.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/cancel-scheduled-invite" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\"
}"
Example response (200):
{
"message": "Scheduled invites cancelled successfully"
}
Example response (404):
{
"error": "No scheduled invites found for this campaign"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Stop a campaign that is currently sending invites
requires authentication
This endpoint allows you to immediately stop a campaign that is currently in the process of sending invites.
Example request:
curl --request POST \
"https://panel.letscalendar.com/api/lc/stop-campaign" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"campaign_id\": \"camp_12345\"
}"
Example response (200):
{
"message": "Campaign sending stopped successfully"
}
Example response (400):
{
"error": "Failed to stop campaign. No sending in progress"
}
Example response (404):
{
"error": "Campaign not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fetch senders
requires authentication
This endpoint returns a list of all available senders with provider names for the authenticated user's organization.
Example request:
curl --request GET \
--get "https://panel.letscalendar.com/api/lc/sender-emails" \
--header "Authorization: Bearer access_token" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
Example response (200):
{
"sender_emails": [
{
"id": 123,
"email": "[email protected]",
"name": "Company Marketing",
"reply_to": "[email protected]",
"provider_name": "Google Workspace"
},
{
"id": 124,
"email": "[email protected]",
"name": "Company Events",
"reply_to": "[email protected]",
"provider_name": "Office 365"
}
]
}
Example response (404):
{
"error": "No sender emails found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.