Public JSON, no key
API reference
Every read is public and cacheable, because the corpus is a static versioned body of doctrine. The four POST endpoints run the scoring rubrics: they compute, they never store.
Base URL
https://intel.bowtiekreative.com
Responses are JSON unless you ask for format=markdown. Reads carry
cache-control: public, max-age=300, stale-while-revalidate=86400; scoring
responses carry no-store. CORS is open for GET and POST.
Endpoints
Index and health
| Method | Path | Purpose |
|---|---|---|
GET | /v1 | Service index |
GET | /v1/health | Liveness, corpus counts and registry integrity |
GET | /v1/openapi.json | OpenAPI 3.1 description of this API |
GET | /v1/manifest | Version, research baseline, operating rules and inventory |
GET | /v1/integrity | Which typed collections resolved against the corpus |
docs
| Method | Path | Purpose |
|---|---|---|
GET | /v1/docs | The 23 source documents |
GET | /v1/docs/{slug} | One document as blocks, or raw Markdown with format=markdown |
GET | /v1/docs/{slug}/sections | Section outline for a document |
GET | /v1/docs/{slug}/sections/{anchor} | One section with its blocks |
tables
| Method | Path | Purpose |
|---|---|---|
GET | /v1/tables | Every table in the corpus |
GET | /v1/tables/{id} | One table with headers and rows |
code
| Method | Path | Purpose |
|---|---|---|
GET | /v1/code | Every fenced block: grammars, formulas, contracts and prompts |
GET | /v1/code/{id} | One fenced block |
laka
| Method | Path | Purpose |
|---|---|---|
GET | /v1/laka | The four-layer grammar: states, variables, dynamics, execution impact |
GET | /v1/laka/lenses | Enumerate the 216-lens expansion cube |
collections
| Method | Path | Purpose |
|---|---|---|
GET | /v1/collections | The typed lookup collections |
GET | /v1/collections/{name} | One collection with its records and source pointer |
phases
| Method | Path | Purpose |
|---|---|---|
GET | /v1/phases | The nine audit phases, preflight and final synthesis |
GET | /v1/phases/{id} | One phase with questions, method, controls and deliverables |
workflows
| Method | Path | Purpose |
|---|---|---|
GET | /v1/workflows | W0-W12, the end-to-end automation workflow |
GET | /v1/workflows/{id} | One workflow stage |
agents
| Method | Path | Purpose |
|---|---|---|
GET | /v1/agents | The multi-agent prompt pack |
GET | /v1/agents/{id} | One agent prompt, verbatim |
guardrails
| Method | Path | Purpose |
|---|---|---|
GET | /v1/guardrails | Legal, privacy and safety guardrails, filterable by jurisdiction |
GET | /v1/guardrails/{id} | One guardrail section |
checklists
| Method | Path | Purpose |
|---|---|---|
GET | /v1/checklists | Every acceptance checklist in the corpus |
GET | /v1/checklists/{id} | One checklist |
libraries
| Method | Path | Purpose |
|---|---|---|
GET | /v1/libraries | The five tool libraries and their categories |
tools
| Method | Path | Purpose |
|---|---|---|
GET | /v1/tools | Search and filter the tool registry |
GET | /v1/tools/{id} | One tool or source with its attributes and official links |
financial models
| Method | Path | Purpose |
|---|---|---|
GET | /v1/financial-models | The twenty financial impact models |
GET | /v1/financial-models/{id} | One model with its formula and constraints |
scoring
| Method | Path | Purpose |
|---|---|---|
GET | /v1/scoring | The four scoring rubrics and their input schemas |
GET | /v1/scoring/{rubric} | One rubric: dimensions, weights, gates and bands |
score
| Method | Path | Purpose |
|---|---|---|
POST | /v1/score/{rubric} | Score a finding, opportunity, outreach draft or lead |
search
| Method | Path | Purpose |
|---|---|---|
GET | /v1/search | Search documents, sections, tools, phases, agents and records |
Worked examples
Which lenses stay inside passive collection?
curl "https://intel.bowtiekreative.com/v1/laka/lenses?impact=I1&interrogative=Why"
{
"cube_size": 216,
"count": 6,
"results": [
{
"id": "why.direction.i1",
"interrogative": "Why",
"modifier": "Direction",
"impact": "I1",
"impact_state": "Read-only",
"permission": "Public-source retrieval and passive observation; default allowed",
"passive_default": true
}
]
}
Find a passive certificate-transparency source
curl "https://intel.bowtiekreative.com/v1/tools?library=05&q=certificate"
{
"count": 2,
"results": [
{
"id": "cert-spotter",
"name": "Cert Spotter",
"library": "Technical and passive OSINT",
"category": "Open-source components",
"status": "MPL-2.0"
}
]
}
Score a finding, with one dimension left unscored
curl -X POST "https://intel.bowtiekreative.com/v1/score/finding" \
-H 'content-type: application/json' \
-d '{"evidence":5,"entity_resolution":5,"recency":3,"directness":5,"independence":3}'
{
"rubric": "finding",
"complete": false,
"score": null,
"needs_input": [
{
"key": "contradiction_check",
"label": "Contradiction check",
"scale": {
"min": 0,
"max": 5
}
}
],
"note": "Supply every dimension; an absent dimension is not a zero."
}
An opportunity that scores well and is blocked anyway
curl -X POST "https://intel.bowtiekreative.com/v1/score/opportunity" \
-H 'content-type: application/json' \
-d '{"dimensions":{...},"confidence":"high","gates":{"identity_resolved":false}}'
{
"rubric": "opportunity",
"blocked": true,
"base_score": 78,
"verdict": "BLOCK - a hard gate failed; the numeric score does not apply"
}
Errors
| Status | Shape | When |
|---|---|---|
404 | { error: "not_found", kind, id } | No record with that id. Collection and rubric 404s also list what is available. |
400 | { error: "request_error", message, details } | A scoring dimension was not a number, or fell outside its scale. |
500 | { error: "internal_error", message } | Unexpected failure; the request id is in the server log. |
A missing scoring input is not an error. It comes back as complete: false with
the outstanding dimensions under needs_input, because an absent judgement and a
judgement of zero are different claims.