{"id":"dedup-window","title":"Group webhook deliveries by identity within a time window and decide: process, dedupe, retry, reconcile or abstain","description":"Given previously seen deliveries (identity, receivedAt, payload or digest, handling outcome) and a new incoming one, finds earlier deliveries with the same identity inside the window and returns process (none), dedupe (same payload already processed), retry (earlier ones all failed), reconcile (an earlier one is in flight or unknown, or the same identity arrives with a different payload) or abstain (times or payload evidence missing, or the only history for this identity is dated after the incoming delivery). Also lists duplicate groups and payload conflicts in the history. A delivery exactly windowSeconds old is still inside the window. status pass = process, dedupe or retry; fail = reconcile; unknown = abstain. Holds no state: the caller supplies the history.","roi":"Avoids double-processing a replayed webhook and surfaces the replay that carries different data.","audience":"agent-infra","package":"execution-safety-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/dedup-window","path":"/api/v1/dedup-window","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["history","incoming","windowSeconds"],"properties":{"history":{"type":"array","maxItems":500,"items":{"type":"object","additionalProperties":false,"required":["identity","receivedAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"identity":{"type":"string","minLength":1,"maxLength":200,"description":"Delivery identity: the provider's event id, or a key built from the fields that define the event."},"receivedAt":{"type":"string","maxLength":40,"description":"RFC 3339 instant."},"payload":{"description":"Event body; hashed with RFC 8785 canonical JSON to detect conflicting duplicates."},"payloadDigest":{"type":"string","minLength":8,"maxLength":128,"description":"Alternative to payload: a digest the caller computed."},"outcome":{"type":"string","enum":["processed","failed","in-flight","unknown"],"description":"What happened when this delivery was handled (history only)."}}}},"incoming":{"type":"object","additionalProperties":false,"required":["identity","receivedAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"identity":{"type":"string","minLength":1,"maxLength":200,"description":"Delivery identity: the provider's event id, or a key built from the fields that define the event."},"receivedAt":{"type":"string","maxLength":40,"description":"RFC 3339 instant."},"payload":{"description":"Event body; hashed with RFC 8785 canonical JSON to detect conflicting duplicates."},"payloadDigest":{"type":"string","minLength":8,"maxLength":128,"description":"Alternative to payload: a digest the caller computed."},"outcome":{"type":"string","enum":["processed","failed","in-flight","unknown"],"description":"What happened when this delivery was handled (history only)."}}},"windowSeconds":{"type":"integer","minimum":1,"maximum":2592000},"windowMode":{"type":"string","enum":["from-first","sliding"],"description":"from-first (default): a group's window starts at its first delivery. sliding: each delivery extends the window."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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."},"decision":{"type":"string","enum":["process","dedupe","retry","reconcile","abstain"]},"reason":{"type":"string"},"matchedIds":{"type":"array","items":{"type":"string"},"description":"History entries (id or index) in the window for this identity."},"groups":{"type":"array","items":{"type":"object","properties":{"identity":{"type":"string"},"count":{"type":"integer"},"conflicting":{"type":"boolean"}}},"description":"History identities seen more than once inside one window."},"incomingDigest":{"type":"string"},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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."},"decision":{"type":"string","enum":["process","dedupe","retry","reconcile","abstain"]},"reason":{"type":"string"},"matchedIds":{"type":"array","items":{"type":"string"},"description":"History entries (id or index) in the window for this identity."},"groups":{"type":"array","items":{"type":"object","properties":{"identity":{"type":"string"},"count":{"type":"integer"},"conflicting":{"type":"boolean"}}},"description":"History identities seen more than once inside one window."},"incomingDigest":{"type":"string"},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"history":[{"id":"d1","identity":"evt_9","receivedAt":"2026-11-04T10:00:00Z","payload":{"amount":5},"outcome":"processed"}],"incoming":{"identity":"evt_9","receivedAt":"2026-11-04T10:00:30Z","payload":{"amount":5}},"windowSeconds":300},"openapiOperation":{"operationId":"dedup_window","summary":"Group webhook deliveries by identity within a time window and decide: process, dedupe, retry, reconcile or abstain","description":"Given previously seen deliveries (identity, receivedAt, payload or digest, handling outcome) and a new incoming one, finds earlier deliveries with the same identity inside the window and returns process (none), dedupe (same payload already processed), retry (earlier ones all failed), reconcile (an earlier one is in flight or unknown, or the same identity arrives with a different payload) or abstain (times or payload evidence missing, or the only history for this identity is dated after the incoming delivery). Also lists duplicate groups and payload conflicts in the history. A delivery exactly windowSeconds old is still inside the window. status pass = process, dedupe or retry; fail = reconcile; unknown = abstain. Holds no state: the caller supplies the history.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/dedup-window","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["history","incoming","windowSeconds"],"properties":{"history":{"type":"array","maxItems":500,"items":{"type":"object","additionalProperties":false,"required":["identity","receivedAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"identity":{"type":"string","minLength":1,"maxLength":200,"description":"Delivery identity: the provider's event id, or a key built from the fields that define the event."},"receivedAt":{"type":"string","maxLength":40,"description":"RFC 3339 instant."},"payload":{"description":"Event body; hashed with RFC 8785 canonical JSON to detect conflicting duplicates."},"payloadDigest":{"type":"string","minLength":8,"maxLength":128,"description":"Alternative to payload: a digest the caller computed."},"outcome":{"type":"string","enum":["processed","failed","in-flight","unknown"],"description":"What happened when this delivery was handled (history only)."}}}},"incoming":{"type":"object","additionalProperties":false,"required":["identity","receivedAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"identity":{"type":"string","minLength":1,"maxLength":200,"description":"Delivery identity: the provider's event id, or a key built from the fields that define the event."},"receivedAt":{"type":"string","maxLength":40,"description":"RFC 3339 instant."},"payload":{"description":"Event body; hashed with RFC 8785 canonical JSON to detect conflicting duplicates."},"payloadDigest":{"type":"string","minLength":8,"maxLength":128,"description":"Alternative to payload: a digest the caller computed."},"outcome":{"type":"string","enum":["processed","failed","in-flight","unknown"],"description":"What happened when this delivery was handled (history only)."}}},"windowSeconds":{"type":"integer","minimum":1,"maximum":2592000},"windowMode":{"type":"string","enum":["from-first","sliding"],"description":"from-first (default): a group's window starts at its first delivery. sliding: each delivery extends the window."}}},"example":{"history":[{"id":"d1","identity":"evt_9","receivedAt":"2026-11-04T10:00:00Z","payload":{"amount":5},"outcome":"processed"}],"incoming":{"identity":"evt_9","receivedAt":"2026-11-04T10:00:30Z","payload":{"amount":5}},"windowSeconds":300}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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."},"decision":{"type":"string","enum":["process","dedupe","retry","reconcile","abstain"]},"reason":{"type":"string"},"matchedIds":{"type":"array","items":{"type":"string"},"description":"History entries (id or index) in the window for this identity."},"groups":{"type":"array","items":{"type":"object","properties":{"identity":{"type":"string"},"count":{"type":"integer"},"conflicting":{"type":"boolean"}}},"description":"History identities seen more than once inside one window."},"incomingDigest":{"type":"string"},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/dedup-window/","docsJson":"https://agents.writerslogic.com/docs/dedup-window.json","sample":"https://agents.writerslogic.com/api/v1/samples/dedup-window","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}