Skip to main content

Fake Calendar Events API

MOCK DATA

Generate coherent fake calendar events with bounded durations, attendees, IANA timezones and correct timed or all-day date shapes.

Generated test data for fixtures and development

Base URL
/api/calendar-events
Category
Date & Time
Capabilities
1 route Seedable
Last updated
July 29, 2026

GET /api/calendar-events

Live requestRuns against the public API
No key required
GET/api/calendar-events?count=10&seed=42

Request parameters

Only generate this event status. Omit for a mix.

False produces timed ISO instants; true produces YYYY-MM-DD dates with exclusive end.

Canonical runtime IANA timezone id (plus UTC), matched case-insensitively and used as display metadata. Numeric offsets are rejected.

Minimum duration. Defaults to 30 timed or 1440 all-day; all-day values must be multiples of 1440.

Maximum duration. Defaults to 120 timed or 4320 all-day; must be ≥ minDurationMinutes.

Exact number of fictional attendees on every event.

Earliest allowed start, inclusive. With neither bound defaults to today's UTC midnight; with only to derives to minus 90 days. Must resolve to UTC midnight for all-day events (use YYYY-MM-DD).

Latest allowed end, inclusive for timed events and exclusive for all-day events. With only from derives from plus 90 days. Must resolve to UTC midnight for all-day events (use YYYY-MM-DD).

Advanced response options7 options

How many records to generate (1–100).

Deterministic output: the same seed always returns the same records. Omit for random (the used seed is echoed in meta.seed).

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Response format: json envelope, ndjson (one record per line) or csv.

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/calendar-events?seed=42&count=10"
const res = await fetch("https://randomapi.dev/api/calendar-events?seed=42&count=10");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/calendar-events?seed=42&count=10").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/calendar-events?seed=42&count=10"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 8
status enum

Only generate this event status. Omit for a mix.

allowed: confirmed | tentative | cancelled
example: status=confirmed
allDay boolean

False produces timed ISO instants; true produces YYYY-MM-DD dates with exclusive end.

default: false
example: allDay=true
timezone string

Canonical runtime IANA timezone id (plus UTC), matched case-insensitively and used as display metadata. Numeric offsets are rejected.

default: UTC
allowed: 1 – 100
example: timezone=Europe/Copenhagen
minDurationMinutes int

Minimum duration. Defaults to 30 timed or 1440 all-day; all-day values must be multiples of 1440.

allowed: 1 – 43200
example: minDurationMinutes=60
maxDurationMinutes int

Maximum duration. Defaults to 120 timed or 4320 all-day; must be ≥ minDurationMinutes.

allowed: 1 – 43200
example: maxDurationMinutes=180
attendeeCount int

Exact number of fictional attendees on every event.

default: 3
allowed: 0 – 20
example: attendeeCount=5
from date

Earliest allowed start, inclusive. With neither bound defaults to today's UTC midnight; with only to derives to minus 90 days. Must resolve to UTC midnight for all-day events (use YYYY-MM-DD).

example: from=2026-06-01
to date

Latest allowed end, inclusive for timed events and exclusive for all-day events. With only from derives from plus 90 days. Must resolve to UTC midnight for all-day events (use YYYY-MM-DD).

example: to=2026-06-30
Universal parameters Shared response and formatting options 7
count int

How many records to generate (1–100).

default: 10
allowed: 1 – 100
example: count=3
seed int

Deterministic output: the same seed always returns the same records. Omit for random (the used seed is echoed in meta.seed).

example: seed=42
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=id,title
exclude list

Return all fields except these (comma-separated).

example: exclude=attendees
format enum

Response format: json envelope, ndjson (one record per line) or csv.

default: json
allowed: json | ndjson | csv
example: format=csv
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 11
id string (UUID v4)

Fictional deterministic-per-seed event id.

example: 8f76e7de-67dd-49e0-a7c1-43f575cc3381

title string

Short generic event title.

example: Product planning

description string

Fixture description coherent with title.

example: Review priorities, owners and delivery risks for the next iteration.

status string

confirmed | tentative | cancelled.

example: confirmed

start string

ISO instant for timed events, or YYYY-MM-DD for all-day events.

example: 2026-06-10T09:00:00.000Z

end string

Later ISO instant, or exclusive YYYY-MM-DD all-day boundary.

example: 2026-06-10T10:00:00.000Z

timezone string

Canonical IANA display timezone.

example: Europe/Copenhagen

allDay boolean

Whether start/end use all-day date semantics.

example: false

location string

Generic fictional room, call or off-site location.

example: Video call

organizer object

Fictional organizer name and reserved-domain email.

example: {"name":"Jordan Lee","email":"jordan.lee@example.com"}

attendees object[]

Exactly attendeeCount fictional people with reserved-domain email and response.

example: [{"name":"Alex Kim","email":"alex.kim@example.net","response":"accepted"}]

Documented examples

