Skip to main content

Developers

Query the Decision Insights Registry from your own code or your own agent: companies, open source projects, technology terms and dated records, each linked to its primary source.

Quickstart

Pick one. None of them needs an account.

Connect your agent

Over MCP, at one of two addresses with the same tools.

Anonymous version
claude mcp add --transport http decision-insights https://mcp.decisioninsights.ai/api/mcp-public

No account, no sign-in, anonymous limits. Then ask: Who are Arista Networks' peers? Every client's block is on Agents & MCP.

With your account
claude mcp add --transport http decision-insights https://mcp.decisioninsights.ai/api/mcp-account

Coming: this address goes live with the signed-in server release. Until then, sign in by adding ?auth=oauth to the anonymous URL. Free or paid. Run /mcp in Claude Code to sign in once, and your plan's limits apply. Upgrading never changes the URL.

Call the REST API

One request, no key.

cURL
curl "https://api.decisioninsights.ai/api/public/v1/search?q=SASE"

Returns the companies, records and terms that match, newest records first.

Use the CLI

Install it, then run any command.

CLI
npm i -g @wiretap/decision-insights-cli
di get-company --website netskope.com

Needs Node 18 or newer. Returns the Listing: website, location, description, themes, topics and recent records.

Accounts and sign-in

There is no API key to request. With no credential you are served at the anonymous tier. That is supported, not an error.

A free account raises your limits and opens the rest of the REST API and every CLI command. Choose a plan on Pricing, including the free one. Use your work address at your company's domain: the domain attaches the account to your company, so free mailboxes are refused. Then open the link we email you. It verifies the address and signs you in.

Signed in, you send an OAuth access token in an Authorization header: Bearer YOUR_TOKEN. An x-api-key header carrying the token is accepted too. di login and an assistant's sign-in prompt get a token for you. Writing your own client is covered under Signing in over OAuth, below.

Rate limits

Limits are per caller, per minute and per day. They rise when you sign in.

Plan Per minute Per day How you get it
No sign-in 5 25 The anonymous version: no account, no sign-in. Ranked lists, such as peers, show their first rows and say how many were held back.
Free 10 100 Your account on the free plan, signed in. Lists come back in full.
Individual 30 1,000 Your account on this plan, signed in. Lists come back in full.
Team 60 5,000 Your account on this plan, signed in. Lists come back in full.
Enterprise By contract By contract Your account on this plan, signed in, with limits set in your contract. Lists come back in full.

This table is read from the server that enforces the limits, so it changes when they do. Every reply also states yours: X-DI-Tier is the tier you got, X-RateLimit-Limit the per minute ceiling, and X-RateLimit-Remaining what is left.

Over the limit, you get a 429 with Retry-After in seconds. Wait that long before you retry. Paid plans raise the limits: see Pricing.

Common patterns

More calls, each run as shown.

Look up a company

One company's Listing, by its website or its id.

CLI
di get-company --website netskope.com

Returns website, location, description, themes, topics and recent records. No account needed.

cURL
curl https://api.decisioninsights.ai/api/public/v1/companies/edc9173b-5856-41a5-932f-082923f4ecf8

Returns uuid, name, website, description, location, themes, topics, projects, peers and recent_content. /search?q= finds a company's uuid. No account needed.

MCP
curl -X POST https://mcp.decisioninsights.ai/api/mcp-public \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"di_get_company","arguments":{"website":"netskope.com"}}}'

The same record over MCP, as the di_get_company tool returns it. No account needed.

Get a category's companies

Find the category's id, then list the companies filed under it.

cURL
curl "https://api.decisioninsights.ai/api/public/v1/industries?q=SASE"

Returns each matching category with its id, its path and how many companies it holds. No account needed.

MCP
curl -X POST https://mcp.decisioninsights.ai/api/mcp-public \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"di_search_companies","arguments":{"industry":"information-technology/cybersecurity/network-security/sase-sse-zero-trust-network-access","limit":10}}}'

Returns the companies in that category and total_matches, the category's full count. No account needed.

Get a category's latest records

Dated records about a category, newest first, each linked to its source.

CLI
di search-content "SASE" --limit 5

Returns each record's title, source, published date and uuid.

cURL
curl "https://api.decisioninsights.ai/api/public/v1/search?q=SASE"

The content array lists records newest first, each with title, url, original_url, source_type and published_at. No account needed.

Define a term

A glossary term's definition and the companies behind it.

CLI
di get-glossary --slug vector-database

Returns the definition and the companies with the most records on the term.

MCP
curl -X POST https://mcp.decisioninsights.ai/api/mcp-public \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"di_get_term","arguments":{"slug":"vector-database"}}}'

Returns name, definition, content_volume and top_companies. No account needed.

Connect an assistant over MCP

No signup. Your assistant can then ask the registry directly.

Claude Code
claude mcp add --transport http decision-insights https://mcp.decisioninsights.ai/api/mcp-public

One line in a terminal. The server speaks Streamable HTTP, so a client that accepts a URL needs nothing else.

Config file
{
  "mcpServers": {
    "decision-insights": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.decisioninsights.ai/api/mcp-public"]
    }
  }
}

For a desktop assistant that reads an MCP config file and runs a local command. It needs Node 18 or newer.

Base URL

https://api.decisioninsights.ai/api/public/v1

Endpoints

With no account, /search, /companies/{uuid} and /industries answer. The rest need a free account, signed in. Each takes a required query parameter, and a request without it returns a 400 naming the one that is missing.

