Create once
Pass companies, people, or a saved list. Recommended mode chooses safe, relevant workflows that fit the remaining allowance. Idempotency prevents duplicated background or paid work.
Signal intelligence for software and agents
Submit companies or people once. TipOff chooses safe relevant workflows, respects the workspace credit allowance, and returns one source-linked summary your application or LLM can trust.
import { Tipoff } from "@tipoff/radar";
const tipoff = new Tipoff({
apiKey: process.env.TIPOFF_API_KEY,
});
const job = await tipoff.audiences.track({
companies: accounts,
playbooks: { mode: "recommended" },
});
await tipoff.tracking.waitUntilComplete(job.id);
const summary = await tipoff.tracking.summary(job.id);The integration model
Tracking Jobs sit above TipOff’s list, watch, collector, playbook, run, and signal systems. They give a coding agent one obvious operation and preserve the evidence needed for a production application.
Pass companies, people, or a saved list. Recommended mode chooses safe, relevant workflows that fit the remaining allowance. Idempotency prevents duplicated background or paid work.
Receive planned, queued, running, completed, partial, or failed. The SDK handles backoff, timeouts, abort signals, and terminal states.
Get every selected playbook, including zero-result playbooks, plus source-linked signals and explicit unknown or truncated coverage.
Big lists and files
Every request takes up to 1,000 rows and 4 MB. The SDKs split larger files for you, send the parts one at a time with their own idempotency keys, and add the answers up. The importer is the same one the web upload uses, so rows already on file are updated, never duplicated, and sending the same part twice is safe. Writes need a write-scoped token for a workspace member and an Idempotency-Key header; free workspaces are limited by the plan's hourly write budget, and the SDK honours Retry-After.
// Any size: the SDK sends 1,000-row parts, one at a time, each idempotent.
await tipoff.people.importFile({ path: "./contacts.csv" }, { listName: "Q4 board" });
await tipoff.lists.importFile({ path: "./targets.xlsx" }, { type: "targets", name: "ICP" });
// Find the decision maker at 2,000 accounts. maxCredits is required: nothing runs over it.
const found = await tipoff.accounts.committee.find({ accountIds, mode: "decision_maker", maxCredits: 400 });
console.log(found.people.length, "people saved to their accounts");POST /api/v1/accounts/committee/estimate returns a review id and the credits it can cost. POST /api/v1/accounts/committee/search with that review id spends them. Selection is account_ids or a saved account list (list_id with limit and offset). Results are people whose current employer was confirmed, saved to their account. HTTP 202 means the outcome is not yet confirmed: read GET /api/v1/accounts/committee/{reviewId} before starting another paid search.
CSV and spreadsheet columns are matched by header name (name, first_name, last_name, title, company, website, linkedin, email, phone). Unmatched columns are kept as enrichment. Files over 4 MB must be CSV and are split by the SDK.
Stable core
OpenAPI 3.1, official JavaScript and Python clients, MCP discovery, structured errors, request IDs, usage units, and raw request escape hatches keep the integration straightforward as TipOff expands.
| Method | Path | Outcome |
|---|---|---|
| POST | /api/v1/tracking-jobs | Track companies, people, or saved audiences with a verified credit cap. |
| GET | /api/v1/tracking-jobs/{id} | Poll one durable asynchronous job. |
| GET | /api/v1/tracking-jobs/{id}/summary | Retrieve every playbook and its source-linked outcomes. |
| POST | /api/find-signals | Find buyers from a product description or company domain. |
| GET | /api/v1/lists | List tenant audiences with bounded pagination and workspace isolation. |
| POST | /api/v1/lists | Create a tenant list from validated account or people members. |
| GET | /api/v1/signals | Read collected signals with playbook, account, and time filters. |
| GET | /api/v1/signals/{id}/outcome | Trace evidence, scoring, CRM, people, and delivery. |
| GET/PATCH | /api/v1/brain | Read or update tenant Brain sections and await scoring refresh. |
| POST | /api/v1/lists/import | Upload a company list as JSON, a CSV body, or a .csv/.xlsx file (up to 1,000 rows and 4 MB per request). |
| POST | /api/v1/people/import | Import people from JSON, CSV or a spreadsheet; matched to companies, deduplicated, plan-checked. |
| POST | /api/v1/accounts/committee/estimate | Price a decision-maker or buying-committee search for up to 200 accounts. Spends nothing. |
| POST | /api/v1/accounts/committee/search | Run the priced search. The review id is consumed once, so a retry never charges twice. |
| GET | /api/v1/accounts/committee/{reviewId} | Read the saved outcome of a search after an interrupted request. |
| POST | /api/mcp | Discover and call the live agent tool surface. |
Every new public resource returns a stable error code, the exact invalid parameter, a request id, and a documentation link. The SDK preserves these fields and only retries reads or writes protected by an idempotency key.
Free workspaces have a hard 50-credit monthly allowance. HTTP 402 is returned before new provider work is approved when the quoted maximum does not fit.