Read-only access to the statistics of your projects: accounts, daily metrics, videos, daily snapshots and UGC campaigns with counted views and payable amounts. Built for platforms that pay creators for views and want their clients to see the same numbers.
| GET | /api/v1/projects |
| GET | /api/v1/projects/{project}/accounts |
| GET | /api/v1/accounts/{handle} |
| GET | /api/v1/accounts/{handle}/daily?from&to |
| GET | /api/v1/accounts/{handle}/videos?updated_since&cursor&limit |
| GET | /api/v1/videos/{account}/{video_id} |
| GET | /api/v1/videos/{account}/{video_id}/snapshots?from&to |
| GET | /api/v1/projects/{project}/campaigns |
| GET | /api/v1/campaigns/{id} |
| GET | /api/v1/campaigns/{id}/videos?status&updated_since&cursor&limit |
| POST | /api/v1/embeds |
| POST | /api/v1/projects/{project}/invites |
We POST JSON to your https endpoint and sign it: Lumorastat-Signature: t=<unix time>,v1=<HMAC-SHA256 of "t.body">. Failed deliveries are retried after 1 min, 5 min, 30 min, 2 h and 12 h. Event ids are stable: process each id once.
import hashlib, hmac, time
def verify(secret: str, header: str, body: bytes) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
signed = parts["t"].encode() + b"." + body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
fresh = abs(time.time() - int(parts["t"])) < 300
return fresh and hmac.compare_digest(expected, parts["v1"])Write to us to get a key and the full reference (docs/api.md). Tell us your webhook URL and the origin where widgets will be shown.
hello@lumorastat.com