{"uid":"cap_qUWN_caXhqXEbAkyFfRCL","slug":"constraint-schedule-solver-60f595a2","name":"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.","url":"https://oddments-s2.exe.xyz/v1/solve","method":"POST","headers":{},"bodySchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["input","output"],"properties":{"input":{"type":"object","required":["type","method","bodyType","body"],"properties":{"body":{"type":"object"},"type":{"const":"http"},"method":{"const":"POST"},"bodyType":{"const":"json"}},"additionalProperties":false},"output":{"type":"object","required":["type"],"properties":{"type":{"const":"json"},"example":{"type":"object"}}},"schemaReference":{"type":"object","required":["url","input","output"],"properties":{"url":{"type":"string"},"input":{"type":"string"},"output":{"type":"string"}},"additionalProperties":false}}},"responseSchema":{"type":"json","example":{"slots":[{"index":0,"absent":[],"end_utc":"2026-03-30T13:00:00Z","attendees":["ana","bo","cai"],"start_utc":"2026-03-30T12:00:00Z","attendance":"3/3","local_times":{"bo":{"tz":"America/New_York","end":"2026-03-30T09:00:00","start":"2026-03-30T08:00:00","utc_offset":"-04:00"},"ana":{"tz":"Europe/London","end":"2026-03-30T14:00:00","start":"2026-03-30T13:00:00","utc_offset":"+01:00"},"cai":{"tz":"Asia/Tokyo","end":"2026-03-30T22:00:00","start":"2026-03-30T21:00:00","utc_offset":"+09:00"}},"duration_minutes":60},{"index":1,"absent":[],"end_utc":"2026-03-31T13:00:00Z","attendees":["ana","bo","cai"],"start_utc":"2026-03-31T12:00:00Z","attendance":"3/3","local_times":{"bo":{"tz":"America/New_York","end":"2026-03-31T09:00:00","start":"2026-03-31T08:00:00","utc_offset":"-04:00"},"ana":{"tz":"Europe/London","end":"2026-03-31T14:00:00","start":"2026-03-31T13:00:00","utc_offset":"+01:00"},"cai":{"tz":"Asia/Tokyo","end":"2026-03-31T22:00:00","start":"2026-03-31T21:00:00","utc_offset":"+09:00"}},"duration_minutes":60}],"engine":{"python":"3.12.3","tzdata":"2026.3","service":"Oddments Constraint Schedule Solver","croniter":"6.0.0","dateutil":"2.9.0.post0","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)","engine_version":"1.0.0"},"search":{"grid":"every 15 minutes from window.start","dst_flags_seen":[],"selection_rule":"earliest","candidates_feasible":10,"exhaustive_over_the_grid":true,"candidate_start_times_examined":189},"status":"solved","receipt":{"key_id":"992f41c6f2fb6375","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","signed_fields":["endpoint","engine","input_sha256","issued_at","key_id","output_sha256","price","receipt_version","service"],"receipt_version":"oddments-receipt/1"},"certificate":{"global":[{"id":"count","status":"satisfied","observed":"2 slot(s) returned","required":"2 slot(s) requested","constraint":"count"},{"id":"min_gap","status":"satisfied","observed":"smallest observed gap 1380 minutes","required":">= 60 minutes between consecutive slots","constraint":"min_gap"}],"summary":{"unmet":0,"violated":0,"satisfied":26,"checks_total":26,"slots_certified":2,"request_fully_satisfied":true,"returned_slots_all_valid":true},"per_slot":[{"absent":[],"checks":[{"id":"duration","status":"satisfied","observed":"60 minutes","required":"exactly 60 minutes","constraint":"duration"},{"id":"availability:cai","status":"satisfied","witness":{"tz":"Asia/Tokyo","slot_local":"2026-03-30T21:00:00 / 2026-03-30T22:00:00","participant":"cai","utc_offset_at_end":"+09:00","utc_offset_at_start":"+09:00"},"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","required":"cai free for the whole slot","attending":true,"constraint":"availability"},{"id":"working_hours:cai","status":"satisfied","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","required":"08:00-23:00 local on ISO weekday(s) 1,2,3,4,5","attending":true,"constraint":"working_hours"},{"id":"quorum","status":"satisfied","observed":"3 free: ana, bo, cai","required":"at least 3 of 3 participants free","constraint":"quorum"},{"…":"18 further rows, one per constraint per participant"}],"end_utc":"2026-03-30T13:00:00Z","attendees":["ana","bo","cai"],"start_utc":"2026-03-30T12:00:00Z","slot_index":0,"all_satisfied":true}],"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."},"status_meaning":"every requested slot was found and every constraint check passed"}},"example":null,"exampleRequest":null,"tags":["x402"],"displayCostAmount":"0.05","displayCostAsset":"USDC","priceDynamic":false,"priceHint":null,"priceStatus":"priced","priceSource":"probe","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"down","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"static","summary":"$0.05/call","primary":{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.05","per":"call","confidence":"exact"},"accepted":[{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.05","per":"call","confidence":"exact"}]},"paymentMethods":[{"uid":"pm_1xX6kVlm4WGHPeECXdtTt","protocol":"x402","methodType":"crypto","chain":"base","mode":"charge","costAmount":"0.05","costPer":"request","priority":0,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","unit":"request","depositMicros":null,"planRef":null}],"brandName":null,"brandSlug":null,"brandBaseUrl":null,"brandDocsUrl":null,"whatItDoes":"Finds meeting time slots satisfying hard scheduling constraints across participants in multiple timezones, returning slots in UTC and local times with a per-constraint satisfaction certificate and infeasibility diagnosis when no slot exists.","exampleAgentPrompt":"Find 2 one-hour meeting slots this week for Ana (Europe/London, available Mon–Fri 9am–6pm), Bo (America/New_York, available Mon–Fri 8am–5pm), and Cai (Asia/Tokyo, available Mon–Fri 9am–7pm), with at least 60 minutes between slots and no slots on Wednesday — give me the times in everyone's local timezone and show me which constraints were satisfied.","exampleUseCases":[{"title":"Global team weekly sync scheduling","prompt":"I need to set up a recurring weekly 1-hour sync for our team: Maria is in Berlin (available Mon–Fri 9am–6pm), James is in Chicago (available Mon–Fri 8am–5pm), and Yuki is in Tokyo (available Mon–Fri 10am–7pm). Find me 3 candidate slots using an RRULE for weekly recurrence, with at least 90 minutes between options, and tell me which constraints each slot satisfies."},{"title":"Quorum-based board meeting finder","prompt":"Schedule a 90-minute board meeting for 5 executives — we only need 4 of the 5 to attend. Participants are in London, São Paulo, Singapore, Toronto, and Sydney, each with different availability windows next month. Blackout the last week of the month and show me the earliest 2 slots where at least 4 people are free, with DST handling for the spring-forward weekend."},{"title":"Infeasibility diagnosis for impossible meeting","prompt":"I've been trying to find a 2-hour slot for our team in Reykjavik, Nairobi, and Auckland — availability is very tight and I keep getting nothing. Can you run the constraint solver and tell me exactly which constraints are making it impossible to find any slot, so I know what to relax?"}],"resultDescription":"A JSON response containing: an array of slots each with UTC start/end times, local times per participant with UTC offsets, attendance count, and absent participants; a certificate table with one row per constraint per slot showing required value, observed value, and satisfied/violated verdict; a global certificate covering count and min_gap constraints; a summary of total checks, satisfied/violated counts, and overall request satisfaction; search metadata including grid resolution, candidates examined, and DST flags seen; and a cryptographic receipt (Ed25519 signature over inputs and outputs). On infeasibility, returns a diagnosis explaining which constraints cannot be met.","failureModes":["No feasible slot exists — returns infeasibility diagnosis listing which constraints conflict","Invalid IANA timezone string — returns validation error","Malformed RRULE or cron expression — returns parse error","Availability windows cross DST transition — flagged in response, not silently shifted","Quorum exceeds total participant count — returns constraint violation","Blackout periods cover entire search range — infeasibility diagnosis","Overlapping or contradictory working hours/days constraints — infeasibility or partial satisfaction","Payment failure — x402 payment required error before processing"],"whenToPreferThis":"Choose this endpoint when you need provably correct multi-timezone meeting scheduling with an auditable constraint satisfaction certificate — especially when DST correctness matters, when you need a quorum rather than full attendance, when you need recurring slots via RRULE/cron, or when you need to diagnose why no slot is feasible. Prefer this over generic calendar APIs when you need a machine-verifiable proof that each returned slot satisfies every constraint, not just a list of available times.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-09-15T12:25:31.684Z","isFirstParty":false}