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.
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.
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 "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.
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.
di get-company --website netskope.com
Returns website, location, description, themes, topics and recent records. No account needed.
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.
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 "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.
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.
di search-content "SASE" --limit 5
Returns each record's title, source, published date and uuid.
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.
di get-glossary --slug vector-database
Returns the definition and the companies with the most records on the term.
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 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.
{
"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.
| Resource | Search | One record |
|---|---|---|
| Companies | GET /companies?domain=example.com | GET /companies/{uuid} |
| Open source projects | GET /projects?q= | GET /projects/{uuid} |
| Content | GET /content?q= | GET /content/{uuid} |
| Terms | GET /glossary?q= | GET /glossary/{uuid} |
| Everything at once | GET /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 lists | GET and POST /watch-lists |
| Watch list members | GET and POST /watch-lists/{id}/members, DELETE /watch-lists/{id}/members/{member_id} |
| Webhooks | POST /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