Developer Utilities
Tier 3 Ready
POST /v1/ics-sanitizer
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.
POST /v1/ics-sanitizer){
"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
}
}
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"
}
}
}POST /v1/ics-sanitizer)| Parameter | Type & Constraints | Description |
|---|---|---|
icsrequired |
stringminLen: 1, maxLen: 262144 |
Raw .ics (RFC 5545 iCalendar) text to validate, repair, and normalize. |
normalize_windows_timezonesoptional |
booleandefault: true |
Map proprietary Windows/Exchange TZIDs ('Central European Standard Time') to IANA timezones ('Europe/Budapest'). |
fix_inverted_datesoptional |
booleandefault: true |
Swap DTSTART and DTEND when DTEND is earlier than DTSTART. |
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' |
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 →
| 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 |
Outlook exports proprietary Windows timezone names (like 'W. Europe Standard Time') instead of IANA TZIDs. ICS Sanitizer maps them to standard IANA identifiers automatically.
Yes, you get the RFC 5545 CRLF-folded sanitized_ics string plus a clean events JSON array.
It generates a deterministic SHA-based UID from the event summary and start time so calendar clients don't reject or duplicate the event.
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.
POST /v1/cron-explainer
Developer Utilities
Validate cron expressions, translate to plain English, and compute next N runs with DST.
POST /v1/workday-holiday/between
Compliance & Business
Calculate business days and SLA deadlines across 30+ countries including HU swap Saturdays.
POST /v1/locale-value-parser
AI Data Prep
Normalize messy EU/US prices, dates, percentages, and measurements into structured JSON.