MENU navbar-image

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"
}
 

Request   

POST api/lc/access_token

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

client_key   string   

The API client key obtained from your dashboard. Example: lc_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

secret_key   string   

The API secret key that was provided when you created or regenerated the API key. Example: abcdef1234567890abcdef1234567890abcde

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",
    ...
  ]
}
 

Request   

GET api/lc/timezone-list

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

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."
        ]
    }
}
 

Request   

POST api/lc/create-campaign

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

title   string   

The title of the campaign. Example: Spring Marketing Webinar

subject   string   

The email subject line. Example: Join our Spring Marketing Webinar

event_type   string   

Type of event: online, offline, or physical. Example: online for Webinar, offline for Webinar with common login URL, physical for Physical/In-Person Event

sender_email_id   integer   

ID of the sender email to use. Example: 123

start_date   string   

Start date in Y-m-d format. Example: 2023-05-15

start_time   string   

Start time in H:i format. Example: 14:00

end_date   string   

End date in Y-m-d format. Example: 2023-05-15

end_time   string   

End time in H:i format. Example: 15:00

timezone   string   

Timezone for the event. Example: America/New_York

description   string   

Description of the campaign. Example: Learn about our new products

email_content   string   

HTML content for the event details. Example: <p>Join us for an exciting webinar!</p>

location   string  optional  

optional Physical location for the event(Required if event_type=physical). Example: New York Convention Center

login_url   string  optional  

optional Common login URL for offline events(Required if event_type=offline). Example: https://mycompany.zoom.us/j/123456

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": "&laquo; 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 &raquo;",
              "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
     }
  }
 

Request   

GET api/lc/campaigns

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

optional Page number for pagination (default: 1). Example: 1

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"
}
 

Request   

POST api/lc/toggle-automation

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: architecto

enabled   boolean   

Set to true to enable automation, false to disable it Example: false

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"
    }
     

Request   

POST api/lc/add-single-contact

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign. Example: camp_12345

firstname   string   

The first name of the contact. Max length: 150 characters. Example: John

lastname   string  optional  

The last name of the contact. Max length: 150 characters. Example: Doe

email   string   

A valid email address. Max length: 150 characters. Example: [email protected]

loginurl   string  optional  

The login URL for the contact. Example: https://example.com/login

username   string  optional  

The username for the contact. Example: johndoe

password   string  optional  

The password for the contact. Example: Password123

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"
    }
     

Request   

POST api/lc/add-contacts

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign. Example: camp_12345

contacts   string[]  optional  

When adding multiple contacts at once.

firstname   string   

The first name of the contact. Example: Jane

lastname   string  optional  

The last name of the contact. Example: Smith

email   string   

A valid email address. Example: [email protected]

loginurl   string  optional  

The login URL for the contact. Example: https://example.com/login

username   string  optional  

The username for the contact. Example: janesmith

password   string  optional  

The password for the contact. Example: Password456

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"
}
 

Request   

POST api/lc/upload-contacts

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign. Example: camp_12345

file   file   

CSV or Excel file with contact data. The first row should be column headers. Example: /private/var/folders/rp/qbf3s5317c76m1zzs6tlk3z40000gn/T/php1cjtDQ

allow_duplicates   boolean  optional  

Whether to allow duplicate emails (default: false). Example: false

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"
}
 

Request   

POST api/lc/send-invite

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: camp_12345

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"
}
 

Request   

POST api/lc/update-invite

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: camp_12345

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"
}
 

Request   

POST api/lc/schedule-invite

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: camp_12345

schedule_date   string   

The date for scheduling (format: Y-m-d) Example: 2025-05-01

schedule_time   string   

The time for scheduling (format: H:i) Example: 19:00

timezone   string   

The timezone for the schedule Example: America/Hermosillo

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"
}
 

Request   

POST api/lc/cancel-scheduled-invite

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: camp_12345

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"
}
 

Request   

POST api/lc/stop-campaign

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

campaign_id   string   

The unique identifier of the campaign Example: camp_12345

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"
}
 

Request   

GET api/lc/sender-emails

Headers

Authorization      

Example: Bearer access_token

Content-Type      

Example: application/json

Accept      

Example: application/json