Business-day deadline (clear days, cutoffs, DST) on a named or caller calendar
Computes the date (and optionally the instant) a business-day deadline falls on, for an agent drafting or checking a contract, notice, SLA or partner response window: '10 clear business days' (both endpoints excluded) or 'within 10 business days' (end day counted), forward or backward, with an after-cutoff roll, caller or named holiday calendar and a DST-aware deadline time. Named calendars (US federal, Federal Reserve, NYSE, UK bank holidays) carry a source, as-of date and supported range and answer `unsupported` outside it. It does not interpret contract wording, know your jurisdiction's deeming rules, or read the clock.
What you get
Off-by-one on 'clear days', a Friday-after-cutoff notice or a deadline in a DST gap are the usual ways a deadline is missed.
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/business-deadline. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/business-deadline \
-H 'content-type: application/json' \
-d '{"start":"2026-12-18","days":10,"counting":"clear","calendar":"us-federal"}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
start | string; length 0..19 | yes | Local date YYYY-MM-DD, or local date-time YYYY-MM-DDTHH:MM[:SS] (the notice/receipt moment). Never read from the clock. |
days | integer; 0..3650 | yes | |
counting | string; one of "clear", "elapsed" | yes | clear: days strictly between start and deadline, so the deadline is business day N+1. elapsed: the deadline is business day N after start (the end day is counted). |
direction | string; one of "after", "before" | no | Default after. before counts backward from start (for 'at least N days before the hearing'). |
calendar | string; one of "us-federal", "us-federal-reserve", "nyse", "us-equities-settlement", "uk-england-and-wales", "uk-scotland", "uk-northern-ireland", "weekends-only", "caller" | yes | Named holiday calendar with a source and supported date range (outside it the answer is unsupported), weekends-only (Saturday/Sunday only), or caller (only the holidays you list). |
holidays | array<string; length 0..10>; max 400 items | no | Extra non-business dates YYYY-MM-DD (company closures, a calendar we do not carry). |
weekend | array<integer; 0..6>; max 6 items | no | Non-business weekdays, 0=Sunday..6=Saturday. Default [0, 6]; use [5, 6] for a Friday/Saturday weekend. |
cutoff | string; length 0..5 | no | Local HH:MM. With a date-time start (direction after), a start strictly later than the cutoff, or on a non-business day, is deemed received on the next business day. 17:00 exactly is on time. Without cutoff there is no roll. |
deadlineTime | string; length 0..5 | no | Local HH:MM at which the deadline expires on the deadline date; needs timeZone to produce an instant. |
timeZone | string; length 0..64 | no | IANA zone for deadlineTime. |
disambiguation | string; one of "earlier", "later" | no | How to read a deadline time that falls in a DST gap (earlier: before-gap offset reading backward; later: shifted forward) or overlap (earlier/later occurrence). Without it, a gap or overlap returns unknown with both candidates. |
claimedDeadline | string; length 0..10 | no | A deadline date someone asserted; the check fails with the computed date if it differs. |
Example request body
{
"start": "2026-12-18",
"days": 10,
"counting": "clear",
"calendar": "us-federal"
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
status | string; one of "pass", "fail", "unknown", "unsupported" | no | pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass. |
deadlineDate | string | no | |
weekday | string | no | |
effectiveStart | string | no | |
startRolled | boolean | no | |
startRollReason | string | no | |
businessDaysCounted | integer | no | |
clearBusinessDays | integer | no | |
skipped | array<object> | no | Non-business days stepped over (first 60). |
skippedCount | integer | no | |
deadlineLocal | string | no | |
deadlineUtc | string | no | |
wallTimeKind | string; one of "normal", "gap", "overlap" | no | |
candidatesUtc | array<string> | no | |
reason | string | no | |
witnesses | array<object> | no | |
versions | object | no | Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile). |
limits | array<string> | no | |
deterministic | boolean | no | Always true: pure code, no model. |
Pay and connect
Available through: x402 (USDC on Base), MCP. MCP clients reach it through the calendar-deadline-kit package.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent