Technical Enrichment

Run a technical site audit via GemMiner or upload an existing audit. Populates brand.technical_context plus technical_issue insights and evidence.

POSThttps://api.boringmarketing.com/brands/{brand_id}/enrich/technical

Triggers a technical audit of the brand's site, or accepts an already-run audit as JSON. Populates brand.technical_context (health score, pages crawled, issues by severity, crawl date), plus creates technical_issue insights and evidence that feed the leverage scoring multiplier for the technical_gap category (1.30x).

Duration: 5-20 minutes for a triggered audit, seconds for an upload.

Path parameters

brand_idstringrequired

The brand UUID.

Request body

You must provide one of the two modes below. Posting with no body, or with both fields omitted, accepts the request and returns 202 — but the background run will fail almost immediately because there is nothing to process. Always include either trigger: true or audit_data.

triggerbooleandefault: false

Set to true to run a fresh GemMiner audit crawl (up to 500 pages, 30-minute poll timeout).

audit_dataobject

Pre-collected audit data to upload instead of triggering a fresh crawl. Accepts either a GemMiner-format audit (object with categories key) or a generic audit shape.

Response (202 Accepted)

{
  "run_id": "run-uuid",
  "status": "queued"
}

Poll GET /brands/{brand_id}/runs/{run_id} until status is done. On success, the run's meta contains:

{
  "insights_count": 47,
  "evidence_count": 47,
  "health_score": 87
}

And GET /brands/{brand_id} will now include a populated technical_context field.

Example — trigger a fresh audit

curl -X POST \
  -H "X-API-Key: $BM_API_KEY" \
  -H "Content-Type: application/json" \
  https://api.boringmarketing.com/brands/$BRAND_ID/enrich/technical \
  -d '{"trigger": true}'

Example — upload pre-collected audit

curl -X POST \
  -H "X-API-Key: $BM_API_KEY" \
  -H "Content-Type: application/json" \
  https://api.boringmarketing.com/brands/$BRAND_ID/enrich/technical \
  -d @audit.json

Stuck runs are auto-expired after 15 minutes. If a previous technical enrichment run got stuck, this endpoint will fail it automatically before starting a new one.

Errors

StatusMeaning
404Brand not found, or not owned by the caller.
422brand_id is not a valid UUID, or request body failed validation.

Unlike the other pipeline triggers, enrich/technical does not return 409 on overlapping runs. The handler auto-expires stale runs older than 15 minutes but always proceeds to create a new technical_enrichment run, even if another run (technical or otherwise) is already active for this brand. If you need to coordinate multiple technical audits, do that on the caller side.