Skip to content
thefaqapp

Product API

Read the facts thefaqapp learned from your site and the product profile built from them.

Updated 2026-09-26

When an ingestion reads your site, it also learns facts about your product. Each fact is a short statement plus the exact quote from the page it came from. Facts without a quote that appears on the page are discarded. From the facts, thefaqapp builds a product profile: what the product is, who it serves, pricing, limits, policies, how-to steps, and the topics your site does not answer.

The profile refreshes on its own a few minutes after an ingestion changes the facts.

Get the profile

curl https://api.thefaq.app/api/v1/acme/product \
  -H "Authorization: Bearer ***"

Response:

{
  "data": {
    "language": "en",
    "profile": {
      "oneLiner": { "text": "Acme is an FAQ API for product teams.", "factIds": ["f_1a2b"] },
      "pricing": [{ "text": "Pro costs €19 per month.", "factIds": ["f_3c4d", "f_5e6f"] }],
      "howTo": [
        { "task": "Embed an FAQ", "steps": [{ "text": "Install the React package.", "factIds": ["f_7a8b"] }] }
      ],
      "audiences": [],
      "jobsToBeDone": [],
      "limits": [],
      "policies": [],
      "support": [],
      "differentiators": [],
      "integrations": [],
      "gaps": ["Refund policy", "Data retention"]
    },
    "factCount": 412,
    "model": "google/gemini-2.5-flash-lite",
    "updatedAt": "2026-09-26T09:14:02.000Z"
  }
}

Every entry cites the ids of the facts behind it. An entry with no valid citation is dropped before it is stored. gaps lists questions your customers are likely to ask that your site does not answer yet.

Returns 404 not_found until an ingestion has learned at least one fact.

Required scope: read.

List facts

curl "https://api.thefaq.app/api/v1/acme/product/facts?limit=50&page=1" \
  -H "Authorization: Bearer ***"

Response:

{
  "data": [
    {
      "id": "f_3c4d",
      "kind": "pricing",
      "statement": "Pro costs €19 per month.",
      "quote": "Pro — €19/month",
      "sourceUrl": "https://acme.com/pricing",
      "language": "en",
      "createdAt": "2026-09-26T09:02:11.000Z"
    }
  ],
  "meta": {
    "pagination": { "page": 1, "limit": 50, "total": 25, "pages": 1 },
    "facts": { "total": 412, "visible": 25, "hidden": 387, "upgradeUrl": "https://thefaq.app/pricing" }
  }
}

Facts the profile cites come first, then facts ordered by kind: what the product is, differentiators, how-to, audience, pricing, limits, policies, features, integrations, support.

Visible facts by plan

thefaqapp keeps every fact it learns. Your plan sets how many the API returns.

Plan Visible facts
Free 25
Starter 250
Pro 2,500
Enterprise Unlimited

meta.facts.hidden counts the facts your plan does not show. Upgrading shows them at once, with no new ingestion.

SDK

import { createFAQClient } from "@faqapp/core";

const faq = createFAQClient({
  apiKey: process.env.FAQAPP_API_KEY!,
  organizationSlug: "acme"
});

const { data } = await faq.product.profile();
console.log(data.profile.gaps);

for await (const fact of faq.product.facts()) {
  console.log(fact.statement, fact.sourceUrl);
}