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=5

Full 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).

/country_codes →

language_codes

24 rows: the official EU languages per Article 55 TFEU.

/language_codes →

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.

/provider_overview →

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_by_category?provider_slug=eq.tiktok&order=orders_act_received.desc.nullslast&limit=10 →

government_orders_summary

Grand totals per provider, with median response times.

/government_orders_summary →

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.

/notice_response_times?category_code=eq.TOTAL →

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.

/moderation_volume_comparison?level=eq.total →

automation_share_by_provider

Percentage of moderation taken solely by automated means, per provider and basis.

/automation_share_by_provider →

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.

/automated_means_accuracy?metric=eq.Accuracy →

restriction_type_breakdown

Actions aggregated into the four Annex II families: visibility, monetary, service, account.

/restriction_type_breakdown →

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_services →

ad_service_appeals

Appeals and recidivism figures for advertising services (the only place Google Shopping's ad data appears).

/ad_service_appeals →

ad_service_automation

Automated-means volumes and per-tool accuracy for advertising services. Accuracy fractions re-parsed for decimal-comma reporting.

/ad_service_automation →

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.

/internal_complaints_summary?complaint_subject=eq.Number%20of%20complaints%20submitted%20to%20the%20internal-complaints%20mechanism →

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).

/out_of_court_disputes →

misuse_suspensions

Article 23 suspensions for repeat offenders, split three ways per Article 24(1)(b).

/misuse_suspensions →

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.

/actions_per_user?basis=eq.tc →

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.

/headline_metrics_normalised?metric_key=eq.account_actions&dimension_key=eq.all&order=per_million_amar.desc.nullslast →

Data quality and disclosure transparency

filings_overview

One row per filing event with row-count summaries per source table.

/filings_overview →

anomalies_by_filing

Methodology and data-quality observations recorded during import.

/anomalies_by_filing →

disclosure_coverage

For each (provider × mandated disclosure) tuple, whether the provider populated it. Filter on is_reported=eq.false to see what's missing.

/disclosure_coverage?is_reported=eq.false →

platform_notes

Every contextual note a provider attached to its own figures across the filing, surfaced verbatim.

/platform_notes?provider_slug=eq.google-maps →

provider_caveats

RTFP-authored comparability notes and known data gaps per provider (RTFP's own observations, not the provider's).

/provider_caveats →

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.