Build-generated requests and complete responses
3
Reproducible timed events
GET /api/calendar-events?seed=42&count=10
{
  "data": [
    {
      "id": "ab85f422-019c-4ec2-8f1f-1b462add96ac",
      "title": "Engineering sync",
      "description": "Coordinate implementation details, dependencies and open decisions.",
      "status": "confirmed",
      "start": "2026-09-27T22:03:11.590Z",
      "end": "2026-09-27T23:16:11.590Z",
      "timezone": "UTC",
      "allDay": false,
      "location": "Studio 2",
      "organizer": {
        "name": "Kent Kohler Jr.",
        "email": "kent.kohler.jr@example.com"
      },
      "attendees": [
        {
          "name": "Sergio Conroy",
          "email": "sergio.conroy@example.com",
          "response": "tentative"
        },
        {
          "name": "Isabella Ruecker",
          "email": "isabella.ruecker@example.org",
          "response": "needsAction"
        },
        {
          "name": "Josiane Reilly MD",
          "email": "josiane.reilly.md@example.org",
          "response": "tentative"
        }
      ]
    },
    {
      "id": "def349c6-8f36-4bd0-ab5e-920b1420de7a",
      "title": "Customer interview",
      "description": "Discuss the current workflow, pain points and desired outcomes.",
      "status": "tentative",
      "start": "2026-07-29T12:30:51.970Z",
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
Tentative Copenhagen events with five attendees
GET /api/calendar-events?status=tentative&timezone=Europe%2FCopenhagen&attendeeCount=5&count=20
{
  "data": [
    {
      "id": "ab85f422-019c-4ec2-8f1f-1b462add96ac",
      "title": "Engineering sync",
      "description": "Coordinate implementation details, dependencies and open decisions.",
      "status": "tentative",
      "start": "2026-09-27T22:03:11.590Z",
      "end": "2026-09-27T23:16:11.590Z",
      "timezone": "Europe/Copenhagen",
      "allDay": false,
      "location": "Conference Room A",
      "organizer": {
        "name": "Kent Kohler Jr.",
        "email": "kent.kohler.jr@example.net"
      },
      "attendees": [
        {
          "name": "Sergio Conroy",
          "email": "sergio.conroy@example.com",
          "response": "accepted"
        },
        {
          "name": "Isabella Ruecker",
          "email": "isabella.ruecker@example.net",
          "response": "needsAction"
        },
        {
          "name": "Josiane Reilly MD",
          "email": "josiane.reilly.md@example.org",
          "response": "declined"
        },
        {
          "name": "Billy West",
          "email": "billy.west@example.net",
          "response": "declined"
        },
        {
          "name": "Candice DuBuque",
          "email": "candice.dubuque@example.net",
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
One-to-three-day all-day events
GET /api/calendar-events?allDay=true&minDurationMinutes=1440&maxDurationMinutes=4320&from=2026-06-01&to=2026-06-30&count=12
{
  "data": [
    {
      "id": "ab85f422-019c-4ec2-8f1f-1b462add96ac",
      "title": "Engineering sync",
      "description": "Coordinate implementation details, dependencies and open decisions.",
      "status": "confirmed",
      "start": "2026-06-19",
      "end": "2026-06-21",
      "timezone": "UTC",
      "allDay": true,
      "location": "Studio 2",
      "organizer": {
        "name": "Kent Kohler Jr.",
        "email": "kent.kohler.jr@example.com"
      },
      "attendees": [
        {
          "name": "Sergio Conroy",
          "email": "sergio.conroy@example.com",
          "response": "tentative"
        },
        {
          "name": "Isabella Ruecker",
          "email": "isabella.ruecker@example.org",
          "response": "needsAction"
        },
        {
          "name": "Josiane Reilly MD",
          "email": "josiane.reilly.md@example.org",
          "response": "tentative"
        }
      ]
    },
    {
      "id": "def349c6-8f36-4bd0-ab5e-920b1420de7a",
      "title": "Customer interview",
      "description": "Discuss the current workflow, pain points and desired outcomes.",
      "status": "tentative",
      "start": "2026-06-01",
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}

About this API

Coverage & behavior

Generates generic calendar-event fixtures for scheduling interfaces. Timed events use the platform's millisecond timestamp profile with start < end. All-day events use calendar YYYY-MM-DD values, with an exclusive end date and durations of whole days. When allDay=true, explicit from/to bounds must resolve to UTC midnight (use YYYY-MM-DD); non-midnight timestamp bounds are deliberately rejected instead of being rounded in UTC or guessed through a timezone.

timezone is matched case-insensitively against the runtime's canonical IANA timezone inventory (plus UTC) and echoed canonically. Fixed numeric offsets such as +01:00 are not IANA zone ids and return 400. Timed values remain absolute UTC instants; the timezone tells a consumer where to display them. For all-day fixtures it remains metadata—the date-only bounds are calendar labels, not instants to DST-convert.

Duration bounds genuinely constrain each event. Timed defaults are 30–120 minutes. With allDay=true, defaults are 1440–4320 minutes (1–3 days), and explicit duration bounds must be whole multiples of 1440. With neither bound, from/to default to a UTC-day-snapped 90-day future window. Supplying exactly one bound derives the other 90 days away. Resolved bounds are echoed in meta.params and constrain both event endpoints.

This is an intentionally generic fixture shape inspired by common calendar APIs. It is not Google Calendar-compatible, has no RRULE support and makes no vendor-schema promise.

Use it for

  • Populate day, week and agenda views with reproducible events
  • Test confirmed, tentative and cancelled UI states with fixed attendee counts
  • Exercise all-day exclusive-end handling separately from timed ISO instants

Frequently asked questions

How are all-day event dates represented?

start and end are YYYY-MM-DD values, and end is exclusive. A one-day event starting 2026-06-10 therefore ends 2026-06-11.

Does timezone change the generated instant?

No. Timed starts and ends are UTC instants; the canonical IANA timezone identifies the display zone. All-day bounds must resolve to UTC midnight (use YYYY-MM-DD) and are not silently DST-converted.

Can I generate a fixed number of attendees?

Yes. attendeeCount from 0 through 20 controls the exact length of every event's attendee array.

Does this endpoint support RRULE or Google Calendar payloads?

No. It produces a small generic fixture shape and deliberately makes no recurrence or vendor-compatibility claim.