---
title: "TOPIC SEARCH (1.30.0): \"what do we know about X\", with provenance. Full text inside this workspace over evidence (subject + content), actions (description plus outcome/interpretation text), decisions and canonical context, plus the existing name matching for people, organizations, projects and outreach."
method: GET
path: "/search"
---

# TOPIC SEARCH (1.30.0): "what do we know about X", with provenance. Full text inside this workspace over evidence (subject + content), actions (description plus outcome/interpretation text), decisions and canonical context, plus the existing name matching for people, organizations, projects and outreach.

`GET /search`

## Request

- Base URL: `https://forbiz.io/api/public/agent`
- URL: `https://forbiz.io/api/public/agent/search`
- Auth: HTTP bearer

Matching is Postgres full text: websearch_to_tsquery with the 'simple' configuration (business text is bilingual EN/ES, so nothing is stemmed), ranked by ts_rank, 20 hits per type. NUMBERS ARE TOKENIZED ON PUNCTUATION: '1,700' is indexed as the two tokens '1' and '700', and '1.700' likewise, so a query for 1700 will NOT match text written as 1,700 — search for 700, or for the number as it was written. `tsquery_used` reports exactly how your words were parsed — an empty tsquery means no searchable term, never 'no data'. A term that matches nothing returns zero hits in every type. Scope is always the workspace of the presented credential; there is no cross-workspace read. This is not semantic search: there are no embeddings and no external search service.

## Query parameters

- `q` string, required
- `type` 'all' | 'people' | 'organizations' | 'actions' | 'projects' | 'outreach' | 'evidence' | 'decisions' | 'context'

## Response `200`

Ranked results per type, with provenance on every evidence hit

- object
  - `query` string
  - `tsquery_used` string, nullable
  - `workspace_id` string, nullable
  - `type` string
  - `totals` object
  - `results` object
    - `evidence` object[]
      - `id` string
      - `subject` string
      - `content` string: truncated at 500 characters
      - `content_truncated` boolean
      - `kind` string
      - `epistemic_status` string
      - `status` string
      - `stated_at` string, date-time, nullable
      - `created_at` string, date-time
      - `source` object
        - `session_id` string, nullable
        - `session_title` string, nullable
        - `artifact_id` string, nullable
        - `artifact_title` string, nullable
      - `contradicts` object, nullable
      - `contradicted_by` object[]
      - `supersedes` object, nullable
      - `superseded_by` object[]
    - `actions` object[]
      - `id` string
      - `description` string
      - `status` string, nullable
      - `due_at` string, date-time, nullable
      - `expected_signal_at` string, date-time, nullable
      - `executed_at` string, date-time, nullable
      - `latest_signal` string, nullable
      - `project_id` string, nullable
    - `decisions` object[]
    - `context` object[]
    - `people` object[]
    - `organizations` object[]
    - `projects` object[]
    - `outreach` object[]

## Other responses

- `400`: invalid_parameter — unknown type; or unknown_parameter

---

[API](https://skmtc.dev/forbiz/apis/forbiz-external-agent-api.md) · [All operations](https://skmtc.dev/forbiz/apis/forbiz-external-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/forbiz/apis/forbiz-external-agent-api/revisions/e5b10d59dc5f?raw)
