{"openapi":"3.1.0","info":{"title":"Constraint Schedule Solver","description":"Find meeting slots that satisfy hard scheduling constraints across participants in different timezones. With the slots comes a per-constraint satisfaction certificate. Checking it costs one pass over the constraint rows, so the check is linear in the number of constraints. You never re-solve. INPUTS: each participant's availability windows, in their own IANA timezone. Plus duration, working hours, working days, blackout periods, a recurrence rule as an RFC 5545 RRULE or a cron expression, a minimum gap between slots, and a quorum. OUTPUTS: the slots in UTC, and in every participant's local time. Plus a table with one row per constraint per slot. Each row gives the required value, the observed value, and a satisfied or violated verdict with its witness. DST-correct: availability is wall-clock in each participant's zone. A window that crosses a spring-forward or fall-back transition is handled and flagged, not silently shifted. When no slot exists you get an infeasibility diagnosis. It attributes every rejected candidate to the constraint that eliminated it. Every response carries an Ed25519-signed reproducibility receipt. The receipt covers the input hash, the output hash, the engine and tzdata versions, and a timestamp. Hard wall-clock, CPU and memory caps apply per solve. They are published in every response. Free preview at /v1/preview: same response shape, same certificate, same signed receipt, 3 participants. WHAT THIS DOES NOT GUARANTEE, stated up front. 1. Slots are searched on a discrete grid you choose. The grid is granularity_minutes, or the recurrence instants. A satisfying slot lying strictly between two grid points is not found. So 'infeasible' means infeasible ON THAT GRID, not in continuous time. 2. Selection is greedy, not optimal. We return a satisfying set, never a provably maximal or best-attended one. 3. Availability is taken as declared. We consult no calendar. We cannot know about a conflict a participant did not tell us about. 4. The certificate proves the returned slots satisfy the constraints you stated. It does not prove those constraints express your intent. 5. The signature proves origin and integrity, not correctness. 6. Timezone answers are only as current as the tzdata version reported in every response. 7. If a solve hits a resource cap the status is 'capped'. NO claim of exhaustiveness is made at all.\n\nOperated by Oddments. Paid per call in USDC on Base via x402.","version":"1.0.0","x-service-name":"Constraint Schedule Solver","x-tags":["scheduling","constraint-solver","calendar","timezone","dst","meeting","availability","rrule","cron","verifiable","certificate","signed-receipt"],"x-error-taxonomy":"https://s2.oddments.ai/v1/errors","x-free-sample":"https://s2.oddments.ai/v1/preview","x-limits":["The certificate proves each RETURNED slot satisfies each STATED constraint. It does not prove your constraints express your intent.","Slots are searched on a discrete grid (granularity_minutes, or the recurrence instants). A satisfying slot lying strictly between two grid points is not found, so 'infeasible' means infeasible ON THAT GRID, not in continuous time.","Selection is greedy, not optimal. With min_gap set, a different set of slots may be larger or better-attended. We return a satisfying set, never a provably maximal one.","status='capped' makes no claim of exhaustiveness at all.","Availability is taken as declared. We do not consult any calendar, and we cannot know about a conflict a participant did not declare.","Timezone answers are only as current as the tzdata version reported in 'engine'. A zone whose rules change after that release will be computed on the old rules."],"x-resource-caps":{"paid":{"tier":"paid","max_participants":40,"max_intervals_per_participant":200,"max_total_intervals":2000,"max_window_days":370,"min_granularity_minutes":5,"max_duration_minutes":1440,"max_slots_returned":20,"max_candidate_start_times":100000,"max_blackout_intervals":200,"wall_clock_seconds":4.0,"cpu_seconds":3.0,"memory_mb":512,"max_request_bytes":1048576},"free_preview":{"tier":"free_preview","max_participants":3,"max_intervals_per_participant":10,"max_total_intervals":30,"max_window_days":14,"min_granularity_minutes":15,"max_duration_minutes":480,"max_slots_returned":3,"max_candidate_start_times":4000,"max_blackout_intervals":10,"wall_clock_seconds":1.5,"cpu_seconds":1.0,"memory_mb":256,"max_request_bytes":32768}},"x-guidance":"POST /v1/solve finds meeting slots satisfying hard constraints across timezones and returns a per-constraint satisfaction certificate you can check without re-solving, plus an Ed25519-signed reproducibility receipt. Try /v1/preview free first: same response shape, 3 participants."},"paths":{"/v1/solve":{"post":{"summary":"Solve scheduling constraints, with a per-constraint certificate (paid)","description":"Find meeting slots that satisfy hard scheduling constraints across participants in different timezones. With the slots comes a per-constraint satisfaction certificate. Checking it costs one pass over the constraint rows, so the check is linear in the number of constraints. You never re-solve. INPUTS: each participant's availability windows, in their own IANA timezone. Plus duration, working hours, working days, blackout periods, a recurrence rule as an RFC 5545 RRULE or a cron expression, a minimum gap between slots, and a quorum. OUTPUTS: the slots in UTC, and in every participant's local time. Plus a table with one row per constraint per slot. Each row gives the required value, the observed value, and a satisfied or violated verdict with its witness. DST-correct: availability is wall-clock in each participant's zone. A window that crosses a spring-forward or fall-back transition is handled and flagged, not silently shifted. When no slot exists you get an infeasibility diagnosis. It attributes every rejected candidate to the constraint that eliminated it. Every response carries an Ed25519-signed reproducibility receipt. The receipt covers the input hash, the output hash, the engine and tzdata versions, and a timestamp. Hard wall-clock, CPU and memory caps apply per solve. They are published in every response. Free preview at /v1/preview: same response shape, same certificate, same signed receipt, 3 participants. WHAT THIS DOES NOT GUARANTEE, stated up front. 1. Slots are searched on a discrete grid you choose. The grid is granularity_minutes, or the recurrence instants. A satisfying slot lying strictly between two grid points is not found. So 'infeasible' means infeasible ON THAT GRID, not in continuous time. 2. Selection is greedy, not optimal. We return a satisfying set, never a provably maximal or best-attended one. 3. Availability is taken as declared. We consult no calendar. We cannot know about a conflict a participant did not tell us about. 4. The certificate proves the returned slots satisfy the constraints you stated. It does not prove those constraints express your intent. 5. The signature proves origin and integrity, not correctness. 6. Timezone answers are only as current as the tzdata version reported in every response. 7. If a solve hits a resource cap the status is 'capped'. NO claim of exhaustiveness is made at all.","operationId":"solve_paid_v1_solve_post","responses":{"200":{"description":"Slots plus the per-constraint satisfaction certificate and signed receipt","content":{"application/json":{"schema":{"type":"object","title":"SolveResponse","properties":{"status":{"type":"string","enum":["solved","partial","infeasible","capped"]},"status_meaning":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"start_utc":{"type":"string"},"end_utc":{"type":"string"},"duration_minutes":{"type":"number"},"attendees":{"type":"array","items":{"type":"string"}},"absent":{"type":"array","items":{"type":"string"}},"attendance":{"type":"string"},"local_times":{"type":"object"}}}},"certificate":{"type":"object","description":"the product: one row per constraint per slot, each checkable in O(1)","properties":{"summary":{"type":"object","properties":{"checks_total":{"type":"integer"},"satisfied":{"type":"integer"},"violated":{"type":"integer"},"unmet":{"type":"integer"},"slots_certified":{"type":"integer"},"returned_slots_all_valid":{"type":"boolean","description":"every check on every RETURNED slot passed (true over zero slots)"},"request_fully_satisfied":{"type":"boolean","description":"the above AND you got as many slots as you asked for -- branch on this one"}}},"per_slot":{"type":"array","items":{"type":"object","properties":{"slot_index":{"type":"integer"},"all_satisfied":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"constraint":{"type":"string"},"status":{"type":"string","enum":["satisfied","violated","not_applicable"]},"required":{"type":"string"},"observed":{"type":"string"},"witness":{"type":"object"}}}}}}},"global":{"type":"array","items":{"type":"object"}}}},"diagnosis":{"type":["object","null"],"description":"present when status is infeasible or partial: which constraint eliminated how many candidates"},"search":{"type":"object","description":"what was searched, and the resource caps that bounded it"},"limits_of_this_answer":{"type":"array","items":{"type":"string"}},"receipt":{"type":"object","description":"Ed25519 reproducibility receipt over this exact request/response pair. Present on every response from both the paid and the free endpoint. Proves origin and integrity, not correctness. Verify with the public key at /.well-known/oddments-receipts.json and the script at /verify_receipt.py.","properties":{"receipt_version":{"type":"string","description":"currently 'oddments-receipt/1'"},"service":{"type":"string"},"endpoint":{"type":"string","description":"the path that produced the response"},"price":{"type":"string","description":"what was charged; 'free' on the preview endpoint"},"issued_at":{"type":"string","description":"ISO-8601 UTC, signed"},"input_sha256":{"type":"string","description":"SHA-256 of the canonicalized request body"},"output_sha256":{"type":"string","description":"SHA-256 of the canonicalized response body with 'receipt' removed"},"engine":{"type":"object","description":"library and tzdata versions used, signed"},"key_id":{"type":"string"},"algorithm":{"type":"string","description":"Ed25519"},"public_key_b64":{"type":"string"},"signature_b64":{"type":"string"},"signed_fields":{"type":"array","items":{"type":"string"},"description":"exactly which fields the signature covers"},"canonicalization":{"type":"string","description":"the byte-exact rule used before signing"},"verify":{"type":"object","description":"public key URL, verifier script URL, and what it does and does not prove"}},"required":["receipt_version","input_sha256","output_sha256","signature_b64","signed_fields","key_id","algorithm"]},"engine":{"type":"object"},"preview":{"type":"object","description":"present on the FREE endpoint only (/v1/preview). Names the preview caps and the paid caps they correspond to, so the sample is legible as a sample. Absent from a paid response."}},"required":["status","slots","certificate","receipt","engine"]},"example":{"status":"solved","status_meaning":"every requested slot was found and every constraint check passed","slots":[{"index":0,"start_utc":"2026-03-30T12:00:00Z","end_utc":"2026-03-30T13:00:00Z","duration_minutes":60.0,"attendees":["ana","bo","cai"],"absent":[],"attendance":"3/3","local_times":{"ana":{"tz":"Europe/London","start":"2026-03-30T13:00:00","end":"2026-03-30T14:00:00","utc_offset":"+01:00"},"bo":{"tz":"America/New_York","start":"2026-03-30T08:00:00","end":"2026-03-30T09:00:00","utc_offset":"-04:00"},"cai":{"tz":"Asia/Tokyo","start":"2026-03-30T21:00:00","end":"2026-03-30T22:00:00","utc_offset":"+09:00"}}},{"index":1,"start_utc":"2026-03-31T12:00:00Z","end_utc":"2026-03-31T13:00:00Z","duration_minutes":60.0,"attendees":["ana","bo","cai"],"absent":[],"attendance":"3/3","local_times":{"ana":{"tz":"Europe/London","start":"2026-03-31T13:00:00","end":"2026-03-31T14:00:00","utc_offset":"+01:00"},"bo":{"tz":"America/New_York","start":"2026-03-31T08:00:00","end":"2026-03-31T09:00:00","utc_offset":"-04:00"},"cai":{"tz":"Asia/Tokyo","start":"2026-03-31T21:00:00","end":"2026-03-31T22:00:00","utc_offset":"+09:00"}}}],"certificate":{"how_to_verify":"Every row is checkable on its own in constant time: compare 'required' against 'observed'. You never have to re-run the search.","summary":{"checks_total":26,"satisfied":26,"violated":0,"unmet":0,"slots_certified":2,"returned_slots_all_valid":true,"request_fully_satisfied":true},"per_slot":[{"slot_index":0,"start_utc":"2026-03-30T12:00:00Z","end_utc":"2026-03-30T13:00:00Z","attendees":["ana","bo","cai"],"absent":[],"all_satisfied":true,"checks":[{"id":"duration","constraint":"duration","status":"satisfied","required":"exactly 60 minutes","observed":"60 minutes"},{"id":"availability:cai","constraint":"availability","status":"satisfied","required":"cai free for the whole slot","observed":"contained in declared window [2026-03-30T09:00:00Z, 2026-03-30T18:00:00Z) = 2026-03-30T18:00:00 / 2026-03-31T03:00:00 local","attending":true,"witness":{"participant":"cai","tz":"Asia/Tokyo","slot_local":"2026-03-30T21:00:00 / 2026-03-30T22:00:00","utc_offset_at_start":"+09:00","utc_offset_at_end":"+09:00"}},{"id":"working_hours:cai","constraint":"working_hours","status":"satisfied","required":"08:00-23:00 local on ISO weekday(s) 1,2,3,4,5","observed":"cai local 21:00:00 to 22:00:00 on 2026-03-30 (ISO weekday 1); that day's working window is 2026-03-30T08:00:00 to 2026-03-30T23:00:00 local = [2026-03-29T23:00:00Z, 2026-03-30T14:00:00Z) UTC","attending":true},{"id":"quorum","constraint":"quorum","status":"satisfied","required":"at least 3 of 3 participants free","observed":"3 free: ana, bo, cai"},{"…":"18 further rows, one per constraint per participant"}]}],"global":[{"id":"count","constraint":"count","status":"satisfied","required":"2 slot(s) requested","observed":"2 slot(s) returned"},{"id":"min_gap","constraint":"min_gap","status":"satisfied","required":">= 60 minutes between consecutive slots","observed":"smallest observed gap 1380 minutes"}]},"search":{"candidate_start_times_examined":189,"candidates_feasible":10,"exhaustive_over_the_grid":true,"grid":"every 15 minutes from window.start","selection_rule":"earliest","dst_flags_seen":[]},"receipt":{"receipt_version":"oddments-receipt/1","algorithm":"Ed25519","input_sha256":"sha256 of your canonicalized request","output_sha256":"sha256 of this response with 'receipt' removed","signature_b64":"Ed25519 signature over the canonical signed_fields"}}}}},"400":{"description":"invalid_input -- see /v1/errors"},"402":{"description":"Payment Required"},"413":{"description":"request_too_large -- see /v1/errors"},"503":{"description":"solve_timeout / solve_resource_limit / server_busy -- see /v1/errors"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.050000"},"protocols":[{"x402":{}}]},"tags":["scheduling","constraint-solver","calendar","timezone","dst","meeting","availability","rrule","cron","verifiable","certificate","signed-receipt"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"SolveRequest","properties":{"participants":{"type":"array","minItems":1,"maxItems":40,"description":"Everyone who might attend. Availability is wall-clock in each participant's own zone.","items":{"type":"object","properties":{"id":{"type":"string","description":"echoed into every certificate row"},"tz":{"type":"string","description":"IANA zone, e.g. Europe/London"},"available":{"type":"array","minItems":1,"items":{"type":"object","properties":{"start":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"},"end":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"}},"required":["start","end"]},"description":"free windows, local wall time in this participant's tz"},"busy":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"},"end":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"}},"required":["start","end"]},"description":"subtracted from 'available'; same local wall time"},"required":{"type":"boolean","default":false,"description":"if true, no slot is returned without this participant"}},"required":["tz","available"]}},"constraints":{"type":"object","properties":{"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"window":{"type":"object","description":"search horizon, ABSOLUTE instants (offset or Z required)","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]},"count":{"type":"integer","minimum":1,"maximum":20,"default":1},"granularity_minutes":{"type":"integer","minimum":5,"default":15,"description":"candidate start grid; slots strictly between grid points are not searched"},"working_hours":{"type":"object","description":"local time-of-day band applied in EACH participant's own zone","properties":{"start":{"type":"string"},"end":{"type":"string"}}},"working_days":{"type":"array","items":{"type":"integer","minimum":1,"maximum":7},"default":[1,2,3,4,5],"description":"ISO weekdays, 1=Monday"},"blackout":{"type":"array","maxItems":200,"description":"global exclusions; absolute instants, or local wall time if 'tz' is given","items":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"tz":{"type":"string"}},"required":["start","end"]}},"recurrence":{"type":"object","description":"restrict candidate starts to the instants of an RRULE or cron rule","properties":{"cron":{"type":"string"},"rrule":{"type":"string"},"tz":{"type":"string"},"start":{"type":"string"}},"required":["tz"]},"min_gap_minutes":{"type":"integer","minimum":0,"default":0},"quorum":{"description":"minimum attendees; an integer, or a fraction in (0,1] of the participant count","anyOf":[{"type":"integer","minimum":1},{"type":"number","exclusiveMinimum":0,"maximum":1}]},"prefer":{"type":"string","enum":["earliest","max_attendance"],"default":"earliest"}},"required":["duration_minutes","window"]}},"required":["participants","constraints"]},"example":{"participants":[{"id":"ana","tz":"Europe/London","required":true,"available":[{"start":"2026-03-30T08:00:00","end":"2026-03-30T20:00:00"},{"start":"2026-03-31T08:00:00","end":"2026-03-31T20:00:00"}]},{"id":"bo","tz":"America/New_York","available":[{"start":"2026-03-30T08:00:00","end":"2026-03-30T18:00:00"},{"start":"2026-03-31T08:00:00","end":"2026-03-31T18:00:00"}],"busy":[{"start":"2026-03-30T12:00:00","end":"2026-03-30T13:00:00"}]},{"id":"cai","tz":"Asia/Tokyo","available":[{"start":"2026-03-30T18:00:00","end":"2026-03-31T03:00:00"},{"start":"2026-03-31T18:00:00","end":"2026-04-01T03:00:00"}]}],"constraints":{"duration_minutes":60,"count":2,"window":{"start":"2026-03-30T00:00:00Z","end":"2026-04-01T00:00:00Z"},"granularity_minutes":15,"working_hours":{"start":"08:00","end":"23:00"},"working_days":[1,2,3,4,5],"min_gap_minutes":60,"quorum":3,"prefer":"earliest"}}}}}}},"/v1/preview":{"post":{"summary":"Free preview: same shape and certificate, 3 participants","description":"Free sample: same response shape, same certificate, same signed receipt.","operationId":"preview_v1_preview_post","responses":{"200":{"description":"Same response shape as the paid endpoint","content":{"application/json":{"schema":{"type":"object","title":"SolveResponse","properties":{"status":{"type":"string","enum":["solved","partial","infeasible","capped"]},"status_meaning":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"start_utc":{"type":"string"},"end_utc":{"type":"string"},"duration_minutes":{"type":"number"},"attendees":{"type":"array","items":{"type":"string"}},"absent":{"type":"array","items":{"type":"string"}},"attendance":{"type":"string"},"local_times":{"type":"object"}}}},"certificate":{"type":"object","description":"the product: one row per constraint per slot, each checkable in O(1)","properties":{"summary":{"type":"object","properties":{"checks_total":{"type":"integer"},"satisfied":{"type":"integer"},"violated":{"type":"integer"},"unmet":{"type":"integer"},"slots_certified":{"type":"integer"},"returned_slots_all_valid":{"type":"boolean","description":"every check on every RETURNED slot passed (true over zero slots)"},"request_fully_satisfied":{"type":"boolean","description":"the above AND you got as many slots as you asked for -- branch on this one"}}},"per_slot":{"type":"array","items":{"type":"object","properties":{"slot_index":{"type":"integer"},"all_satisfied":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"constraint":{"type":"string"},"status":{"type":"string","enum":["satisfied","violated","not_applicable"]},"required":{"type":"string"},"observed":{"type":"string"},"witness":{"type":"object"}}}}}}},"global":{"type":"array","items":{"type":"object"}}}},"diagnosis":{"type":["object","null"],"description":"present when status is infeasible or partial: which constraint eliminated how many candidates"},"search":{"type":"object","description":"what was searched, and the resource caps that bounded it"},"limits_of_this_answer":{"type":"array","items":{"type":"string"}},"receipt":{"type":"object","description":"Ed25519 reproducibility receipt over this exact request/response pair. Present on every response from both the paid and the free endpoint. Proves origin and integrity, not correctness. Verify with the public key at /.well-known/oddments-receipts.json and the script at /verify_receipt.py.","properties":{"receipt_version":{"type":"string","description":"currently 'oddments-receipt/1'"},"service":{"type":"string"},"endpoint":{"type":"string","description":"the path that produced the response"},"price":{"type":"string","description":"what was charged; 'free' on the preview endpoint"},"issued_at":{"type":"string","description":"ISO-8601 UTC, signed"},"input_sha256":{"type":"string","description":"SHA-256 of the canonicalized request body"},"output_sha256":{"type":"string","description":"SHA-256 of the canonicalized response body with 'receipt' removed"},"engine":{"type":"object","description":"library and tzdata versions used, signed"},"key_id":{"type":"string"},"algorithm":{"type":"string","description":"Ed25519"},"public_key_b64":{"type":"string"},"signature_b64":{"type":"string"},"signed_fields":{"type":"array","items":{"type":"string"},"description":"exactly which fields the signature covers"},"canonicalization":{"type":"string","description":"the byte-exact rule used before signing"},"verify":{"type":"object","description":"public key URL, verifier script URL, and what it does and does not prove"}},"required":["receipt_version","input_sha256","output_sha256","signature_b64","signed_fields","key_id","algorithm"]},"engine":{"type":"object"},"preview":{"type":"object","description":"present on the FREE endpoint only (/v1/preview). Names the preview caps and the paid caps they correspond to, so the sample is legible as a sample. Absent from a paid response."}},"required":["status","slots","certificate","receipt","engine"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"SolveRequest","properties":{"participants":{"type":"array","minItems":1,"maxItems":40,"description":"Everyone who might attend. Availability is wall-clock in each participant's own zone.","items":{"type":"object","properties":{"id":{"type":"string","description":"echoed into every certificate row"},"tz":{"type":"string","description":"IANA zone, e.g. Europe/London"},"available":{"type":"array","minItems":1,"items":{"type":"object","properties":{"start":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"},"end":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"}},"required":["start","end"]},"description":"free windows, local wall time in this participant's tz"},"busy":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"},"end":{"type":"string","description":"ISO-8601 LOCAL wall time, no offset/Z"}},"required":["start","end"]},"description":"subtracted from 'available'; same local wall time"},"required":{"type":"boolean","default":false,"description":"if true, no slot is returned without this participant"}},"required":["tz","available"]}},"constraints":{"type":"object","properties":{"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"window":{"type":"object","description":"search horizon, ABSOLUTE instants (offset or Z required)","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]},"count":{"type":"integer","minimum":1,"maximum":20,"default":1},"granularity_minutes":{"type":"integer","minimum":5,"default":15,"description":"candidate start grid; slots strictly between grid points are not searched"},"working_hours":{"type":"object","description":"local time-of-day band applied in EACH participant's own zone","properties":{"start":{"type":"string"},"end":{"type":"string"}}},"working_days":{"type":"array","items":{"type":"integer","minimum":1,"maximum":7},"default":[1,2,3,4,5],"description":"ISO weekdays, 1=Monday"},"blackout":{"type":"array","maxItems":200,"description":"global exclusions; absolute instants, or local wall time if 'tz' is given","items":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"tz":{"type":"string"}},"required":["start","end"]}},"recurrence":{"type":"object","description":"restrict candidate starts to the instants of an RRULE or cron rule","properties":{"cron":{"type":"string"},"rrule":{"type":"string"},"tz":{"type":"string"},"start":{"type":"string"}},"required":["tz"]},"min_gap_minutes":{"type":"integer","minimum":0,"default":0},"quorum":{"description":"minimum attendees; an integer, or a fraction in (0,1] of the participant count","anyOf":[{"type":"integer","minimum":1},{"type":"number","exclusiveMinimum":0,"maximum":1}]},"prefer":{"type":"string","enum":["earliest","max_attendance"],"default":"earliest"}},"required":["duration_minutes","window"]}},"required":["participants","constraints"]},"example":{"participants":[{"id":"ana","tz":"Europe/London","required":true,"available":[{"start":"2026-03-30T08:00:00","end":"2026-03-30T20:00:00"},{"start":"2026-03-31T08:00:00","end":"2026-03-31T20:00:00"}]},{"id":"bo","tz":"America/New_York","available":[{"start":"2026-03-30T08:00:00","end":"2026-03-30T18:00:00"},{"start":"2026-03-31T08:00:00","end":"2026-03-31T18:00:00"}],"busy":[{"start":"2026-03-30T12:00:00","end":"2026-03-30T13:00:00"}]},{"id":"cai","tz":"Asia/Tokyo","available":[{"start":"2026-03-30T18:00:00","end":"2026-03-31T03:00:00"},{"start":"2026-03-31T18:00:00","end":"2026-04-01T03:00:00"}]}],"constraints":{"duration_minutes":60,"count":2,"window":{"start":"2026-03-30T00:00:00Z","end":"2026-04-01T00:00:00Z"},"granularity_minutes":15,"working_hours":{"start":"08:00","end":"23:00"},"working_days":[1,2,3,4,5],"min_gap_minutes":60,"quorum":3,"prefer":"earliest"}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/errors":{"get":{"summary":"Errors","operationId":"errors_v1_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oddments-receipts.json":{"get":{"summary":"Receipt Key","operationId":"receipt_key__well_known_oddments_receipts_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/x402":{"get":{"summary":"Well Known X402","description":"Compatibility discovery document (x402scan spec section B).\n\nHost-aware: a crawler that fetched this from the legacy exe.xyz origin is\ntold about the exe.xyz resource, which is the one it can actually reach at\nthe URL it used. See `base_for`.","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/verify_receipt.py":{"get":{"summary":"Verifier Script","description":"The buyer-side checker, served as source. Handing the checker the check\nis the entire leg-6 argument; making them write it is not.","operationId":"verifier_script_verify_receipt_py_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/metrics":{"get":{"summary":"Metrics","description":"Live probe/settlement counters, straight off the event log.","operationId":"metrics_v1_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"servers":[{"url":"https://s2.oddments.ai"}]}