ResourceSearchOne record
CompaniesGET /companies?domain=example.comGET /companies/{uuid}
Open source projectsGET /projects?q=GET /projects/{uuid}
ContentGET /content?q=GET /content/{uuid}
TermsGET /glossary?q=GET /glossary/{uuid}
Everything at onceGET /search?q=

/companies looks a company up by its own domain. With a keyword instead, use /search.

Beyond the obvious fields: a company record lists the open source projects it owns as projects, with projects_total and projects_truncated saying when the list is a subset. A content record lists the companies the article mentions as mentioned_companies, each with the @id its own record publishes, plus mentioned_companies_total, mentioned_companies_truncated and mentions_extraction. That last one says mentions come from automated name extraction and may include false positives. A content record also carries subject_company_id, project_refs and canonical_url. A project record names its owning company as owner_organization_id, an identifier you can dereference.

The same endpoints are described as OpenAPI at https://decisioninsights.ai/openapi.json, so a client can generate itself.

Endpoints that act on your account

These need an access token and work on your own account.

Watch listsGET and POST /watch-lists
Watch list membersGET and POST /watch-lists/{id}/members, DELETE /watch-lists/{id}/members/{member_id}
WebhooksPOST /webhooks

Watch lists follow a set of companies. Webhooks notify you instead of making you poll. If your account reaches more than one organization, add ?organizationUuid= to say which. A request that leaves it ambiguous returns a 403 listing the ones you can choose.

Signing in over OAuth

For anyone writing their own client. Three cases, and they differ. No Authorization header: served at the anonymous tier. A header we cannot recognise: 401 invalid_token, naming what arrived and what we accept. A token we could not check because our identity service was unreachable: served at the anonymous tier, so the request still succeeds.

Tokens are issued by https://my.decisioninsights.ai. Its metadata is at https://my.decisioninsights.ai/.well-known/oauth-authorization-server, so a client can configure itself. This site's resource metadata, at https://decisioninsights.ai/.well-known/oauth-protected-resource, names that issuer.

The MCP endpoint is a separate resource with its own metadata, at https://mcp.decisioninsights.ai/.well-known/oauth-protected-resource. It names the same issuer. Follow the authorization_servers in the document for the resource you are calling. One credential works for both.

Registering a client

You do not need to ask us. POST https://my.decisioninsights.ai/oauth2/register is dynamic client registration (RFC 7591). It takes no credential and is rate limited. Send client_name, redirect_uris and token_endpoint_auth_method. A command line tool or desktop app should send none and keep no secret: PKCE is the proof instead, and only S256 is accepted.

Redirect URIs must match exactly, so register every one you might use, each loopback port included.

Which grant you get

authorization_code is what a self-registered client always gets. A person signs in once in a browser, the token comes back to your redirect URI, and it renews itself with refresh_token. That is the grant behind di login and an assistant's sign-in prompt. The scope is profile, which is what reading the registry needs.

client_credentials is in the metadata, but you cannot self-register into it. It is for a first-party service acting on a whole account, so those clients are created by hand. A registration that asks for it is still created as an authorization code client, so read grant_types in the response. If you need one, talk to us.

The authorization server serves other products too, and its metadata lists their scopes beside profile. A self-registered client cannot hold them.

Command line

The CLI is @wiretap/decision-insights-cli on npm. It installs a command named di and needs Node 18 or newer. Each command is one MCP tool call, so it returns the same records as the API and MCP. With no account it runs the search commands, get-company and list-industries. The rest need a free account: di login signs you in and raises your limits to your plan's.

MCP

The same data is served over MCP at two addresses, with the same tools. https://mcp.decisioninsights.ai/api/mcp-public is the anonymous version: no account, no sign-in, anonymous limits. The address for your account, Free or paid, is in the Quickstart above: sign in once and your plan's limits apply, and upgrading never changes the URL. To set up an assistant, with a block for each client and the ten tools, see Agents & MCP.

Attribution

Every record carries the link to its primary source. If you surface a record, carry that link with it.

For crawlers and agent builders: every discovery file

How an agent finds Decision Insights on its own. Every line can be checked in a browser or a terminal.

  • llms.txt at the site root, and sitemaps
  • robots.txt allows GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, CCBot and Google-Extended. It declares Content-Signal: search=yes,ai-input=yes,ai-train=yes for each of them and for every other crawler, so search, AI input and AI training are all permitted
  • schema.org on every page: Organization, DefinedTerm, SoftwareSourceCode, and NewsArticle or BlogPosting carrying isBasedOn
  • agent-card.json, naming the MCP endpoint and its ten tools
  • /.well-known/agents.json, one document naming the MCP endpoint, the agent card, the skills index and the feeds. No schema for this is ratified yet, so the shape is ours, and the document says so
  • /.well-known/agent-skills/index.json, two Agent Skills: one for researching over MCP, one for bulk download over plain HTTP. Each carries a sha256 digest of its skill
  • /.well-known/ard.json, an Agent Resource Descriptor listing the same resources
  • /.well-known/mcp/server-card.json, an MCP server card. It is labelled sep-1649-draft, because SEP-1649 is an open proposal
  • /.well-known/api-catalog, an RFC 9727 linkset. The same path on api.decisioninsights.ai redirects here
  • /openapi.json, the REST API as OpenAPI, so a client can generate itself
  • /.well-known/http-message-signatures-directory, our Web Bot Auth keys. Our outbound requests carry a Signature-Agent header signed with them, so a site can allow us by verified identity rather than by IP
  • Every record links to its primary source, so a citation resolves past us to the original