Listening: reports
Intelligence reports
Intelligence reports (latest 100, without data)
Add report to project
Manage: generate a report { from, to, title? } (10/min): snapshot of the dashboard, hashtags, topics, peaks, top mentions, influencers, demographics (aggregate audience estimates, small buckets null; also in the HTML and CSV downloads), reviews (the dashboard's reviews block) and low_reviews (the newest 5 reviews of 1–2 stars: id, platform, url, author, text, published_at, rating, target, variant, seller_reply bool); the HTML, the CSV and scheduled e-mails show a reviews section only when the project has reviews or review sources + summary (Gemini when GEMINI_API_KEY is set, else rule-based Vietnamese; summary_source gemini|rules)
One report with data and summary
One report with data and summary
Delete report (listening › projects)
Manage: delete
Get download (listening › projects › reports)
?format=html (self-contained, inline tables, white-label branding when the account has one) or csv (section, key, value, previous, change)
Uploaded report documents
Uploaded report documents (newest first, up to 200; ?q matches the name). Everyone who can open the project (members, guests). Each: id, name, description, file_name, bytes, download_url (signed, valid until the end of the next day), previews [{ position, url (signed), mime_type, bytes }], preview_count, created_by, created_at
Report library project
Manage: upload a report (multipart, 10/min, up to 200 per project). The bytes decide: file must start with %PDF-, each preview must be PNG or JPEG by its signature and content (16:9 reads best, not enforced); the browser's name and type are ignored. Stored on the private listening media disk
One uploaded report
One uploaded report
Delete report library (listening › projects)
Manage: delete it with its files
The PDF
The PDF (30/min): Content-Disposition attachment, Content-Type application/pdf, CSP default-src 'none'; sandbox, nosniff
A report library file by the signed link the API hands out
A report library file by the signed link the API hands out (no token, 600/min): file = document (the PDF, as an attachment) or a preview position (PNG/JPEG inline); always CSP default-src 'none'; sandbox and nosniff. 403 when the signature is missing, wrong or expired
E-mail schedules
E-mail schedules (?active=1|0 for active or paused only): id, name, type, frequency, weekdays, times (the send times of a sending day inside the window, what send_times / every_hours work out to), send_times, every_hours, window_from, window_to, recipients and cc (managers only; [] for viewers and guests), recipients_count, cc_count, full_period (true: reports the last full week or month), is_active, next_run_at, last_sent_at (last scheduled send, the start of the next since-last-send period), last_test_sent_at (last send now), last_error; a due schedule with no next send left is paused (is_active false) with last_error
Add report schedule to project
Manage (max 5 per project). Times are the project's timezone. Without send_times and every_hours a schedule sends once at 08:00, as before. A weekly or monthly schedule sending once reports the last full week (Monday–Sunday) or month; every other one reports since its last send (the last 24 hours the first time, at most 31 days). type negative_alert e-mails the mentions that became negative since the last send (by sentiment_at, when Gemini or a person set the sentiment, so a mention labelled after a digest went out is in the next one) with the top 10 by interactions, and sends nothing when there are none. Without cc every recipient gets a mail of their own; with cc one mail goes to all recipients, copied to cc. The scheduler runs every 5 minutes; a send more than 15 minutes late that falls outside the window is skipped
Update report schedule (listening › projects)
Manage: update any field of the create body; changing a timing field (or turning it back on) moves next_run_at; setting every_hours clears send_times and the other way round
Delete report schedule (listening › projects)
Manage: delete
Send report schedule
Manage: send now (5/min), whatever the window: the period it would send next; recorded in last_test_sent_at, last_sent_at (the next scheduled period's start) does not move. meta { sent, result sent|skipped|failed }: skipped = a negative alert with no negative mention; 502 with last_error when it failed