{"service":"Constraint Schedule Solver","operator":"Oddments","version":"1.0.0","summary":"Find meeting slots that satisfy hard scheduling constraints across participants in different timezones -- and return a per-constraint satisfaction certificate you can check in O(constraints) without re-solving. Inputs: each participant's availability windows in their own IANA timezone, plus duration, working hours, working days, blackout periods, a recurrence rule (RFC 5545 RRULE or cron), a minimum gap between slots, and a quorum. Outputs: the slots in UTC and in every participant's local time, and a table with one row per constraint per slot giving the required value, the observed value and a satisfied/violated verdict with its witness. DST-correct: availability is wall-clock in each participant's zone, so a window that crosses a spring-forward or fall-back transition is handled and flagged rather than silently shifted. When no slot exists, you get an infeasibility diagnosis attributing every rejected candidate to the constraint that eliminated it. Every response carries an Ed25519-signed reproducibility receipt (input hash, output hash, engine and tzdata versions, timestamp). Hard wall-clock, CPU and memory caps per solve, 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 (granularity_minutes, or the recurrence instants), so a satisfying slot lying strictly between two grid points is not found and '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 and cannot know about a conflict a participant did not tell us about. (4) The certificate proves the returned slots satisfy the constraints you stated -- not that 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' and NO claim of exhaustiveness is made at all.","what_the_certificate_proves":["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."],"endpoints":{"paid":{"method":"POST","path":"/v1/solve","price":"$0.05","protocol":"x402","network":"eip155:8453","asset":"USDC","pay_to":"0xf29Cc4af14aB4E4e17C320a8C8fB9AC4D476d935","caps":{"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":{"method":"POST","path":"/v1/preview","price":"free","caps":{"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}},"errors":"/v1/errors","metrics":"/v1/metrics","openapi":"/openapi.json","receipt_public_key":"/.well-known/oddments-receipts.json","receipt_verifier":"/verify_receipt.py"},"example_request":{"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"}},"input_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"]},"output_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"}},"required":["status","slots","certificate","receipt","engine"]},"metadata_floor":{"note":"The eight-item legibility floor this service was built to. Published because a buyer agent evaluating a catalog can check it mechanically.","items":{"1_description":"present -- see 'description' here and in /openapi.json","2_service_name":"Constraint Schedule Solver","3_tags":["scheduling","constraint-solver","calendar","timezone","dst","meeting","availability","rrule","cron","verifiable","certificate","signed-receipt"],"4_input_schema":"https://s2.oddments.ai/openapi.json and 'input_schema' below","5_output_schema":"https://s2.oddments.ai/openapi.json and 'output_schema' below","6_free_sample_verifying_the_paid_claim":"POST /v1/preview -- same shape, same certificate, same signed receipt","7_error_taxonomy":"https://s2.oddments.ai/v1/errors","8_listing_freshness":"every price or metadata change is pushed to every directory carrying us and the listing re-read against this endpoint before the change is considered done"}},"engine":{"service":"Oddments Constraint Schedule Solver","engine_version":"1.0.0","python":"3.12.3","dateutil":"2.9.0.post0","croniter":"6.0.0","tzdata":"2026.3","semantics":"availability and working hours are wall-clock in each participant's IANA zone, localized to UTC per occurrence; slots are half-open [start, end)"}}