WritersLogic Verifiable AI Agent Hub Verify Milestone API
The Verify Milestone API from WritersLogic Verifiable AI Agent Hub — 1 operation(s) for verify milestone.
The Verify Milestone API from WritersLogic Verifiable AI Agent Hub — 1 operation(s) for verify milestone.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/writerslogic-com:writerslogic-com-verify-milestone-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: WritersLogic Verifiable AI Agent Hub Verify Milestone API
version: 2.0.0
description: Pay-per-call agents settled in USDC on Base via x402. Every response carries a signed provenance envelope.
contact:
name: WritersLogic
url: https://writerslogic.com/agents
email: agents@writerslogic.com
servers:
- url: https://agents.writerslogic.com
tags:
- name: Verify Milestone
paths:
/api/v1/verify-milestone:
post:
operationId: milestone_verifier
summary: Grant Milestone Verifier with Signed Release Attestation
description: 'Decides whether a grantee met a milestone before a DAO releases the next tranche or stream. Checks GitHub as of the due date (commits, tags, releases, CI, files), npm/PyPI/crates.io publish times, Snapshot proposal state, on-chain deployments (bytecode selector scan through proxies, Sourcify, creation transaction), and URLs; judges the rest with an ensemble plus a skeptical reviewer, reads Sablier Lockup streams on-chain, and returns a decision headline, a per-criterion PASS/FAIL/UNVERIFIABLE verdict, releaseBps, and an EIP-712 signed attestation. Advisory: it never moves funds, and if a source such as GitHub is unreachable those criteria come back UNVERIFIABLE in a signed partial result instead of an error.
Price: 2.00 USDC on Base (x402).'
x-x402-price-usdc: '2.00'
x-x402-amount: '2000000'
x-payment-info:
protocols:
- x402
price:
mode: fixed
currency: USD
amount: '2.00'
x-audience: crypto
x-sample-url: https://agents.writerslogic.com/api/v1/samples/milestone-verifier
security:
- x402: []
- apiKey: []
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- milestone
- evidence
properties:
milestone:
type: object
additionalProperties: false
required:
- title
- acceptanceCriteria
- dueDate
properties:
title:
type: string
minLength: 1
maxLength: 300
acceptanceCriteria:
type: array
minItems: 1
maxItems: 12
items:
type: string
minLength: 1
maxLength: 1000
dueDate:
type: string
minLength: 10
maxLength: 40
description: ISO 8601 date or timestamp. A date means end of that day UTC. GitHub, registry, Snapshot and contract checks are evaluated as of this instant.
windowStart:
type: string
minLength: 10
maxLength: 40
description: Optional ISO 8601 start of the milestone period. Needed to decide "commits/releases/packages during the period" criteria; without it those are left to the judge.
evidence:
type: object
additionalProperties: false
properties:
repoUrl:
type: string
maxLength: 200
description: 'https://github.com/<owner>/<repo>. A link copied from GitHub also works: .../tree/<branch>, .../releases/tag/<tag> or .../commit/<sha> sets ref when ref is omitted.'
ref:
type: string
maxLength: 200
description: Branch, tag or commit, or a commit range base...head.
deployments:
type: array
maxItems: 8
items:
type: object
additionalProperties: false
required:
- chain
- address
properties:
chain:
type: string
enum:
- ethereum
- base
- polygon
- arbitrum
- optimism
address:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
expectedFunctions:
type: array
maxItems: 24
items:
type: string
minLength: 3
maxLength: 300
description: Function signatures, e.g. transfer(address,uint256).
urls:
type: array
maxItems: 8
items:
type: string
minLength: 8
maxLength: 500
payout:
type: object
additionalProperties: false
required:
- protocol
- chain
- amountTotal
properties:
protocol:
type: string
enum:
- sablier
- superfluid
- transfer
chain:
type: string
enum:
- ethereum
- base
- polygon
- arbitrum
- optimism
streamId:
type: string
pattern: ^[0-9]{1,78}$
lockup:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
description: SablierLockup address; required to disambiguate when several versions hold the stream id.
recipient:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
amountTotal:
type: string
pattern: ^[0-9]{1,78}$
description: Tranche value in token base units.
releasePolicy:
type: object
additionalProperties: false
required:
- mode
properties:
mode:
type: string
enum:
- all_or_nothing
- proportional
description: Default all_or_nothing.
example:
milestone:
title: Maintenance and ecosystem support
acceptanceCriteria:
- A tagged release v0.2.0 is published
- A changelog is maintained in the repository
- Continuous integration passes on the main branch
- Public documentation describes ArbSys and ArbGasInfo local support
dueDate: '2026-02-28'
evidence:
repoUrl: https://github.com/Supercoolkayy/Ox-rollup
ref: main
deployments:
- chain: arbitrum
address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831'
expectedFunctions:
- transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
urls:
- https://www.ox-rollup.com/docs/01-overview
payout:
protocol: sablier
chain: ethereum
streamId: '3'
lockup: '0xcF8ce57fa442ba50aCbC57147a62aD03873FfA73'
recipient: '0xc616B2449E9765EDF9FFb485Da42420971299519'
amountTotal: '1000000000000000000000'
releasePolicy:
mode: proportional
responses:
'200':
description: Paid result with provenance
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
headline:
type: object
description: 'Decision first: the verdict, the dollars at stake, confidence and the exact next step.'
properties:
decision:
type: string
enum:
- MILESTONE_MET
- MILESTONE_PARTIALLY_MET
- MILESTONE_NOT_MET
- INCONCLUSIVE
- PAYOUT_BLOCKED
summary:
type: string
amountAtStakeUsd:
anyOf:
- type: number
- type: 'null'
description: Dollars saved or recoverable if the recommended action succeeds; null when it cannot be computed from the input.
amountBasis:
type: string
confidence:
type: string
enum:
- high
- medium
- low
nextStep:
type: string
status:
type: string
enum:
- complete
- partial
description: partial when an evidence source (for example GitHub, when rate limited) could not be read; its criteria are then UNVERIFIABLE.
missing:
type: array
items:
type: string
disclaimer:
type: string
githubRequests:
type: object
description: GitHub REST calls spent by this run, whether they were authenticated, the hourly limit that applies, and whether the run hit it.
verdict:
type: string
enum:
- PASS
- PARTIAL
- FAIL
- INSUFFICIENT_EVIDENCE
- PAYOUT_BLOCKED
releaseBps:
type: integer
description: Share of the tranche to release, 0-10000.
releaseAmount:
anyOf:
- type: string
- type: 'null'
description: floor(amountTotal * releaseBps / 10000) in base units, capped at the stream's remaining balance; null without a payout.
confidence:
type: string
enum:
- low
- medium
- high
criteria:
type: array
items:
type: object
properties:
index:
type: integer
criterion:
type: string
verdict:
type: string
enum:
- PASS
- FAIL
- UNVERIFIABLE
claims:
type: array
items:
type: object
whatWouldChange:
type: array
items:
type: string
payout:
anyOf:
- type: object
- type: 'null'
evidenceSummary:
type: object
provenance:
type: object
description: decidedBy (deterministic, mixed or ensemble), claim counts per path, and an upper bound on model calls made (1 decomposition call, plus 3 judge samples and 1 skeptic call only when some claim needed judgment).
milestoneHash:
type: string
description: keccak256 of the canonical JSON of {milestone, evidence}.
attestation:
type: object
description: 'EIP-712 MilestoneAttestation: signed, signature, signer, digest, typedData and typedDataV4. Unsigned (signed:false) when the agent has no attestation key.'
warnings:
type: array
items:
type: string
_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
tags:
- Verify Milestone
components:
securitySchemes:
x402:
type: apiKey
in: header
name: PAYMENT-SIGNATURE
description: x402 v2 payment payload (base64) sent after a 402 challenge
apiKey:
type: apiKey
in: header
name: X-API-KEY