Bow Tie Kreative Intel System

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

index
MethodPathPurpose
GET/v1Service index
GET/v1/healthLiveness, corpus counts and registry integrity
GET/v1/openapi.jsonOpenAPI 3.1 description of this API
GET/v1/manifestVersion, research baseline, operating rules and inventory
GET/v1/integrityWhich typed collections resolved against the corpus

docs

docs
MethodPathPurpose
GET/v1/docsThe 23 source documents
GET/v1/docs/{slug}One document as blocks, or raw Markdown with format=markdown
GET/v1/docs/{slug}/sectionsSection outline for a document
GET/v1/docs/{slug}/sections/{anchor}One section with its blocks

tables

tables
MethodPathPurpose
GET/v1/tablesEvery table in the corpus
GET/v1/tables/{id}One table with headers and rows

code

code
MethodPathPurpose
GET/v1/codeEvery fenced block: grammars, formulas, contracts and prompts
GET/v1/code/{id}One fenced block

laka

laka
MethodPathPurpose
GET/v1/lakaThe four-layer grammar: states, variables, dynamics, execution impact
GET/v1/laka/lensesEnumerate the 216-lens expansion cube

collections

collections
MethodPathPurpose
GET/v1/collectionsThe typed lookup collections
GET/v1/collections/{name}One collection with its records and source pointer

phases

phases
MethodPathPurpose
GET/v1/phasesThe nine audit phases, preflight and final synthesis
GET/v1/phases/{id}One phase with questions, method, controls and deliverables

workflows

workflows
MethodPathPurpose
GET/v1/workflowsW0-W12, the end-to-end automation workflow
GET/v1/workflows/{id}One workflow stage

agents

agents
MethodPathPurpose
GET/v1/agentsThe multi-agent prompt pack
GET/v1/agents/{id}One agent prompt, verbatim

guardrails

guardrails
MethodPathPurpose
GET/v1/guardrailsLegal, privacy and safety guardrails, filterable by jurisdiction
GET/v1/guardrails/{id}One guardrail section

checklists

checklists
MethodPathPurpose
GET/v1/checklistsEvery acceptance checklist in the corpus
GET/v1/checklists/{id}One checklist

libraries

libraries
MethodPathPurpose
GET/v1/librariesThe five tool libraries and their categories

tools

tools
MethodPathPurpose
GET/v1/toolsSearch and filter the tool registry
GET/v1/tools/{id}One tool or source with its attributes and official links

financial models

financial-models
MethodPathPurpose
GET/v1/financial-modelsThe twenty financial impact models
GET/v1/financial-models/{id}One model with its formula and constraints

scoring

scoring
MethodPathPurpose
GET/v1/scoringThe four scoring rubrics and their input schemas
GET/v1/scoring/{rubric}One rubric: dimensions, weights, gates and bands

score

score
MethodPathPurpose
POST/v1/score/{rubric}Score a finding, opportunity, outreach draft or lead

search

search
MethodPathPurpose
GET/v1/searchSearch 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

Error responses
StatusShapeWhen
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.