In Practise
Primary research for investors
- Category
- Finance
- Primary Subcategory
- Private Markets, Deals & Expert Networks
Integration details
Description
In Practise runs primary research for fundamental investors. We interview the former operators and executives who ran the companies you're analysing, then turn those conversations into structured, cited research. This connector brings that library into ChatGPT. You can: - Search thousands of expert interviews across public and private companies, sectors and business models - Read full interviews and analysis, with verbatim quotes you can attribute to each source - Look up companies and the moats behind them, assessed with the 7 Powers framework: scale economies, network effects, counter-positioning, switching costs, branding, cornered resource and process power - Track the companies you care about with a personal watchlist Ask ChatGPT about a company, a competitor or an end market, and it pulls the relevant primary-source view from people who were actually in the room, rather than a summary scraped from the web. Access requires an In Practise library subscription. Learn more at inpractise.com.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Private Markets, Deals & Expert Networks
- Secondary Subcategories
- None listed
- Brand
- In Practise
- Access
- Account required
- First tracked
- 2026-08-19
- Tool count
- 15
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Private Markets, Deals & Expert Networks
View Category15 tools agents can invoke
Adds companies, moats, business models, or industries to the user's watchlist. This tool allows adding multiple items at once. Each item requires: - type: One of 'company', 'moat', 'businessModel', 'industry' (optional, defaults to 'company') - idOrName: Either a UUID (for direct ID lookup) or a name (for fuzzy matching) For companies: Accepts company names, display names, or UUIDs For moats: Accepts moat names or UUIDs For business models: Accepts business model names or UUIDs For industries: Accepts industry names or industry codes (numbers) The tool handles both exact UUID matches and name-based lookups. When adding moats, business models, or industries, it will also automatically restore any previously deleted companies that are associated with those categories. Returns a summary of how many items were successfully added in each category.
add_to_watchlist
Compare the SAME section between two filings of one company (e.g. this year vs last) to answer "what changed in their risk factors / accounting policy / MD&A?". Params: filingA (earlier filing UUID), filingB (later filing UUID) — resolve BOTH with forensics_list_filings; sectionType (one of the fixed section names). Returns: { present, sectionType, a/b: {filingId, citation}, granularity ("item" | "block"), added: [{status: "genuinely_new", heading, page, text}], removed: [{status: "genuinely_removed", ...}], changed: [{status: "reworded_carried_over", heading, page, oldText, newText, similarity}], unchanged: count, addedTotal/removedTotal/changedTotal, truncated, note }. When granularity="item" (sections with headings: risk factors, notes, MD&A) each entry is a whole SECTION ITEM named by its `heading`, so the counts are ITEMS (e.g. "2 new risk factors, 5 reworded"), not blocks. "block" is the fallback for heading-less sections. An item is `added` only if ALL its content is new, `removed` if all gone, else `changed` — an item that persists but is reworded (including a restructured item: a heading in one filing, a paragraph in the other) is classified `changed`, not added/removed. Within a `changed` item, oldText vs newText carry the wording delta: a concept carried over from the earlier filing stays in oldText even when the surrounding wording changed (forensics_find_mentions confirms whether a given phrase is truly absent from the earlier filing). When truncated the lists are capped (the totals are reported). Verbatim passages come from added/removed/changed, cited to a and b. Requires forensic-accounting access.
forensics_section_diff
EXHAUSTIVE literal-substring scan over a company's SEC/financial filing blocks. Returns EVERY block whose verbatim text contains `term` (case-insensitive substring) — COMPLETE RECALL, no relevance ranking, no silent cap. USE THIS (not forensics_search_filing_text) for "find ALL / every / list all mentions of X", related-party or counterparty name sweeps (e.g. every place "DriveTime" appears), covenant/entity occurrence audits, and any question that must not miss a differently-phrased mention. forensics_search_filing_text is RANKED and CAPPED — it returns the most relevant passages, NOT all of them, and will silently drop long-tail mentions. First resolve the company with search_companies to get its `companyId` (a UUID). Omit `filingId` to sweep every filing (each match is labelled with its `filingLabel`), or pass one to scope (e.g. the latest 10-K). Return fields: - `totalMatches`: the EXACT number of matching blocks across everything scanned — this is the recall guarantee. - `filingsScanned` / `filingsTotal` / `filingsWithoutText` + `coverageWindow`: the searched set vs the company's full filing record in scope. A result of 0 matches is a valid negative ONLY for the `filingsScanned` filings; `filingsWithoutText` filings have no ingested text and were NOT searched — a mention there is invisible to this tool. When filingsWithoutText is 0, 0 matches bounds the company's entire filing record in scope. - `matches[]`: each = `filingLabel`, `sectionType`, `page`, ltree `path`, `occurrencesInBlock`, a verbatim `snippet`, and a `deepLink` that opens the filing viewer at that exact block (scrolls to it and highlights the passage). In responseFormat "detailed", the first matches also carry the full verbatim block `markdown`. - `note`: if set, the location list was capped (very common term) — narrow by `filingId`/`sectionTypes`. `totalMatches` is still exact. `snippet`/`markdown` are VERBATIM block text; forensics_verify_quote grades whether a specific figure is an exact substring. Matching is against literal stored markdown, so a term split by inline markup (e.g. "Drive**Time**") is not matched. ACRONYM / DEFINED-TERM CAVEAT: this is a LITERAL matcher, so a multi-word term that a filing defines once and then abbreviates is UNDERCOUNTED. A document that writes "artificial intelligence ("AI")" once and then says "AI" thereafter returns ~1 match for "artificial intelligence" while the topic saturates the section. A low `totalMatches` on a spelled-out phrase is therefore NOT evidence the topic is rare. For any term with a common abbreviation (artificial intelligence↔AI, remaining performance obligation↔RPO, material weakness↔MW), run BOTH forms and sum `totalMatches`; the short form usually carries the true count.
forensics_find_mentions
Retrieves specific InPractise articles by their URL slugs. Interviews return complete content. Analysis, Weekly Update, and Company Profile results are passage-scoped: copy both the slug and passageId from search_articles into `slugs` and `passages`; without that passageId the aggregator is withheld under `provenanceRequiredSlugs`. Copy an aggregator article's returned `citation` in full so its source-interview link stays attached. Other access and subscription-window restrictions are returned under `inaccessibleSlugs` and `windowRestricted`; relay any `accessNote` or window message.
get_articles_by_slug
Retrieves essential platform data that provides context for all subsequent queries. This tool should typically be called first to understand the current state of the platform and available data. Returns: - User's complete watchlist (companies, industries, moats, business models) with full metadata - Organization member watchlists (if user belongs to an organization) - All available moats with company and article counts (sorted by article count) - All available business models with company and article counts (sorted by article count) - Companies with coverage grouped into 4 categories (only companies with 11+ articles included): * "50+ articles": Companies with 50 or more articles (ordered by coverage, highest first) * "30-49 articles": Companies with 30-49 articles (ordered by coverage, highest first) * "20-29 articles": Companies with 20-29 articles (ordered by coverage, highest first) * "11-19 articles": Companies with 11-19 articles (ordered by coverage, highest first) Each group contains company symbols (fmp_symbol), or ticker if no symbol, or company name if neither is available. - Latest 30 articles with metadata (title, companies, expert info, publication date, etc.) This comprehensive dataset helps understand what companies, topics, and content are most relevant to both the user specifically and the platform overall. The response also reports `accessTier`. On the free tier it includes an `accessNote` explaining what the connection can and cannot read — ALWAYS relay that note to the user early in the conversation.
get_core_data
Fetches the VERBATIM block(s) at a specific section path of a filing — for navigating to a known disclosure or pulling the exact text behind a search hit / flag. Inputs: `filingId` and `path` (the ltree `sectionPath` that forensics_search_filing_text returns, or a path you want to drill into). Returns the section's blocks in document order with their verbatim `markdown`, plus the concatenated section `markdown`. Transcript blocks (earnings calls, event transcripts) additionally carry `speaker` ("Name — Role, Company", null where the source maps no speakers) and `startTimestamp` (the turn's start offset in seconds from the start of the recording); their `page` is null. Use this to (a) jump straight to a disclosure already located, or (b) read the precise source text for a figure. The `markdown` is byte-for-byte from the filing.
forensics_get_filing_section
Resolves a forensic flag to the VERBATIM filing block(s) it was anchored to — the drill-down from a flag (from forensics_search_flags) to its source disclosure. Inputs: `flagId` (from forensics_search_flags), and optionally `sourceTable` (also from search_flags — lets it skip the table scan). Returns the verbatim `sections` (heading + body blocks) the flag points at, the `filingId`, a `deepLink` that opens the filing viewer at the source passage (scrolls to it and highlights it), and `rawQuoteHint`. For policy_diff flags it returns BOTH the current- and prior-filing blocks (the YoY diff). `rawQuoteHint` is the In Practise generator's LOCATING hint, not authoritative source text; the verbatim `sections.markdown` is the quotable content (forensics_verify_quote grades whether a given string is exact). If `sections` is empty (ratio/extract areas have no block anchor, or a stale path), the `note` field says so — fall back to forensics_search_filing_text.
forensics_get_evidence
List a company's SEC/financial filings — each with its `filingId` (UUID), `filingType`, `fiscalYear`, `fiscalPeriod`, `reportDate`, `filingDate`, a human `label`, `hasBlocks` (whether its text is ingested), `sectionTypes` (the DISTINCT section tags of its ingested blocks), and `attributionStatus` (filing-level speaker-coverage flag: 'limited' = some turns have no resolved speaker — a blank or generic "Speaker N" label; 'unavailable' = no speaker mapping at all; null = fully mapped or not a transcript. It is a COVERAGE signal, not per-quote confidence — a quote whose block has a named speaker is attributed even when the filing is 'limited'. Operator/host turns don't count as degraded). Newest first. `reportDate` is the period-end date; `filingDate` is the publication/event date — some sources (e.g. earnings-call and event transcripts) carry only `filingDate`. `sectionTypes` makes the list an event index as well as a filing index: an 8-K carrying `non_reliance` is a restatement notice, `auditor_change` an Item 4.01, `listing_deficiency` an Item 3.01, `exit_costs` a restructuring, `bankruptcy` an Item 1.03; transcripts carry `prepared_remarks`/`qa`/`discussion`. Because every ingested filing lists its tags, the enumeration is also a checked denominator — a company whose listed current reports include no `non_reliance` tag has zero ingested non-reliance disclosures, which is a stronger statement than a search returning nothing. This denominator counts ONLY `hasBlocks: true` filings: a filing with `hasBlocks: false` has UNKNOWN section content (not yet ingested — its `sectionTypes` is empty because nothing was parsed, NOT because it is event-free), so it must be excluded from any "no such event" conclusion. `coverage.filingsWithoutBlocks` counts them; an event screen that treats an un-ingested filing as clean produces a false all-clear. Accepts one `companyId`, or `companyIds` — up to 50 companies enumerated in a single call (e.g. a whole portfolio), returning one result object per company with its `ticker`/`name` and the same filing fields. Also enumerates ACROSS companies when `dateFrom`/`dateTo` are supplied without any company: the date window is what bounds the query, so "which companies filed an earnings release yesterday" or "every restatement notice this quarter" is one call rather than one call per known ticker. `dateFrom`/`dateTo` match the PUBLICATION date (when the filing became public), not the period it covers — a FY2025 10-K filed 2026-02-01 falls in 2026. In this mode the response carries `scope: "all_companies"` and each filing carries its own `companyId`/`ticker`/`companyName`; there is no `coverage` block, which is a per-company statement. A call with neither a company nor a date window is an error, not a full-corpus dump. `sectionTypes` filters to filings carrying at least one ingested block with those tags — the same vocabulary the response reports. It is how the section plane becomes queryable rather than only readable: `sectionTypes: ['earnings_release']` returns the 8-K-exhibit earnings releases described below, `['non_reliance']` the restatement notices. Because tags exist only on ingested blocks, this filter implies `hasBlocks: true`. Resolves a specific filing to its `filingId` — e.g. "the FY2024 10-K", "the latest 10-Q", "the FY2023 annual report" — for use with forensics_section_diff, forensics_get_filing_section, or forensics_find_mentions. This is the reliable filing→UUID resolver; ranked forensics_search_filing_text won't consistently surface a specific period. `companyId` is a UUID as returned by search_companies. `filingType` optionally narrows by exact type; an unrecognised value is an error, never an empty result. When a filingType filter matches nothing but the same-named content exists as SECTIONS of another filing type (US earnings releases are 8-K exhibits: filingType "current_report" with `earnings_release` section blocks), the response says so in `sectionTypeOverlap` — a zero here is checked against the section plane, not just the filing-type column. Each result carries a `coverage` summary: `filingsWithoutBlocks`, `latestFilingDate` vs `latestBlockBackedFilingDate`. When they differ, the newest filing(s) exist but their text is not yet ingested — disclosures newer than `latestBlockBackedFilingDate` may exist that text search cannot see. Filing-type vocabulary: a "10-K" is stored as filingType "annual_report"; a "10-Q" as "quarterly_report"; an "8-K" as "current_report"; a Form 12b-25 (NT) as "late_filing_notification"; "FY2024" corresponds to fiscalYear 2024. Only filings with `hasBlocks: true` have searchable/diffable text. EARNINGS RELEASES are bimodal — do NOT reach them with filingType="earnings_release". A US company's quarterly earnings release is Exhibit 99.1 of an 8-K, ingested as `section_type='earnings_release'` blocks INSIDE a `current_report` filing (thousands of filings); only a minority of (mostly non-US) issuers file a standalone "earnings_release" filing type. So filtering filingType="earnings_release" returns ONLY the standalone minority and misses every 8-K-exhibit release — it will look like "no earnings release in corpus" when the current, ingested release is right there. To find earnings releases: pass `sectionTypes: ['earnings_release']` here (with a `companyId` for one issuer, or with a date window for every issuer that released in that period), or use `forensics_search_filing_text` with the same `sectionTypes` when you want the passage text rather than the filing list. (Earnings presentations behave the same way.)
forensics_list_filings
Removes companies, moats, business models, or industries from the user's watchlist. This tool allows removing multiple items at once. Each item requires: - type: One of 'company', 'moat', 'businessModel', 'industry' (optional, defaults to 'company') - idOrName: Either a UUID (for direct ID lookup) or a name (for fuzzy matching) For companies: Accepts company names, display names, or UUIDs. Companies are marked as deleted rather than fully removed. For moats: Accepts moat names or UUIDs and fully removes the association For business models: Accepts business model names or UUIDs and fully removes the association For industries: Accepts industry names or industry codes (numbers) and fully removes the association The tool handles both exact UUID matches and name-based lookups. For companies, the deletion is soft (marked as deleted) to preserve history, while moats, business models, and industries are hard deleted from the user's watchlist. Returns a summary of how many items were successfully removed in each category.
remove_from_watchlist
Performs semantic search across the entire InPractise article library. This tool searches through thousands of business research articles, interviews with executives, and analysis pieces. It returns the particular matched section of the article content. One common workflow is to query the search with a company name and then follow up queries with different companies, moats, industries, etc, as it makes sense. You can also search by company symbol. Matching is case-insensitive and prioritizes exact tickers, then exact FMP symbols. Only when neither exact form exists does a bare ticker expand to an exchange-qualified FMP symbol such as CSU.TO. You can filter by a company symbol and leave the query as an empty string or undefined to get all articles for that company in descending order of published date. Any requested symbols that cannot be resolved are returned in the unresolvedSymbols field. If none of the requested symbols resolve, the tool returns no articles and never falls back to an unfiltered search. In order to get all the articles for a query, you can get 50 articles and then query again with the next page number. However, you would only want to do this if the user explicitly asks for all the articles, usually for a company. Articles the calling user does not have access to are filtered out of the results and listed under `inaccessibleSlugs`. When the response carries an `accessNote` (free-tier connections), ALWAYS relay it to the user — it explains that results were hidden, why, and how to get full access; `hiddenResultCount` says how many matches were withheld. Quote experts VERBATIM, don't summarise: copy from a result's `content`, render as Markdown blockquotes, and attribute each with that result's `citation` field copied as-is. Each citation deep-links to the exact paragraph the matched content came from (the article page scrolls to and highlights it). To read an interview in full, call get_articles_by_slug with its slug. For an aggregator, copy both its slug and `passageId` into get_articles_by_slug; that keeps the read limited to the verified passage. By default (no `types` specified) results cover expert interviews plus Analysis, Weekly Update and Company Profile passages whose exact source interview passage is currently published and accessible. Aggregator results carry a `citation` containing BOTH the aggregator paragraph and source-interview paragraph deep links, plus structured `provenance`; copy the full citation as-is. Aggregator passages without a valid accessible chain are withheld and listed under `provenanceExcludedSlugs`. Other secondary types remain opt-in through `types`. These are all the available types: - ip_analysis: Research pieces, thoughtful analysis and synthesis of interviews, and deep dives - ip_resource: Research pieces, less deep than ip_analysis - ip_hosted: Interviews conducted by In Practise - 3p_interview: Interviews conducted by IP Partners - ip_dialogue: Dialogues with investors, not used anymore - ip_weekly_update: Weekly update with a summary of the latest published interviews and research - ip_company_profile: Deep dives on a company - ip_value_chain: Company value chain analysis - ip_podcast: Podcasts to educate analyst on the art of primary research. Usually published on the IP Fieldwork podcast on Spotify and Apple Podcasts. - ip_survey: Results of industry surveys conducted by In Practise
search_articles
Searches for companies in the InPractise IP database using fuzzy matching, and resolves a ticker to a company id. Accepts one `search` term, or `searches` — up to 50 terms resolved in a single call (e.g. a whole portfolio's tickers), returning one result object per term with the same fields as a single search. In batch mode each term's fuzzy list is capped at its top 5 (exact ticker/symbol matches are always returned in full, so collisions are never hidden). Fuzzy match runs across company names, display names, and ticker/FMP symbols (case-insensitive), ordered by article count, top 20. Separately, EXACT ticker/symbol matches are always surfaced (independent of that top-20 window) so a low-coverage collision is never hidden. Result fields: - companies[]: { id, name, ticker, symbol, country, articleCount, exactTicker } — exactTicker=true means ticker/symbol equals your search exactly. - exactTickerMatches[]: every company whose ticker/symbol EXACTLY equals the search (e.g. "ERF" → Enerplus AND Eurofins). - tickerCollision: true when >1 company shares the searched ticker. Ticker collisions: tickers are NOT unique across exchanges (ERF, SLP, NXT, …). When tickerCollision=true, exactTickerMatches lists every company sharing that exact ticker, so the caller can disambiguate rather than assume a single match. forensics_* tools take a resolved company id (a UUID), not a bare ticker.
search_companies
Full-text search over a company's SEC/financial filing text (forensics filing blocks), returning VERBATIM filing sections that match a query — the grounded source for factual questions about a company's disclosures and the numbers in them. Use this for questions answered by the text/tables of a filing, e.g. "deferred revenue breakdown", "stock-based compensation by award type", "goodwill impairment charge", "effective tax rate reconciliation", "revenue by segment", "off-balance-sheet arrangements". The `companyId` is a UUID obtained from search_companies (tickers collide across exchanges and are not accepted). Pass `filingId` (from forensics_list_filings) to scope the search to a SINGLE filing — without it the search spans every filing of the company, so a question about one annual report can be answered from a different filing (e.g. a 10-Q). `filingIds` (up to 10) runs the same query across SEVERAL filings in one call — each filing is ranked independently and every section carries its `filingId`/`fiscalPeriod`, so a multi-period trace (e.g. one line item across four 10-Qs) is a single call, not one per filing. Each result is a whole filing SECTION (heading + the paragraphs/tables beneath it), returned VERBATIM as Markdown in the `markdown` field, with `fiscalYear`, `fiscalPeriod`, `reportDate`, `filingType`, a `deepLink` that opens the filing viewer at this section (scrolls to it and highlights the passage) and `sectionPath`. Result fields: `matchMode: "or"` means the strict match found nothing and these are relaxed (looser) matches. `truncated: true` means the section was clipped; the `deepLink` opens the full section. `topMatchingTables` is a second result plane: the highest-ranked TABLE blocks matching the query across the searched scope, verbatim. Filings state exact figures in tables while the surrounding prose typically rounds them; a table here can come from a section that did not rank among `sections`. This does NOT make judgments ("is this a red flag?") and is negation-blind ("did not identify a weakness" matches like an adverse finding) — for red-flag/concern/material-weakness/critical-audit-matter questions use forensics_search_flags instead. For "find EVERY mention of a specific term/name" (exhaustive recall, e.g. every place a related party appears), this ranked search will silently drop long-tail matches — use forensics_find_mentions instead. Citing a hit: pdfPage is the PDF PAGE INDEX of the MATCHED text (1-based, from the document's first page) — NOT the number printed in the filing's footer, which usually reads lower because front matter is unnumbered (e.g. PDF page 10 = printed page 7). `printedPage` is that printed footer label itself ("7", "F-3", "vii") when known; it is null where the filing's numbering could not be established. sectionPdfPageStart/sectionPdfPageEnd bound the enclosing section; matchedBlockPath + deepLink jump to the exact block. Transcript sections (earnings calls, event transcripts) have no pages; they carry `startTimestamp` instead — the section's start offset in seconds from the start of the recording. Results are RELEVANCE-ranked, not recency-ranked — the newest filing containing a term is established by forensics_list_filings (newest first), never by search-result order; a figure's containing filing may have been superseded by a more recent report or release. Block typing (heading vs paragraph vs table) is best-effort from document conversion: a captioned subsection sometimes exists only as paragraph-typed blocks. The absence of a heading-typed block is therefore not evidence that a titled section or caption is absent from the filing — content presence is what find_mentions/search results establish. An EARNINGS RELEASE (US quarterly press release, 8-K Exhibit 99.1 — including the revenue/RPO/guidance figures) is ingested as `section_type='earnings_release'` blocks inside a `current_report` filing, not as a standalone filing. Retrieve it by scoping `sectionTypes: ['earnings_release']` (optionally with the current_report's filingId) — it will NOT appear under a filingType="earnings_release" filter in list_filings, so "no earnings release in corpus" is a routing error, not an absence. When a search returns NO results, the response includes `sectionTypesInScope`: the section tags that exist in the searched scope with block counts — so content excluded by a sectionTypes filter is visible in that list rather than reading as absent.
forensics_search_filing_text
Returns In Practise's published forensic red-flag VERDICTS for a company — the judgment layer, NOT filing text. Use this for discovery and judgment questions: "what are the accounting red flags / concerns?", "any ICFR material weakness?", "did the auditor flag anything?", "are there critical audit matters?". These are the PUBLISHED flags only — approved AND latest-version (unreviewed drafts and superseded versions are excluded). The returned set is therefore the canonical count of a company's published flags — the answer to "how many red flags does X have?" (it differs from raw internal row counts, which include drafts and superseded versions). One caveat for cross-company comparison: several flags can stem from one underlying event, so flag COUNT is a volume measure, not a severity ranking on its own. `companyIds` is an ARRAY of company UUIDs from search_companies (1-50). Pass one id for a single company, or many for a PORTFOLIO SCREEN across a book of names in a single call ("which of these 12 companies has a red ICFR flag since 2024?"). Every returned flag carries `companyId` and `ticker`, so results across companies can be grouped and ranked. Results are ordered by SEVERITY first (red before yellow), then newest first — so if `limit` truncates a large screen, it drops the least severe flags, never a red one. `limit` is the total across all companies (default 50, max 200); on large screens, narrower `areas`/`flagColors` filters reduce truncation. EVERY response carries a `coverage` block, whether or not flags were found: - `companiesWithoutFilings` — companies (with `ticker`/`name`) that have NO ingested filings. For these, absence of flags is a COVERAGE GAP, not a clean bill of health. - `latestPeriodStatus` — for every (company, area) in the results, the NEWEST assessment date and its colour(s). A red flag with a later green assessment in the same area is a HISTORICAL, since-remediated concern, not a current one (a `notes` caution is emitted when that happens). - `colorSummary` — per requested company, the count of published flags by colour (red/yellow/green) across the requested scope, independent of the flagColors filter. This is the per-company totals row: a summary sentence about a company's colours can be checked against it directly. - `companiesAssessedClean` — companies that returned no red/yellow flag but DO carry affirmative GREEN verdicts in the requested areas. A green flag is a VERDICT ("this area was assessed and is clean"), not an absence: it distinguishes "assessed and clean" from "never assessed". The verdicts themselves are returned when `flagColors` includes "green" — e.g. a company whose ICFR material weakness was remediated has a GREEN icfr flag for the later year, not a missing one. Covers all forensic areas. Pass `areas` to filter. Values: "accounting_and_disclosure_changes", "accounting_policies", "accounting_ratios", "auditor_opinion", "critical_audit_matter", "icfr_auditor", "icfr_management", "mgmt_changes". An unrecognised value is an error, never an empty result. "mgmt_changes" returns only the ~12% of 8-K management-change events judged forensically concerning (an involuntary termination, a disagreement, an abrupt exit) — the verdicts. For the COMPLETE set of management-change events (every departure/appointment, with dates, severance terms and the SEC accession number) use forensics_structured_facts(dataset:"mgmt_changes"). Pass `signals` to filter by concern topic (flag_signal). `flagColors` defaults to ["red","yellow"] (the red-flag default); pass "green" only to enumerate routine items (e.g. all critical audit matters, most of which are green). 'error' rows are never returned. Each flag returns: `flagId`, `area`, `signal` (the concern topic), `color` (red/yellow/green), a one-line `rationale`, `flagDate`, `sourceUrl`, and `sourceTable`. To read the VERBATIM filing text behind a flag, pass its `flagId` to forensics_get_evidence. `rationale` and `signal` are In Practise-generated summaries, not filing text (they can contain transcription errors, e.g. a misspelled entity name); the verbatim quotable source is the block returned by forensics_get_evidence / forensics_get_filing_section. The rationale identifies what was flagged and where to look. Why this tool and not forensics_search_filing_text: full-text search is negation-blind and wrong-altitude for judgments. "did NOT identify a material weakness" matches the same query as an adverse finding, and "red flag" never appears in filing prose. Only these flags carry the green/red verdict — judgment/concern/material-weakness/critical-audit-matter questions are answered here; factual/figure/disclosure-text questions by forensics_search_filing_text. An empty result is a real signal (no published concerns in scope), not an error.
forensics_search_flags
Returns TYPED, per-row extracted facts from a company's 8-K and proxy (DEF 14A) filings — the structured-data plane, for questions you would answer by filtering or ranking rows rather than reading prose. The `companyId` is a UUID obtained from search_companies. `dataset` selects the table (one dataset per call). Three datasets are available: - "mgmt_changes" — the COMPLETE set of 8-K management-change events, newest first by `eventDate` (falling back to `filedAt` when the event date was not disclosed). Each row carries: `person`, `changeType` (departure / appointment), `departureType`, `rolesCanonical`, `positions`, `interim`, `disagreements`, `reason`, `continuedConsulting`, `eventDate` (when the change took effect), `filedAt` (when the 8-K was filed — i.e. when the market learned of it; `eventDate` is absent on some events and `reportDate` is not a substitute), `accessionNumber` (the SEC identifier, for citation), and `compensation` (severance terms, base-salary change, bonus target, equity award — present on about half of events). The right dataset for "list every management/board change", "were there executive departures", "any disagreements", or "which exits carried severance". forensics_search_flags(areas:["mgmt_changes"]) returns only the ~12% of these events judged forensically concerning — use that for "what should I worry about", and this for "what happened". Coverage: the 8-K corpus is Item 5.02 (management changes) only, from June 2023 onward. - "comp" — the Summary Compensation Table from each proxy, as filed: ONE ROW PER EXECUTIVE PER FISCAL YEAR, newest proxy first then fiscal year descending. Each row's facts carry `person`, `title`, `currency`, `reconciled` (whether the components cross-foot to the printed total), and `components` keyed salary / bonus / stock_awards / option_awards / non_equity_incentive / pension_nqdc / all_other / total, each with `value` (a number in DOLLARS, scale already normalized) and `raw` (the cell as printed). The right dataset for "what was the CEO paid", pay-mix and trend questions, and ranking executives by pay. Note each proxy reports up to 3 fiscal years, so the same person-year recurs across successive proxies; `filingId` scopes to one proxy as filed (true dedup), while `fiscalYear` scopes to one year but can still return that year as reported in each proxy that covers it — prefer the row from the newest proxy (rows are ordered newest proxy first). - "incentive_plans" — the incentive-plan design and outcome for each proxy: ONE ROW PER PROXY FILING the company has filed, newest first (each row = the newest extraction of that proxy; a row's `fiscalYear`/`reportDate` are the PROXY's — the period each plan covers is its own `periodLabel`), facts = `plans` (each annual / long-term / special cycle with `measures` — weight / threshold / target / maximum / actual / payout slots — `mechanics` like gates / caps / modifiers / discretion, `outcome`, `deviation` when payout departed from formula, and `changes` vs the prior year) plus `notCovered` (parts of the program out of extraction scope). Every populated slot is CITED: `value` and `quote` are verbatim filing text with a `blockPath` anchor; other slots carry the extraction's absence `reason` ('not_found' — the extractor found no stated value; 'not_applicable' — the plan's design has no such slot). Scale semantics: a slot with `unit` "$000s" is quoted from a thousands-denominated table, so its `value`/`quote` are as printed while its `usd` field is the true dollar amount ("$12,420" printed = usd 12420000). Rows are large cited documents (tens of KB each; a company has one per proxy filed). The right dataset for "how is the bonus determined", "what metrics drive the PSUs", "did the payout follow the formula", "what changed in the comp program". Optional filters: `fiscalYear` (int), `filingId` (a UUID from forensics_list_filings) to scope to one filing, `limit` (default 50, max 200). Each row carries `filingId`/`filingLabel`/`fiscalYear`/`reportDate` for period attribution and (where applicable) an `evidence` grounding anchor that traces the fact back to the source filing block. `extractionConfidence` is 'high' or 'review' where recorded (mgmt_changes), null elsewhere. For the judgment layer (red-flag verdicts) use forensics_search_flags. An empty result is a real coverage signal, not an error.
forensics_structured_facts
Confirms whether a specific figure or sentence is present, verbatim, in a filing — the grounding guardrail. Grades a candidate quote against the filing's blocks. Inputs: `filingId` and the `quote` (a figure-in-context or a sentence, e.g. "Deferred revenue ... $13 million"), OR `quotes` — up to 10 (filingId, quote) pairs verified in one call, returning one graded result per pair (e.g. one figure per quarter across four 10-Qs). Matching is punctuation/whitespace/case/dollar-sign insensitive (alphanumeric-only), so straightened quotes still match. A quote under 8 alphanumeric characters after normalization (e.g. a bare "$13M") cannot be distinctively matched: it returns grade "none" with a `note` saying so — supply the figure in context instead. Returns `grade`: - "exact" — the quote is a verbatim substring of a block; `path` + `blockMarkdown` give the source. It also returns the CITATION, so a verified quote can be printed without a second call: `pdfPage`, `headingText`, `sectionType`, `filingType`, `fiscalYear`, `reportDate`, `documentUrl` and a `deepLink` to the exact block. For transcript blocks (earnings calls, event transcripts) the citation instead carries `speaker` ("Name — Role, Company", when the source maps speakers) and `startTimestamp` (the turn's start offset in seconds from the start of the recording); pages are null there — transcripts have none. `attributionStatus` is a FILING-LEVEL speaker-coverage flag ('limited' = some turns have no resolved speaker, i.e. a blank or generic "Speaker N" label; 'unavailable' = the transcript has no speaker mapping at all; null = fully mapped). It is NOT per-quote confidence and does NOT override this citation's own `speaker`: when `speaker` is a named person, THIS quote is attributed even if the filing is 'limited' (the flag reflects OTHER turns). Trust the block-level `speaker` for the quote you verified. Operator/host turns are not counted as degraded. `pdfPage` is the PDF PAGE INDEX (1-based, from the document's first page) — it is NOT the page number printed in the filing's footer, which usually reads lower because the front matter is unnumbered (e.g. PDF page 10 = printed page 7). `printedPage` is that printed footer label itself ("7", "F-3", "vii") when known; it is null where the filing's numbering could not be established. - "none" — the quote is not a verbatim substring of any block in the filing (it may be paraphrased, from another period, or absent). forensics_get_filing_section / forensics_search_filing_text return the actual block text. The grade tells the caller whether a specific string is verbatim in the cited filing.
forensics_verify_quote
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are In Practise alternatives on ChatGPT?
As of 2026-09-12, In Practise competes with CapitalDart, CB Insights, Cookiedeal, Dakota Marketplace, Datasite, Evertrace, GLG, Guidepoint, Hadaly, Harmonic, Hebbia, PitchBook, Sacra, Specter, Third Bridge, TrustMRR, Venturu in ChatGPT Private Markets, Deals & Expert Networks, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.