Tinplate 42 Edge APIs

Developer Utilities Tier 3 Ready POST /v1/ics-sanitizer

iCalendar (.ics) Validator & Sanitizer API — Fix Broken RFC 5545 Feeds

Repair broken .ics calendar feeds, normalize Windows timezones to IANA, and parse VEVENTs. Validate and repair malformed .ics calendar feeds: fix CRLF line folding, missing UID/DTSTAMP, inverted DTSTART/DTEND, invalid RRULEs, and Windows VTIMEZONE IDs.

Try It Live in Your Browser · No API Key Required

1. Interactive Sandbox & Sample JSON Output

200 OK · Ready

Editable Request JSON (POST /v1/ics-sanitizer)

Live 200 OK Response Envelope

{
  "ok": true,
  "data": {
    "valid": true,
    "sanitized_ics": "BEGIN:VCALENDAR\r\nPRODID:-//Tinplate//ICS Sanitizer//EN\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nUID:evt-1-3b2c16f1@tinplate.dev\r\nDTSTAMP:20261114T090000Z\r\nSUMMARY:Team Sync\r\nDTSTART;TZID=Europe/Budapest:20261114T090000\r\nDTEND;TZID=Europe/Budapest:20261114T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
    "event_count": 1,
    "events": [
      {
        "uid": "evt-1-3b2c16f1@tinplate.dev",
        "summary": "Team Sync",
        "dtstart": "20261114T090000",
        "dtend": "20261114T100000",
        "timezone": "Europe/Budapest",
        "rrule": null
      }
    ],
    "repairs": [
      "normalized_lf_to_crlf",
      "injected_missing_prodid",
      "mapped_windows_tzid:Central European Standard Time->Europe/Budapest",
      "swapped_inverted_dtstart_dtend",
      "injected_missing_uid",
      "injected_missing_dtstamp"
    ],
    "issues": [
      {
        "code": "inverted_dtstart_dtend_repaired",
        "severity": "warning",
        "message": "VEVENT #1 had DTEND earlier than DTSTART; values were swapped."
      }
    ]
  },
  "meta": {
    "request_id": "req_ics_01",
    "ms": 1
  }
}

2. Quickstart Code Examples

Full TypeScript & Python SDK →
curl -X POST "https://api.tinplate.dev/v1/ics-sanitizer" \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -d '{"ics":"BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Team Sync\nDTSTART;TZID=Central European Standard Time:20261114T100000\nDTEND;TZID=Central European Standard Time:20261114T090000\nEND:VEVENT\nEND:VCALENDAR"}'
import { TinplateClient } from "@tinplate/sdk"; // npm install @tinplate/sdk

const tinplate = new TinplateClient({
  rapidApiKey: process.env.RAPIDAPI_KEY!,
});

const { data, meta } = await tinplate.call("/v1/ics-sanitizer", {
  "ics": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Team Sync\nDTSTART;TZID=Central European Standard Time:20261114T100000\nDTEND;TZID=Central European Standard Time:20261114T090000\nEND:VEVENT\nEND:VCALENDAR"
});
console.log(`[${meta.ms} ms]`, data);
import requests

response = requests.post(
    "https://api.tinplate.dev/v1/ics-sanitizer",
    headers={
        "Content-Type": "application/json",
        "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    },
    json={
  "ics": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Team Sync\nDTSTART;TZID=Central European Standard Time:20261114T100000\nDTEND;TZID=Central European Standard Time:20261114T090000\nEND:VEVENT\nEND:VCALENDAR"
}
)
print(response.json())
const response = await fetch("https://api.tinplate.dev/v1/ics-sanitizer", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
  },
  body: JSON.stringify({
  "ics": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Team Sync\nDTSTART;TZID=Central European Standard Time:20261114T100000\nDTEND;TZID=Central European Standard Time:20261114T090000\nEND:VEVENT\nEND:VCALENDAR"
}),
});
const result = await response.json();
console.log(result);
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tinplate_ics_sanitizer",
    "arguments": {
      "ics": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Team Sync\nDTSTART;TZID=Central European Standard Time:20261114T100000\nDTEND;TZID=Central European Standard Time:20261114T090000\nEND:VEVENT\nEND:VCALENDAR"
    }
  }
}
OpenAPI 3.0.3 Schema Contract

