Home Documentation Pricing
Sign In Get Free API Key →

⚡ Quick Start

Get Indian holiday data in under 60 seconds:

1
Register
Create a free account at calendar.tezzcorp.in/register
2
Verify Email
Enter the 6-digit OTP sent to your inbox
3
Get API Key
Your key is shown once after verification — save it
4
Call the API
Pass your key via X-API-Key header and get data
First API Call
curl "https://calendar.tezzcorp.in/api/v1/holidays?country=IN&year=2026&month=6" \
  -H "X-API-Key: tzc_live_your_key_here"

🔑 Authentication

All calendar endpoints require an API key. Pass it via the X-API-Key HTTP header (recommended) or the ?api_key= query parameter.

Header (Recommended)
X-API-Key: tzc_live_0edc34b7343b256076a24b2cf173efa...
Query Parameter (Fallback)
GET /api/v1/holidays?country=IN&year=2026&api_key=tzc_live_...
⚠️ Never expose your API key in client-side JavaScript or public repositories. Use server-side calls or environment variables.

🌐 Base URL

All API endpoints are served from:

https://calendar.tezzcorp.in

All responses are Content-Type: application/json; charset=UTF-8. All requests and responses use UTF-8 encoding.

📝 Registration Flow

Account creation is a three-step process: Register → Verify OTP → Receive API Key. The API key is shown exactly once in the verify-otp response — store it immediately.

1
POST /api/auth/register
Submit name, email, password → OTP sent to email
2
POST /api/auth/verify-otp
Submit OTP → account activated, API key returned
3
Use X-API-Key header
Pass your key with every calendar API call

📅 GET /api/v1/holidays

Returns Indian holidays filtered by year, month, day, type, or exact date. Supports pagination.

GET https://calendar.tezzcorp.in/api/v1/holidays

Query Parameters

Parameter
Type
Required
Description
country
string
No
ISO 3166-1 alpha-2 code. Default: IN
year
integer
Yes
Calendar year. Range: 2000–2030
month
integer
No
Month number 1–12. Omit for full year.
day
integer
No
Day of month 1–31
date
string
No
Exact date in YYYY-MM-DD format
type
string
No
Filter: national | bank | optional | religious | regional | observance
format
string
No
json (default) or minimal (date+name+type only)
page
integer
No
Page number. Default: 1
per_page
integer
No
Results per page. Default: 50, max: 200

Example Request

June 2026 national holidays
GET /api/v1/holidays?country=IN&year=2026&month=6&type=national
X-API-Key: tzc_live_your_key

Example Response

200 OK
{
  "status": "success",
  "message": "Holidays fetched successfully.",
  "data": [
    {
      "id": 148,
      "country": "IN",
      "year": 2026,
      "month": 6,
      "day": 17,
      "date": "2026-06-17",
      "name": "Eid ul-Adha (Bakrid)",
      "name_hi": null,
      "holiday_type": "national",
      "states": null,
      "description": null,
      "is_public": true,
      "is_gazetted": true,
      "day_of_week": "Wednesday"
    }
  ],
  "meta": {
    "country": "IN",
    "year": 2026,
    "total": 1,
    "page": 1,
    "per_page": 50,
    "total_pages": 1,
    "response_ms": 14
  },
  "timestamp": "2026-06-14T09:00:00+00:00"
}

🗓️ GET /api/v1/calendar

Returns a full monthly calendar grid. Every day includes weekday, is_holiday, is_working flags, and embedded holiday details. Ideal for building calendar UIs.

GET https://calendar.tezzcorp.in/api/v1/calendar

Query Parameters

Parameter
Type
Required
Description
country
string
No
ISO alpha-2. Default: IN
year
integer
Yes
2000–2030
month
integer
Yes
1–12

Example Request & Response

June 2026
GET /api/v1/calendar?country=IN&year=2026&month=6
X-API-Key: tzc_live_your_key

