API
The RTFP database is publicly queryable via a REST API. All URLs below return JSON. The credential is a publishable key, designed to be shared openly.
Snapshots are available at rtfp.io/data/dumps, rebuilt on each deploy. Use these for bulk downloads.
How to use this
Each URL returns JSON. In most modern browsers JSON is shown directly. Some setups benefit from a JSON Viewer browser extension to make it more readable.
Basic filtering syntax (PostgREST): append ?column=operator.valueto any URL. Common operators are eq (equals), gt,gte, lt, lte, like(pattern match), and in (set membership). Sort withorder=column.desc.nullslast. Limit with limit=N. Pick columns with select=col1,col2,col3. Combine with &.
Worked example. Show the top 5 categories by notices received for X:
?select=category_code,notices_received&provider_slug=eq.x&order=notices_received.desc.nullslast&limit=5Full PostgREST query reference:postgrest.org.
Reference tables
Small lookup tables joined into most views, useful for understanding country and language coverage.
country_codes
30 rows: EU27 plus Iceland, Liechtenstein, Norway. Uses EU convention (EL for Greece, not GR, or IE for Ireland, not GA).
Foundational
amar_by_country
Average Monthly Active Recipients per Member State per provider, per Article 42(3) DSA. The headline platform-size metric.
/amar_by_country?country_code=eq.de → (Germany comparison)
provider_overview
One row per (provider × filing). Provider metadata, filing dates, EU total AMAR.
Government orders (Article 15(1)(a) DSA)
government_orders_by_country
Orders from Member State authorities, by country, totals across categories. Article 9 (act against illegal content) and Article 10 (provide information) reported separately.
/government_orders_by_country?country_code=eq.fr → (France comparison)
government_orders_by_category
Orders by content category (terrorism, hate speech, etc.), summed across Member States.
government_orders_summary
Grand totals per provider, with median response times.
Article 16 notices and Trusted Flaggers (Articles 15(1)(b) and 22 DSA)
notices_by_category
User notices submitted under the Article 16 mechanism, with the Trusted Flagger breakdown alongside.
/notices_by_category?provider_slug=eq.x&order=notices_received.desc.nullslast&limit=10 →
trusted_flagger_intensity
Share of notices coming from Trusted Flaggers (civil society organisations with privileged channels), per category.
/trusted_flagger_intensity?category_code=eq.TOTAL → (headline per-provider share)
notice_response_times
Median time to action notices, regular vs Trusted Flagger separately.
Own-initiative moderation (Articles 15(1)(c) and 15(1)(d) DSA)
moderation_volume_comparison
All own-initiative moderation actions, with a basis column distinguishing illegal-content from ToS-violation enforcement, and a level column for granularity. Filter on level to avoid double-counting.
automation_share_by_provider
Percentage of moderation taken solely by automated means, per provider and basis.
automated_means_accuracy
Reported accuracy, precision and recall of automated content moderation, one row per (provider × metric × scope). Heterogeneous and NOT comparable across providers. Context shows the tool or methodology note verbatim.
restriction_type_breakdown
Actions aggregated into the four Annex II families: visibility, monetary, service, account.
account_actions_summary
Account suspensions and terminations per provider per basis.
/account_actions_summary?order=total_account_actions.desc.nullslast →
Advertising services (filed separately by Google)
Google files advertising moderation as separate services (YouTube Ads, Google Play Ads, Google Maps Ads, plus Google Shopping's appeals-only sidecar). Held apart from the headline per-provider figures so a platform is never blended with its advertising business.
ad_services
Own-initiative ToS moderation volume on each advertising service, with automation share. Only Google reports advertising separately.
ad_service_appeals
Appeals and recidivism figures for advertising services (the only place Google Shopping's ad data appears).
ad_service_automation
Automated-means volumes and per-tool accuracy for advertising services. Accuracy fractions re-parsed for decimal-comma reporting.
Appeals, disputes, misuse (Articles 20, 21, 23 DSA)
internal_complaints_summary
User complaints filed via the Article 20 internal mechanism, by what was originally moderated, with reversal and upheld outcomes.
out_of_court_disputes
Article 21 disputes to certified out-of-court bodies, including share_provider_implemented_pct (the Article 24(1)(a) implementation rate).
misuse_suspensions
Article 23 suspensions for repeat offenders, split three ways per Article 24(1)(b).
Human resources (Article 42(2)(a) DSA)
human_moderators_by_language
Moderator headcount per EU official language per provider.
/human_moderators_by_language?language_code=eq.el → (Greek moderators across providers)
Cross-cutting derived metrics
These three views compute comparisons no individual provider reports themselves.
actions_per_user
Own-initiative moderation volume divided by EU AMAR, per provider and basis.
amar_per_moderator
EU AMAR divided by total human moderators per provider.
/amar_per_moderator?order=users_per_moderator.desc.nullslast →
headline_metrics_normalised
Long-format view exposing three absolute-volume metrics with their per-million-AMAR rates alongside.
Data quality and disclosure transparency
filings_overview
One row per filing event with row-count summaries per source table.
anomalies_by_filing
Methodology and data-quality observations recorded during import.
disclosure_coverage
For each (provider × mandated disclosure) tuple, whether the provider populated it. Filter on is_reported=eq.false to see what's missing.
platform_notes
Every contextual note a provider attached to its own figures across the filing, surfaced verbatim.
provider_caveats
RTFP-authored comparability notes and known data gaps per provider (RTFP's own observations, not the provider's).
Total exposed surface
27 views plus 3 tables, 30 endpoints in total. All read-only. Rate-limited at the Supabase free tier (60 requests per minute per anon user). OK for human exploration but won't survive scripted scraping.