Skip to main content

Build on Trooth.

Low-level system integration parameters and API protocols for engineering teams. Every example below runs against the live API at api.trooth.co.

In one lineOne protocol, four ways to build on it: CLI, GitHub Action, embeddable badge, and a single API call.

bash

# No key, no account. The public profile is open.

curl -s https://api.trooth.co/public/trust/acme-ai

{ "slug": "acme-ai", "score": 92, "witnessed_at": "..." }

# Or install the CLI and scan a plan.

npm install -g trooth

trooth scan plan.json

Quickstart

The public Trust Profile API needs no key or account. It returns the signed, public posture for any company by slug. Authenticated endpoints (your dashboard, webhooks) use a Bearer token issued with your API plan. Trooth automates. Trooth never signs.

curl https://api.trooth.co/public/trust/your-co

Ready for authenticated calls? Grab a key and see rate limits on the API reference.

Architecture

Every value the API returns came through this path. Select a node to see what it receives, what it emits, and what it is unable to do.

Topology

↺ The whole path repeats on a schedule, which is why a profile does not go stale.

Inspector01 / 6

Your stack

Cloud accounts, identity providers, repositories and endpoints, connected with read-only grants you approve one at a time.

Cannot

Cannot be written to. No write scope is requested, so Trooth is unable to change the systems it reports on.

Payload shape

{  "connector": "aws",  "grant": "read-only",  "scopes": ["describe*", "list*", "get*"],  "write_scopes": []}

Shapes are real; the values are an illustrative sample, not anyone's account.

Public Trust Profile API

GET /public/trust/:slug returns a company's public, signed Trust Profile as JSON: tier, Trust Score, framework coverage, and the last witnessed time. Public and unauthenticated.

Get/public/trust/
curl -s https://api.trooth.co/public/trust/acme-ai \
  -H "Accept: application/json"
Response

Press Run. Nothing is shown here until a real response comes back, so this pane never displays a payload the API did not send.

Calls api.trooth.co directly from your browser. Public, unauthenticated, 60 reads per minute per IP.

View the live sample profile

Trust Badge

Drop a live, self-updating Trust Badge anywhere. Paste the embed where you want it to appear. It reads your public profile and re-renders automatically; no redeploy needed.

html
<div id="trooth-trust-badge" data-slug="your-co"></div>
<script src="https://trooth.co/badge.js"></script>
Rendered badgeInteractive
data-slug="acme-ai"

This loads the real badge.js. A slug with no published profile may render nothing yet, but the script is live regardless.

The badge on the right is rendered by the embed on the left, reading a real public profile.

Full install steps and placement tips are on the badge install page.

CLI

Run a report-only compliance scan against any framework straight from your terminal or CI. It never applies changes and never signs on your behalf. The scan posts to POST /v1/grc/scan and returns the same witnessed evidence the dashboard reads.

bash

# Published to npm as `trooth`. Zero dependencies, Node 18+.

npm install -g trooth

trooth --version

0.1.0

# No install. Advisory and report-only; nothing is ever applied.
terraform show -json plan.tfplan > plan.json
npx trooth scan plan.json

Flags, CI wiring and the full command reference are on the CLI page.

GitHub Action

Run the same advisory preflight on every pull request. It posts the plan to /v1/preflight and is report-only by default, so it never blocks a merge.

yaml
# .github/workflows/trooth.yml
- name: Trooth compliance scan
  uses: troothllc/trooth-action@v1
  with:
    api-key: ${{ secrets.TROOTH_API_KEY }}
    plan-file: plan.json
    fail-on: none   # report-only; set critical/high/medium/low to gate

Webhooks

Subscribe to state changes and Trooth will POST a JSON event to your endpoint. Manage endpoints from your dashboard.

EventFires when
trust.score.changedYour Trust Score moved up or down.
control.witnessedA control was (re)witnessed by a scan.
profile.viewedA buyer opened your public Trust Profile.
profile.requestedA buyer asked you to publish a profile.

Each event shares one envelope; the data.object varies by type.

{
  "id": "evt_01J8Z9K2QH4B7C",
  "type": "trust.score.changed",
  "created": 1785340800,
  "api_version": "2026-08-02",
  "data": { "object": {
    "profile": "acme-ai",
    "previous_score": 78,
    "current_score": 84,
    "tier": "silver",
    "changed_controls": ["soc2.cc6.1"]
  } }
}

The legacy name control.verified is accepted as an alias when registering webhooks.

Every delivery is signed. The X-Trooth-Signature header is an HMAC-SHA256 of the raw request body, keyed with your endpoint's signing secret. Compute the same HMAC and compare in constant time before trusting a payload.

import crypto from "node:crypto";

// Verify the X-Trooth-Signature header against the raw request body.
export function verifyTrooth(rawBody, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(rawBody, "utf8")
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature),
  );
}

Use of the Trooth API is subject to the Terms of Service.