// Response (abbreviated)
{
  "data": {
    "country": "IN", "year": 2026, "month": 6,
    "month_name": "June", "days_in_month": 30,
    "total_holidays": 1, "total_working": 25,
    "days": [
      {
        "date": "2026-06-01", "day": 1,
        "weekday": "Monday", "weekday_num": 1,
        "is_weekend": false, "is_holiday": false,
        "is_working": true, "holidays": []
      },
      {
        "date": "2026-06-17", "day": 17,
        "weekday": "Wednesday", "is_holiday": true,
        "is_working": false,
        "holidays": [{ "name": "Eid ul-Adha (Bakrid)", "type": "national" }]
      }
    ]
  }
}

POST /auth/register

Register a new user account.

POST https://calendar.tezzcorp.in/api//auth/register

Request Body (JSON)

Field
Type
Required
Description
full_name
string
Yes
Min 2 characters
email
string
Yes
Valid email address
password
string
Yes
Min 8 chars, 1 uppercase, 1 number
company_name
string
No
Optional company name
phone
string
No
Optional phone number

POST /auth/verify-otp

Verify email OTP. On register: activates account and returns API key (shown once). On login: returns session token.

POST https://calendar.tezzcorp.in/api//auth/verify-otp

Request Body (JSON)

Field
Type
Required
Description
email
string
Yes
Registered email
otp
string
Yes
6-digit OTP
purpose
string
Yes
register | login | reset_password

POST /auth/login

Authenticate with email and password. Returns JWT session token.

POST https://calendar.tezzcorp.in/api//auth/login

Request Body (JSON)

Field
Type
Required
Description
email
string
Yes
Account email
password
string
Yes
Account password

POST /auth/resend-otp

Resend OTP. Minimum 60 second cooldown between sends.

POST https://calendar.tezzcorp.in/api//auth/resend-otp

Request Body (JSON)

Field
Type
Required
Description
email
string
Yes
Registered email
purpose
string
Yes
register | login | reset_password

POST /auth/reset-password

Request a password reset OTP. Always returns success to prevent email enumeration.

POST https://calendar.tezzcorp.in/api//auth/reset-password

Request Body (JSON)

Field
Type
Required
Description
email
string
Yes
Registered email

⚡ JavaScript / AJAX

Vanilla fetch
const API_KEY = 'tzc_live_your_key_here';
const BASE    = 'https://calendar.tezzcorp.in';

// Get holidays for a specific month
async function getHolidays(year, month, country = 'IN') {
  const url = `${BASE}/api/v1/holidays?country=${country}&year=${year}&month=${month}`;
  const res = await fetch(url, {
    headers: { 'X-API-Key': API_KEY }
  });
  if (!res.ok) throw new Error(`API error: ${res.status}`);
  const json = await res.json();
  return json.data;
}

// Get full calendar grid
async function getCalendar(year, month) {
  const res = await fetch(
    `${BASE}/api/v1/calendar?country=IN&year=${year}&month=${month}`,
    { headers: { 'X-API-Key': API_KEY } }
  );
  return (await res.json()).data;
}

// Usage
getHolidays(2026, 6).then(holidays => {
  holidays.forEach(h => console.log(`${h.date} — ${h.name}`));
});

🐘 PHP

PHP cURL
<?php
$apiKey = 'tzc_live_your_key_here';
$base   = 'https://calendar.tezzcorp.in';

function tzApiGet($path, $apiKey) {
    $ch = curl_init($path);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => ['X-API-Key: ' . $apiKey],
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $res = curl_exec($ch);
    curl_close($ch);
    return json_decode($res, true);
}

// Get June 2026 holidays
$result = tzApiGet(
    $base . '/api/v1/holidays?country=IN&year=2026&month=6',
    $apiKey
);
foreach ($result['data'] as $h) {
    echo $h['date'] . ' — ' . $h['name'] . PHP_EOL;
}

🐍 Python

requests library
import requests

API_KEY = "tzc_live_your_key_here"
BASE    = "https://calendar.tezzcorp.in"
HEADERS = {"X-API-Key": API_KEY}

def get_holidays(year: int, month: int = None, country: str = "IN"):
    params = {"country": country, "year": year}
    if month:
        params["month"] = month
    r = requests.get(f"{BASE}/api/v1/holidays", params=params, headers=HEADERS, timeout=15)
    r.raise_for_status()
    return r.json()["data"]

def get_calendar(year: int, month: int):
    r = requests.get(f"{BASE}/api/v1/calendar",
        params={"country": "IN", "year": year, "month": month},
        headers=HEADERS, timeout=15)
    return r.json()["data"]

