Catalog/sched-invert-intervals

Scheduling

Busy to free intervals API

Inverts busy intervals into free gaps within a window, merging overlapping busy blocks and returning the complement plus total free/busy minutes. Answers 'What are my free gaps given these meetings?', 'How much free vs busy time is in this window?'.

Price$0.02per request
MethodPOST
Route/v1/scheduling/invert-intervals
StatusLive
MIME typeapplication/json
Rate limit120/minute
Cache0s public
schedulingintervalsfree-busycomplementcalendaravailabilitymergeagents
API URLhttps://x402.hexl.dev/v1/scheduling/invert-intervals
Integration docs
Example request
{
  "windowStart": "2026-06-04T09:00:00Z",
  "windowEnd": "2026-06-04T12:00:00Z",
  "busy": [
    {
      "start": "2026-06-04T09:30:00Z",
      "end": "2026-06-04T10:00:00Z"
    },
    {
      "start": "2026-06-04T10:00:00Z",
      "end": "2026-06-04T10:30:00Z"
    }
  ]
}
Example response
{
  "free": [
    {
      "start": "2026-06-04T09:00:00.000Z",
      "end": "2026-06-04T09:30:00.000Z"
    },
    {
      "start": "2026-06-04T10:30:00.000Z",
      "end": "2026-06-04T12:00:00.000Z"
    }
  ],
  "busyMerged": [
    {
      "start": "2026-06-04T09:30:00.000Z",
      "end": "2026-06-04T10:30:00.000Z"
    }
  ],
  "freeMinutes": 120,
  "busyMinutes": 60,
  "windowMinutes": 180,
  "interpretation": "2 free gap(s) totaling 2h; 1h busy."
}
Input schema
{
  "type": "object",
  "required": [
    "windowStart",
    "windowEnd",
    "busy"
  ],
  "properties": {
    "windowStart": {
      "type": "string",
      "examples": [
        "2026-06-04T09:00:00Z"
      ]
    },
    "windowEnd": {
      "type": "string",
      "examples": [
        "2026-06-04T12:00:00Z"
      ]
    },
    "busy": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
Output schema
{
  "type": "object",
  "additionalProperties": true
}