{"id":"footnote-attach","title":"Attach footnote texts to their in-text markers from page layout coordinates","description":"Given footnote markers (label, page, x, y) and footnote texts (label, page, x, y) extracted from a laid-out document, pairs each marker with its note by label and page, pairing repeated labels on one page in reading order, optionally letting a note continue on the next page, and reports unattached markers, orphan notes, ambiguous groups (different counts for the same label) and notes placed above their marker on the same page. Uses only the coordinates and labels the caller supplies: it does not read PDFs, detect markers or guess when counts disagree.","roi":"Rebuilds footnotes from extracted layout without misattaching a note to the wrong marker. 500 markers per $0.005 call.","audience":"agent-infra","package":"context-evidence-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/footnote-attach","path":"/api/v1/footnote-attach","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["markers","notes"],"properties":{"markers":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":20,"minLength":1,"description":"Marker as printed: 1, *, a."},"page":{"type":"integer","minimum":1,"maximum":100000},"x":{"type":"number","minimum":-1000000,"maximum":1000000},"y":{"type":"number","minimum":-1000000,"maximum":1000000},"text":{"type":"string","maxLength":200,"description":"Context around the marker, echoed back."}},"required":["label","page","x","y"]},"maxItems":500},"notes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":20,"minLength":1,"description":"Label as printed in the note."},"page":{"type":"integer","minimum":1,"maximum":100000},"x":{"type":"number","minimum":-1000000,"maximum":1000000},"y":{"type":"number","minimum":-1000000,"maximum":1000000},"text":{"type":"string","maxLength":5000}},"required":["label","page","x","y","text"]},"maxItems":500},"yAxis":{"type":"string","enum":["down","up"],"description":"Direction of increasing y: down (PDF.js, screen) or up (PDF user space). Default down."},"allowNextPage":{"type":"boolean","description":"A note may sit on the page after its marker. Default false."}}},"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."},"attachments":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"marker":{"type":"integer"},"note":{"type":"integer"},"label":{"type":"string"},"page":{"type":"integer"},"method":{"type":"string","enum":["label-page","label-order","next-page"]}}},"maxItems":500},"unattachedMarkers":{"type":"array","items":{"type":"integer"},"maxItems":500},"unattachedNotes":{"type":"array","items":{"type":"integer"},"maxItems":500},"ambiguousGroups":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string"},"page":{"type":"integer"},"markers":{"type":"integer"},"notes":{"type":"integer"}}},"maxItems":500},"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."},"attachments":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"marker":{"type":"integer"},"note":{"type":"integer"},"label":{"type":"string"},"page":{"type":"integer"},"method":{"type":"string","enum":["label-page","label-order","next-page"]}}},"maxItems":500},"unattachedMarkers":{"type":"array","items":{"type":"integer"},"maxItems":500},"unattachedNotes":{"type":"array","items":{"type":"integer"},"maxItems":500},"ambiguousGroups":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string"},"page":{"type":"integer"},"markers":{"type":"integer"},"notes":{"type":"integer"}}},"maxItems":500},"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":{"markers":[{"label":"1","page":3,"x":200,"y":140},{"label":"2","page":3,"x":90,"y":400}],"notes":[{"label":"1","page":3,"x":72,"y":700,"text":"First note."},{"label":"2","page":3,"x":72,"y":720,"text":"Second note."}]},"openapiOperation":{"operationId":"footnote_attach","summary":"Attach footnote texts to their in-text markers from page layout coordinates","description":"Given footnote markers (label, page, x, y) and footnote texts (label, page, x, y) extracted from a laid-out document, pairs each marker with its note by label and page, pairing repeated labels on one page in reading order, optionally letting a note continue on the next page, and reports unattached markers, orphan notes, ambiguous groups (different counts for the same label) and notes placed above their marker on the same page. Uses only the coordinates and labels the caller supplies: it does not read PDFs, detect markers or guess when counts disagree.\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/footnote-attach","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["markers","notes"],"properties":{"markers":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":20,"minLength":1,"description":"Marker as printed: 1, *, a."},"page":{"type":"integer","minimum":1,"maximum":100000},"x":{"type":"number","minimum":-1000000,"maximum":1000000},"y":{"type":"number","minimum":-1000000,"maximum":1000000},"text":{"type":"string","maxLength":200,"description":"Context around the marker, echoed back."}},"required":["label","page","x","y"]},"maxItems":500},"notes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":20,"minLength":1,"description":"Label as printed in the note."},"page":{"type":"integer","minimum":1,"maximum":100000},"x":{"type":"number","minimum":-1000000,"maximum":1000000},"y":{"type":"number","minimum":-1000000,"maximum":1000000},"text":{"type":"string","maxLength":5000}},"required":["label","page","x","y","text"]},"maxItems":500},"yAxis":{"type":"string","enum":["down","up"],"description":"Direction of increasing y: down (PDF.js, screen) or up (PDF user space). Default down."},"allowNextPage":{"type":"boolean","description":"A note may sit on the page after its marker. Default false."}}},"example":{"markers":[{"label":"1","page":3,"x":200,"y":140},{"label":"2","page":3,"x":90,"y":400}],"notes":[{"label":"1","page":3,"x":72,"y":700,"text":"First note."},{"label":"2","page":3,"x":72,"y":720,"text":"Second note."}]}}}},"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."},"attachments":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"marker":{"type":"integer"},"note":{"type":"integer"},"label":{"type":"string"},"page":{"type":"integer"},"method":{"type":"string","enum":["label-page","label-order","next-page"]}}},"maxItems":500},"unattachedMarkers":{"type":"array","items":{"type":"integer"},"maxItems":500},"unattachedNotes":{"type":"array","items":{"type":"integer"},"maxItems":500},"ambiguousGroups":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string"},"page":{"type":"integer"},"markers":{"type":"integer"},"notes":{"type":"integer"}}},"maxItems":500},"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/footnote-attach/","docsJson":"https://agents.writerslogic.com/docs/footnote-attach.json","sample":"https://agents.writerslogic.com/api/v1/samples/footnote-attach","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"}}