Changes

Changes are the core output of Competiflow: interpreted diffs with severity, summary, recommended action, and evidence. This is what you read from the competitor inbox.

List changes

GET /v1/changes?workspace_id=:id
Query param Type Description
workspace_id integer Required. Workspace scope
competitor_id integer Filter to one competitor
review_status string unreviewed, acknowledged, or dismissed
min_severity string Floor: info, low, medium, high, critical
since string ISO8601 timestamp or 1d, 7d, 30d
monitor_type string Filter by surface: pricing, blog, changelog, etc.
limit integer Page size, 1–100 (default 25)
after integer Cursor — change ID from next_cursor
curl "https://api.competiflow.com/v1/changes?workspace_id=42&min_severity=medium&limit=25" \
  -H "Authorization: Bearer $COMPETIFLOW_API_KEY"

Response (200 OK):

{
  "changes": [
    {
      "id": 901,
      "competitor_id": 7,
      "competitor": "Example Co",
      "logo_url": "https://...",
      "monitor_id": 101,
      "monitor_type": "pricing",
      "severity": "high",
      "severity_score": 80,
      "summary": "Pro plan dropped from $99 to $79/mo",
      "recommended_action": "Review positioning against the new price point",
      "opportunity_score": 72,
      "review_status": "unreviewed",
      "category": "pricing",
      "direction": "retreated",
      "delta": { "added": 0, "removed": 0 },
      "created_at": "2026-07-14T12:30:00Z"
    }
  ],
  "has_more": true,
  "next_cursor": 900,
  "meta": {
    "counts": { "unreviewed": 3, "acknowledged": 12, "dismissed": 5 },
    "max_unreviewed_severity": "high"
  }
}

See Pagination for cursor usage.

Derived fields

Some list fields are derived from the change's field diffs:

Field Type Values
category string pricing, feature, content, partnership, social_proof, positioning, other
direction string advanced (things added/increased), retreated (removed/decreased), neutral
delta object { "added": <int>, "removed": <int> } — counts of alertable fields added/removed

Get change

GET /v1/changes/:id
GET /v1/changes/:id?include=capture,capture_markdown,raw_diff

Optional include values (comma-separated):

Token Description
capture Post-change extracted fields
capture_markdown Post-change page markdown
raw_diff Integrated markdown diff with before/after captures

When both capture and capture_markdown are requested, the API returns one capture object with fields and markdown.

Returns every list field plus the interpreted evidence chain:

{
  "change": {
    "id": 901,
    "competitor": "Example Co",
    "monitor_type": "pricing",
    "severity": "high",
    "summary": "Pro plan dropped from $99 to $79/mo",
    "recommended_action": "Review positioning against the new price point",
    "why_it_matters": "Direct price undercut on your core tier",
    "field_diffs": [
      {
        "op": "updated",
        "change_type": "price_decrease",
        "path": "plans[Pro].price",
        "tier": "alertable",
        "old": { "price": "$99/mo" },
        "new": { "price": "$79/mo" }
      }
    ],
    "clusters": [
      {
        "headline": "Pro pricing cut",
        "meaning": "Example Co reduced its Pro tier price.",
        "diff_indexes": [0]
      }
    ],
    "evidence": {
      "diffs": [
        {
          "op": "updated",
          "change_type": "price_decrease",
          "path": "plans[Pro].price",
          "tier": "alertable"
        }
      ]
    },
    "enrichment": {
      "seo_opportunity": { "keywords": [] }
    },
    "interpreted_by": "gpt-4o-mini",
    "interpreted_at": "2026-07-14T12:30:00Z",
    "source_url": "https://example.com/pricing",
    "raw_diff_available": true
  }
}

field_diffs entries are generated by the interpreter; the top-level keys
(op, change_type, path, tier, old, new) are stable, but the inner
shape of old/new varies by monitor type. evidence and enrichment are
objects, not arrays.

Severity levels

Level Typical use
critical Major pricing or positioning shift
high Notable product or pricing change
medium Worth reviewing this week
low Minor update
info FYI, low urgency

Update review status

PATCH /v1/changes/:id
Body field Type Required Description
review_status string yes unreviewed, acknowledged, or dismissed
curl -X PATCH https://api.competiflow.com/v1/changes/901 \
  -H "Authorization: Bearer $COMPETIFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"review_status": "acknowledged"}'

Review status

Set review_status with PATCH /v1/changes/:id. Filter the feed with the review_status query param on list.

Find out before your customers do

Point Competiflow at your competitors and get the moves that matter, with the before and after attached. Skip the dashboard nobody opens and the alert flood nobody reads.

It diffs real fields, not pixels
Every change shows its receipts
One quiet digest, your cadence
No credit card required. 100 free checks included.