Request Parameters & Response Schema Reference

Request Body Parameters (POST /v1/ics-sanitizer)

Parameter Type & Constraints Description
icsrequired string
minLen: 1, maxLen: 262144
Raw .ics (RFC 5545 iCalendar) text to validate, repair, and normalize.
normalize_windows_timezonesoptional boolean
default: true
Map proprietary Windows/Exchange TZIDs ('Central European Standard Time') to IANA timezones ('Europe/Budapest').
fix_inverted_datesoptional boolean
default: true
Swap DTSTART and DTEND when DTEND is earlier than DTSTART.

Response data Object Fields (200 OK)

Field Type Description
valid boolean Field 'valid'
sanitized_ics string Field 'sanitized_ics'
event_count integer Field 'event_count'
events object[] Field 'events'
repairs string[] Field 'repairs'
issues object[] Field 'issues'

3. What ICS / iCalendar Feed Sanitizer & Validator API Detects & Validates

Honest Engineering Boundaries

4. Known Limitations & Test Verification

Release Version: v1.0.7 · Last Verified / Benchmarked: 14 November 2026 · Latency Note: Sub-millisecond figures measure in-Worker V8 compute time (typical client HTTPS network RTT to the nearest Cloudflare PoP is 15–65 ms) · See Full Portfolio Benchmarks & Corpora →

5. Marketplace Plans & Payload Quotas

Plan Monthly Price Included Requests Rate Limit Max Request Payload Best For
BASIC $0.00 / month 500 / month (hard limit) 10 req / min 64 KB Evaluation, local development & CI smoke tests
PRO $9.99 / month 15,000 / month 60 req / min 128 KB Solo developers & production apps
ULTRA $29.99 / month 100,000 / month 300 req / min 256 KB Growing SaaS & multi-agent pipelines
MEGA $79.99 / month 500,000 / month 1,000 req / min 256 KB High-volume enterprise workloads

6. Frequently Asked Questions

Why do Outlook .ics invites often break in Google Calendar or custom parsers?

Outlook exports proprietary Windows timezone names (like 'W. Europe Standard Time') instead of IANA TZIDs. ICS Sanitizer maps them to standard IANA identifiers automatically.

Does it return both fixed .ics text and parsed JSON events?

Yes, you get the RFC 5545 CRLF-folded sanitized_ics string plus a clean events JSON array.

What if an event is missing a UID?

It generates a deterministic SHA-based UID from the event summary and start time so calendar clients don't reject or duplicate the event.

Zero Payload Logging

7. Data Handling, Privacy & Marketplace Proxy Disclosure

Calendar feeds are sanitized in volatile V8 memory and never stored.

Worker Zero-Logging Guarantee: Cloudflare Workers Observability and invocation logging are disabled in configuration (observability.enabled = false, head_sampling_rate = 0, invocation_logs = false). Payloads are processed strictly in volatile V8 memory and never logged or stored by Tinplate.

Marketplace Proxies vs. Direct Bearer Key: Requests sent via RapidAPI or Zyla API Hub pass through those marketplaces' proxy infrastructure (subject to their respective privacy policies). Security-sensitive workloads requiring end-to-end zero-intermediary processing can connect directly to https://api.tinplate.dev using a Direct Bearer Key (Authorization: Bearer <API_KEY>). Read our full Privacy Notice and OpenAPI 3.0.3 JSON Schema.

Related Tinplate APIs

⏰ POST /v1/cron-explainer Developer Utilities

Cron & Schedule Explainer & Validator API

Validate cron expressions, translate to plain English, and compute next N runs with DST.

📅 POST /v1/workday-holiday/between Compliance & Business

Workday & Holiday Calculator API

Calculate business days and SLA deadlines across 30+ countries including HU swap Saturdays.

🔢 POST /v1/locale-value-parser AI Data Prep

Text-to-Structured Date, Money & Unit Parser API

Normalize messy EU/US prices, dates, percentages, and measurements into structured JSON.