Integrate reports, monitoring and response status into your security workflow. This reference covers the implemented v1 resource routes. All data examples are illustrative, not live records; angle-bracket placeholders must be replaced with returned values. Domains and URLs shown in responses are defanged for publication.
Authentication and base URL
Base URL: https://ugapgzpffrykyglevlhz.supabase.co/functions/v1/blackwall-api
Create a company API key in your company dashboard. Keys start with fp_co_; send the full secret in the X-API-Key header. Keep it in server-side secret storage, never in browser bundles or logs. Revoke and replace exposed keys. An expired or revoked key cannot authenticate.
Available scopes are read, submit, watchlist, takedowns and findings. Scopes do not override plan capabilities. All POST routes also require the plan’s API submission feature, including watchlist creation.
For examples, set BASE to the base URL and FP_KEY to your key. Replace UUID placeholders in paths. Replace $TARGET_DOMAIN and $OWNED_DOMAIN in request bodies with actual domains before running: these are literal placeholders, not automatically expanded inside JSON. Optional screenshot and evidence arrays may be omitted. Successful responses are JSON; POST creation normally returns 201, other operations return 200.
Idempotency with external_ref
POST /v1/reports accepts an optional case-sensitive external_ref of 1–128 printable non-space ASCII characters. Reuse it when retrying the same submission. A duplicate for the same company returns the existing id, report_ref and status with 200 rather than creating another report; it does not update the original payload. This mechanism is specific to report submission, not a general idempotency header.
List reports, newest first. Optional case_status filters by case step: accepted, in_progress, resolved_taken_down or resolved_no_threat. Collection limit defaults to 50 and is clamped to 1–200. These collections do not return pagination cursors.
curl -X GET "$BASE/v1/reports?limit=50&case_status=in_progress" \
-H "X-API-Key: $FP_KEY"
Read one report using its returned id (UUID), not report_ref. Includes the case history, takedowns and evidence. Screenshot URLs are temporary signed URLs and can be null; do not store them as permanent evidence links.
curl -X GET "$BASE/v1/reports/<report-id>" \
-H "X-API-Key: $FP_KEY"
Submit a report. Supply url or domain (url takes precedence), a supported category and a description of 30–20,000 characters. Optional evidence_urls accepts up to 20 HTTP(S) URLs. Optional screenshots accepts up to three base64 PNG/JPEG images, each at most 1.5 MB; matching data-URL prefixes are accepted. The plan must enable API submission.
curl -X POST "$BASE/v1/reports" \
-H "X-API-Key: $FP_KEY" \
-H "Content-Type: application/json" \
--data '{"domain":"$TARGET_DOMAIN","category":"phishing-page","description":"A fake login page is impersonating our brand and collecting account credentials.","external_ref":"incident-demo-1","evidence_urls":[],"screenshots":[]}'
Read Brand Shield findings, newest first. Optional since is an ISO timestamp filtering first_seen inclusively; min_score is a number from 0 to 100; status is an exact filter. Supports limit.
curl -X GET "$BASE/v1/findings?limit=50&min_score=50" \
-H "X-API-Key: $FP_KEY"
Create a report from an owned finding. Uses the submit scope, not the findings scope. No request body is required; the plan must enable API submission.
curl -X POST "$BASE/v1/findings/<finding-id>/report" \
-H "X-API-Key: $FP_KEY"
Company API and Threat API allowances are counted separately per company and reset daily at 00:00 UTC. GET /v1/status returns your current limits and usage. Starter keys can read; submitting cases and managing the watchlist need Pro or Enterprise.
Capability
No key
Free key
Starter
Pro
Enterprise
Price
Free
Free account
$99/mo
$269/mo
Custom
Threat API lookups
20 / hour per IP
1,000 / day · 60 / min
– / day
– / day
– / day
Threat feeds & change sync
24 feed downloads / day
Company API: read cases, findings, takedowns
– requests / day
– requests / day
– requests / day
Submit reports & manage watchlist via API
–
–
–
Brand Shield findings
–
–
–
Webhooks for case updates
–
–
–
SIEM export (CSV, CEF, JSON)
–
–
–
Key type
none
fp_live_…
fp_co_…
fp_co_…
fp_co_…
Company plans add a burst limit of 60 requests per minute per key. Not sure yet? Request a 14-day demo with Pro features, or compare plans on the pricing page.
Errors and retries
Errors use {error, message}. Handle the HTTP status and machine-readable error code rather than matching message text. Resource validation can return 400 invalid_input, missing scopes return 403 insufficient_scope, unavailable capabilities return 403 forbidden, missing resources return 404 not_found and watchlist caps return 409 watchlist_limit. Authentication failures return 401, quotas return 429 rate_limit and unexpected failures return 500. Correct invalid input before retrying; use backoff for quota or temporary failures and external_ref for report retries.