Oddments

oddments, noun. Assorted small items left over. Once also the odd few pence left after a transaction.

We sell small parcels of work to software agents. Priced in cents. Paid per call. No account required.

What this is

An agent working through a task keeps hitting narrow sub-problems. It could attempt them itself. It would often get them quietly, plausibly wrong. Some of those are worth a fraction of a cent to have done correctly instead.

That is the whole business. Every service here:

Live now

Live · since 5 August 2026

Recurrence Expander

Give it an RFC 5545 RRULE or a cron expression, plus an IANA timezone. It returns the exact UTC instants.

It flags the two things naive implementations get wrong. Some wall-clock times never happen, because the clock sprang forward. Some happen twice, because it fell back. Every response names the tzdata and library versions it used. Every response carries a signed receipt binding the input, the output and the engine. So any result can be reproduced and checked later.

Paid
POST https://s1.oddments.ai/v1/expand. $0.02 per call · USDC on Base
Free
POST https://s1.oddments.ai/v1/preview. Same response shape, one rule, three occurrences
Discovery
/openapi.json · /.well-known/x402 · /v1/errors · x402scan listing
Counters
/v1/metrics. Calls, previews and settlements. Public.
Call it from a terminal
# free sample. no payment, no key, no account
curl -sS https://s1.oddments.ai/v1/preview \
  -H 'Content-Type: application/json' \
  -d '{"rules":[{"cron":"30 9 * * 1-5","tz":"America/New_York","start":"2026-03-06T00:00:00","count":3}]}'

# the paid call answers 402 with the payment challenge
curl -sS -i -X POST https://s1.oddments.ai/v1/expand \
  -H 'Content-Type: application/json' -d '{}'

What you are not buying: secrecy. You could expand the rule yourself and check every instant we return. That is deliberate. What the fee buys:

  • Current timezone data.
  • The two DST edge cases handled, not assumed.
  • A reproducible record of which versions produced the answer.

Live · since 6 August 2026

Constraint Schedule Solver

Give it each participant's availability in their own timezone, plus hard constraints. Duration, working hours, blackouts, a recurrence rule, a minimum gap, a quorum. It returns meeting slots that satisfy them.

With the slots comes a per-constraint satisfaction certificate. One row per constraint per slot. Each row gives the required value, the observed value, and a verdict with its witness. You check the answer in one pass over that table instead of re-solving. When no slot exists you get an infeasibility diagnosis. It names, for every candidate it rejected, the constraint that eliminated it.

Paid
POST https://s2.oddments.ai/v1/solve. $0.05 per call · USDC on Base
Free
POST https://s2.oddments.ai/v1/preview. Same response shape, same certificate, same signed receipt, three participants
Discovery
/openapi.json · /.well-known/x402 · /v1/errors · x402scan listing
Counters
/v1/metrics. Calls, previews and settlements. Public.
Call it from a terminal
# free sample. no payment, no key, no account
curl -sS https://s2.oddments.ai/v1/preview \
  -H 'Content-Type: application/json' \
  -d '{"participants":[{"id":"ana","tz":"Europe/London","available":[{"start":"2026-03-30T09:00:00","end":"2026-03-30T18:00:00"}]},{"id":"bo","tz":"America/New_York","available":[{"start":"2026-03-30T09:00:00","end":"2026-03-30T18:00:00"}]}],"constraints":{"duration_minutes":60,"count":1,"window":{"start":"2026-03-30T00:00:00Z","end":"2026-03-31T00:00:00Z"}}}'

# the paid call answers 402 with the payment challenge
curl -sS -i -X POST https://s2.oddments.ai/v1/solve \
  -H 'Content-Type: application/json' -d '{}'

What you are not buying: optimality.

  • Slots are searched on a discrete grid you choose. So “infeasible” means infeasible on that grid.
  • Selection is greedy. You get a satisfying set, never a provably best-attended one.
  • Availability is taken as declared. We consult no calendar.
All seven limits are stated in the service's own description, not just here.

Live · since 6 August 2026

Pattern Synthesis + ReDoS Safety Report

Give it strings you want matched and strings you want rejected. It returns a regular expression that provably accepts every one of the first and rejects every one of the second.

With the pattern comes the complete match matrix. One row per example, never a sample. Each row shows expected against observed, with the matching span. So you can re-check the whole claim in one pass. You also get a catastrophic-backtracking analysis. It names the worst-case input class if the pattern has one. Candidates that fail any example are discarded before anything is returned.

Paid
POST https://s3.oddments.ai/v1/synthesize. $0.10 per call · USDC on Base
Free
POST https://s3.oddments.ai/v1/preview. Same response shape, same complete matrix, same ReDoS report, six examples each way
Discovery
/openapi.json · /.well-known/x402 · /v1/errors · x402scan listing
Counters
/v1/metrics. Calls, previews and settlements. Public.
Call it from a terminal
# free sample. no payment, no key, no account
curl -sS https://s3.oddments.ai/v1/preview \
  -H 'Content-Type: application/json' \
  -d '{"positives":["AB-1234","XY-9999","QQ-0001"],"negatives":["ab-1234","AB-123","AB1234"]}'

# the paid call answers 402 with the payment challenge
curl -sS -i -X POST https://s3.oddments.ai/v1/synthesize \
  -H 'Content-Type: application/json' -d '{}'

What you are not buying: a pattern that matches your intent. The matrix proves the regex satisfies the examples you gave it, and nothing more. A near-miss probe report ships with every answer, so you can inspect how it generalised. The service does not use the word “safe” about a regex. Neither will we.

Live · since 6 August 2026

Name-Safety Checker

Give it a name or a domain label. It tells you whether the label is valid, whether it can be confused with a look-alike, and whether it is legal under a TLD's rules.

Every answer names its evidence. You get a character-by-character breakdown with codepoint, name and script, the scripts the label mixes, the UTS 39 skeleton, and the confusable characters themselves as named witnesses. It also lists near-identical variants in the same script that someone could register against you. Each response reports the version and date of every table it consulted, so you can judge how current the answer is. A signed receipt binds the input, the output and those table versions together.

Paid
POST https://s5.oddments.ai/v1/check. $0.03 per call · USDC on Base
Free
POST https://s5.oddments.ai/v1/preview. Same response shape, same signed receipt, one name
Discovery
/openapi.json · /.well-known/x402 · /v1/errors · x402scan listing
Counters
/v1/metrics. Calls, previews and settlements. Public.
Call it from a terminal
# free sample. no payment, no key, no account
curl -sS https://s5.oddments.ai/v1/preview \
  -H 'Content-Type: application/json' \
  -d '{"names":["аpple","раypal","my-name"],"tld":"com"}'

# the paid call answers 402 with the payment challenge
curl -sS -i -X POST https://s5.oddments.ai/v1/check \
  -H 'Content-Type: application/json' -d '{}'

What you are not buying: availability. This service makes no RDAP, WHOIS, DNS or registry query of any kind, so nothing it returns reflects who owns what. A name can pass every check here and already be registered. It applies no trademark or legal analysis, so a name can be technically safe and still infringe. Confusability is judged against the published Unicode table, which approximates human vision rather than testing your font. The variant list is capped and is a sample, never the full set. The signature proves origin and integrity, not correctness.

How payment works

Over x402. Four steps:

No signup. No API key. No invoice. Nothing to cancel. The free preview needs none of it.

What comes next

More of the same shape. Work that is expensive to produce and cheap to check. If the output cannot be verified without redoing the work, it probably does not belong here.

The services listed above are the ones that exist. Others are being built. This page adds a service the day it accepts a call, and not before.

Plainly