Quickstart

One API and a hosted MCP server: find the open tenders and grants that fit a company, see who holds the work now, and run the document, text and evidence checks a bid needs. Free to start, no key needed.

Find open tenders

GET /v1/tenders is free and needs no key. Filter by jurisdiction (a country or a state), tier, category, buyer, closing date or keyword; add kind=grant for grants.

bash
curl "https://www.stipple.sh/v1/tenders?jurisdiction=AU-QLD&q=road&limit=2"

The response, as captured on 15 September 2026:

json
{
  "total": 15,
  "results": [
    {
      "title": "RFT260091 - Capella Rubyvale Road Upgrade CH 47.3 - 48.6",
      "buyer": "CENTRAL HIGHLANDS REGIONAL COUNCIL",
      "jurisdiction": "AU-QLD",
      "tier": "council",
      "closing_date": "2026-09-21",
      "source_tag": "VendorPanel",
      "link": "https://www.vendorpanel.com.au/PublicTenderAccess.aspx?id=...",
      "tender_key": "17d2cc3cca27d22ef5874d9be40ab210"
    }
  ],
  "coverage": { "sources_total": 23, "sources_empty": [ ... ], "last_run": "2026-09-14T12:32:04+00:00" }
}
Read coverage before you say "there are none". It names the sources searched and the ones that returned nothing — login walls, blocked hosts, empty runs — so an empty result means "no match in what we searched", never "no such tender exists".

Who holds the work now

Take the buyer a tender publishes and ask GET /v1/awards/buyers/lookup: what they have awarded, the value quartiles, the response window they usually give, the contracts ending within 12 months and their planned procurements — rolled up nightly from AusTender and the Queensland contract disclosure reports.

bash
curl "https://www.stipple.sh/v1/awards/buyers/lookup?name=Transport%20for%20NSW&jurisdiction=AU-NSW"
json
{
  "buyer": {
    "name": "Transport for NSW", "buyer_key": "...", "window_from": "2024-09-15",
    "award_count": 118, "median_value": 74000, "p25_value": 20000, "p75_value": 310000,
    "value_currency": "AUD", "median_response_days": 24.4, "expiring_12m": 3, "planned_12m": 1
  },
  "expiring": [ { "contract_id": "CN...", "title": "...", "supplier": "", "value_amount": 1200000,
                  "value_currency": "AUD", "end_date": "2027-03-01", "url": "..." } ],
  "planned": [ ... ], "recent_awards": [ ... ], "top_suppliers": [ ... ],
  "computed_at": "2026-09-15T02:00:00+00:00",
  "sources": [ { "attribution": "AusTender (Department of Finance), CC BY 3.0 AU" }, ... ],
  "withheld": 3,
  "withheld_reason": "Sign in to see who holds these contracts."
}
Counts, values, dates and buyers are public. The supplier or incumbent name is shown to a signed-in caller — a free key or a session — and withheld from an anonymous one; withheld_reason carries the sentence to show. Every payload says the night its figures are true for in computed_at. The same data, and the same rule, is on the MCP tools buyer_awards and find_signals.

Fact-check a report by URL

Point POST /v1/verify-references at any public report or article. Stipple fetches it, resolves every citation, recomputes the document's own arithmetic, and returns a structured verdict with a shareable permalink.

bash
curl -X POST https://www.stipple.sh/v1/verify-references \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/report.pdf"}'

The response is a trust summary plus per-item tables:

json
{
  "summary": {
    "references_total": 63,
    "references_live": 57,
    "references_archived": 3,
    "references_dead": 3,
    "papers_mismatched": 1,
    "internal_issues": 0,
    "headline": "60/63 citations resolve; 1 mis-attributed paper; 3 dead links"
  },
  "references": [ ... ],
  "claims": [ ... ],
  "internal_consistency": [ ... ],
  "limitations": "Reports verification coverage, not truth. ...",
  "check_id": "fc_6d22fb4033cbac40",
  "permalink": "https://www.stipple.sh/fc/targeted-compliance-framework-review-6d22fb4033cbac40"
}
Results report verification coverage, not truth: "supported" means evidence-backed, "unsupported" means no evidence found. The tool shows a reviewer where to look — it never certifies a document.

Verify a document for tampering

Upload a PDF or image to POST /v1/warrants for forensic inspection — tampering signals, structure and metadata analysis, arithmetic reconciliation. You get back a warrant: a risk band, findings, and a shareable record.

bash
curl -X POST https://www.stipple.sh/v1/warrants \
  -F "file=@payslip.pdf"

Detect AI-written text

Send prose (or a URL or file) to POST /v1/detect-ai-text. It returns a probability with the specific tells, and abstains on non-prose documents where style detection is unreliable.

bash
curl -X POST https://www.stipple.sh/v1/detect-ai-text \
  -H "Content-Type: application/json" \
  -d '{"text": "Paste the prose you want to check here..."}'

Verify identity (AU 100-point)

Send a person's identity documents to POST /v1/identity-check. A reader identifies each one and the fields it shows; a deterministic engine tallies them against the Australian 100-point check (or the AUSTRAC safe-harbour rules) and tells you whether identity is established — and exactly what's missing if not. Coverage, not a forgery judgment.

bash
curl -X POST "https://www.stipple.sh/v1/identity-check?scheme=afp_100_point" \
  -F "files=@passport.pdf" -F "files=@licence.pdf"

Test for free (sandbox)

Add ?sandbox=true (or the header Stp-Sandbox: true) to any tool for a deterministic, clearly-labelled fixture response — no engine work, and it never counts against your weekly limit. Every sandbox response carries "sandbox": true, so you can wire and test an integration before sending a single real document.

bash
curl -X POST "https://www.stipple.sh/v1/extract?sandbox=true" \
  -H "Content-Type: application/json" -d '{}'
# -> { "sandbox": true, "mode": "template", "document_type": "payslip", "fields": {...} }

Get your own key

Keys are minted from your signed-in account and share its weekly limit — sign in free (no card) and the key arrives instantly.

Keys belong to your account and share its free weekly limit, with usage metering built in.

Limits

Every tool is free and rate-limited: a weekly cap of checks applies, with or without an account (short bursts up to 10 requests, 25 MB max upload). API keys belong to your account and share its weekly limit. Current limits: GET /v1/pricing. Details in Errors & limits.

Next steps

  • Task-based execution playbooks — copy-paste recipes for payslip verification, bank tables, 100-point KYC, fact-checking, and checklists.
  • Use cases by industry — the workflow each call solves: onboarding, lending, claims, rentals, HR, and more.
  • API reference — every endpoint, parameter, and response shape.
  • MCP integration — give Claude, Cursor, or your own agent these tools natively.
  • agents.md — the machine-readable guide AI agents read directly.
  • OpenAPI spec — the machine-readable contract; generate a typed client or import it into your tooling.