Check Outcomes

Run milestone checks for any outcomes overdue for 7/30/90-day observation. Batches DataForSEO calls to minimize cost.

POSThttps://api.boringmarketing.com/brands/{brand_id}/outcomes/check

Scans all recorded outcomes for this brand and runs milestone checks for any that are overdue (i.e. past the 7/30/90-day interval since their completed event and not yet observed at that milestone). Batches DataForSEO calls internally to minimize API cost.

The results are persisted as outcome_milestones rows (one per observed milestone, upserted by (outcome_id, milestone_days)) and become visible on the next GET /brands/{brand_id}/outcomes read in the corresponding observed_7d / observed_30d / observed_90d slot. This is not the same as recording a new outcome event via POST /track/outcomes/report — milestone observations are child rows attached to an existing outcome.

Path parameters

brand_idstringrequired

The brand UUID.

Request body

None.

Response

{
  "brand_id": "brand-uuid",
  "checked": 5,
  "milestones": [
    {
      "outcome_id": "outcome-uuid",
      "keyword": "ai marketing tools",
      "milestone_days": 7,
      "rank": 14,
      "citations_total": 2
    }
  ]
}
FieldDescription
checkedNumber of overdue milestones that were observed and persisted on this call. 0 when nothing was overdue.
milestonesOne entry per milestone observation written this run. outcome_id correlates back to the row in GET /brands/{id}/outcomes.
errorOnly present on a hard failure (e.g. "brand_not_found"). When present, checked is 0 and milestones is [].

After this call, the new milestone observations are visible on the next GET /brands/{id}/outcomes read in the corresponding observed_7d / observed_30d / observed_90d slot.

Example

curl -X POST \
  -H "X-API-Key: $BM_API_KEY" \
  https://api.boringmarketing.com/brands/$BRAND_ID/outcomes/check

Run this on a daily or weekly cron. It's idempotent — calling it more often than milestone intervals simply does nothing for already-observed outcomes.