# Example
holidays = get_holidays(2026, 6)
for h in holidays:
    print(f"{h['date']} — {h['name']} ({h['holiday_type']})")

💻 cURL

# Get holidays
curl "https://calendar.tezzcorp.in/api/v1/holidays?country=IN&year=2026&month=6" \
  -H "X-API-Key: tzc_live_your_key"

# Get calendar grid
curl "https://calendar.tezzcorp.in/api/v1/calendar?country=IN&year=2026&month=6" \
  -H "X-API-Key: tzc_live_your_key"

# Register
curl -X POST "https://calendar.tezzcorp.in/api/auth/register" \
  -H "Content-Type: application/json" \
  -d '{"full_name":"Rahul","email":"r@example.com","password":"Pass@123"}'

# Verify OTP
curl -X POST "https://calendar.tezzcorp.in/api/auth/verify-otp" \
  -H "Content-Type: application/json" \
  -d '{"email":"r@example.com","otp":"482910","purpose":"register"}'

# Login
curl -X POST "https://calendar.tezzcorp.in/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email":"r@example.com","password":"Pass@123"}'

📦 Response Format

All responses follow a consistent envelope. status is always success or error.

Success Envelope
{
  "status":    "success",
  "message":   "Human-readable message",
  "data":      { /* response payload */ },
  "meta":      { /* pagination / response_ms */ },
  "timestamp": "2026-06-14T09:00:00+00:00"
}
Error Envelope
{
  "status":     "error",
  "message":    "Human-readable error description",
  "code":       422,
  "error_code": "VALIDATION_ERROR",
  "details":    { "email": "Invalid email address" },
  "timestamp":  "2026-06-14T09:00:00+00:00"
}

⚠️ Error Codes

HTTPerror_codeMeaning & Fix
400 OTP_EXPIRED OTP has passed its 10-minute window. Request a new one via /resend-otp.
400 OTP_WRONG Incorrect OTP. Check remaining attempts in the response.
400 INVALID_RESET_TOKEN Password reset token is invalid or expired.
401 MISSING_API_KEY No API key found. Pass X-API-Key header or ?api_key= param.
401 INVALID_API_KEY Key not found in database, revoked, or hashed incorrectly.
401 KEY_EXPIRED API key has passed its expiry date. Generate a new key.
401 UNAUTHORIZED Dashboard endpoint requires a valid Bearer session token.
403 EMAIL_NOT_VERIFIED Account email not confirmed. Complete OTP verification.
403 ACCOUNT_SUSPENDED Account suspended. Contact support@tezzcorp.in.
403 PLAN_RESTRICTION Endpoint or country not available on your current plan.
403 IP_NOT_ALLOWED Request IP not in your allowed IPs whitelist.
404 USER_NOT_FOUND No account exists with this email address.
409 EMAIL_EXISTS Account with this email already exists and is verified.
422 VALIDATION_ERROR Request fields failed validation. See details object.
422 KEY_LIMIT API key limit for your plan reached. Revoke unused keys.
429 RATE_LIMIT_EXCEEDED Too many requests per minute. See Retry-After header.
429 QUOTA_EXCEEDED Daily or monthly request quota exhausted. Upgrade plan.
429 OTP_MAX_ATTEMPTS 5 wrong OTP attempts. Request a new OTP.
429 TOO_SOON Resend OTP requested within 60-second cooldown window.

📊 Rate Limits

Limits are enforced per API key. When exceeded, HTTP 429 is returned with a Retry-After header. Daily quotas reset at 00:00 UTC.

PlanPer MinutePer DayPer Month
Free 51001,000
Starter 201,00030,000
Pro 6010,000300,000
Enterprise 500100,000Unlimited

🏷️ Holiday Types

national

All India public holidays (Republic Day, Independence Day, Gandhi Jayanti)

bank

Bank holidays — banks closed but may not be public holidays

optional

Employees can choose; companies typically allow 2–3 per year

religious

Observance with religious significance (Eid, Diwali, Christmas, Holi)

regional

Specific to certain states only (states field lists which)

observance

Awareness days — not a closed holiday