Blog · Meta EMQ
Meta put Event Match Quality on an API. The Events Manager tile is not the only score.
Meta put Event Match Quality on an API. As of May 28, 2025 the Dataset Quality API exposes EMQ diagnostics, coverage, dedup, and freshness. A 200 from graph.facebook.com events is still not a match.
Events Manager still shows an EMQ tile per dataset. Meta's own docs say that only works on an individual basis and is hard to scale when a partner or advertiser is managing hundreds or thousands of Pixels. The Dataset Quality API, formerly Integration Quality, is the programmatic consolidation. May 28, 2025 is when the extra metrics landed on that endpoint.
The events POST can still 200 with empty match keys, a hashed IP, or no event_id. That 200 is ingest. EMQ is a different GET. composite_score is out of 10 for web events. It is calculated from which customer information parameters arrived, the quality of those values, and the percent of event instances matched to a Meta account. It is calculated in real time. It is not a pixel helper screenshot.
The GET is dataset_quality, not /events
The endpoint is GET https://graph.facebook.com/v25.0/dataset_quality. Required query parameters are dataset_id (the Pixel / dataset id) and access_token. Optional agent_name filters to events sent with a matching partner_agent. If you omit agent_name, all events count in the EMQ calculation, including events a partner sent on your behalf.
The web field is required by default. You ask for nested metrics in fields=. A minimal EMQ pull is fields=web{event_match_quality,event_name}. The sample response on the docs page is an array of event_name rows, each with event_match_quality.composite_score and match_key_feedback[].identifier plus coverage.percentage. That shape is the score. It is not the events edge.
Tokens are not interchangeable with a hope. The user or system user needs at least Partial access, Use events dataset. App permissions start at ads_read plus ads_management or business_management. High volume needs advanced ads_management and Marketing API Access Tier. Spend fields later required ads_read or ads_management. A token that can POST /{pixel-id}/events is not automatically a token that can read quality.
May 28 added diagnostics, coverage, dedup, freshness
As of May 28, 2025 Meta added Additional Conversions Reported, ACR per parameter, ACR per event, ACR for event coverage, Event Coverage, Event Deduplication, Data Freshness, and Event Match Quality Diagnostics. Those are queryable fields on the same dataset_quality GET. They are not new columns inside the Purchase you POST.
EMQ diagnostics are issues Meta identified with the CAPI integration. Each diagnostic has name, description, solution, percentage, affected_event_count, and total_event_count. The docs example includes Server sending mismatched IP addresses and a recommendation to send client_ip_address retrieved from customer interactions. Extract those rows. Do not wait until someone opens Events Manager on one Pixel.
Event coverage is the 7-day average percent of Pixel events covered by CAPI that share deduplication keys with the server events. Meta's example description is the percentage of events received from CAPI compared to unique browser events from the Pixel. The sample includes a goal_percentage of 75. Dedup key feedback then splits event_id, external_id, and fbp into browser vs server percentages. Data freshness reports upload_frequency such as real_time or hourly. Best practice in that article is real time or as close as you can get.
April 2026 added spend and ad sets
As of April 2026 the same docs page added Event Spend and Event Ad Sets. event_spend is total ad spend associated with the event, aggregated across ad sets optimizing for or targeting that event. It returns amount and currency_code. It is omitted when no ad sets are associated. event_ad_sets is a per-ad-set breakdown: ad_set_id, ad_set_name, objective, spend_amount, spend_currency_code, and event_use Optimization or Targeting. Up to 100 ad sets. Also omitted when none are associated.
Those breakdowns are how a partner sorts which Purchase to fix first. They are not EMQ. A high spend event with a low composite_score is still a match problem. A 200 on /events with no em, no fbp, and a hashed user-agent can sit under a Sales ad set and still look live in your gateway logs.
Do not invent a 20 percent industry EMQ drop. Agency recaps are not the Dataset Quality API. If you need a number, read composite_score and coverage.percentage for your dataset_id. Meta's sample JSON is a sample. It is not your account and it is not a benchmark I am going to repeat as fact.
The body people will celebrate first
A Graph CAPI purchase that can 200 on /{pixel-id}/events. This is not an EMQ score.
{
"data": [{
"event_name": "Purchase",
"event_time": 1748448000,
"action_source": "website",
"event_source_url": "https://shop.example.com/checkout",
"event_id": "order-123",
"user_data": {
"em": ["64ec88ca00000000000000000000000000000000000000000000000000000000"]
}
}]
}
That object is a legal Meta CAPI event if the hash and the rest of user_data are right. The events edge can still 200. Events Manager can still show a received server event. EMQ can still be low if email coverage is thin, fbp is missing, IP does not match the pixel, or the digest was hashed twice. The quality GET is the score. The POST is the input.
Match keys that actually move EMQ are the customer information parameters on user_data. em and ph are SHA-256 hex after the documented normalize steps. client_ip_address and client_user_agent stay plaintext. fbp and fbc stay plaintext cookie values. Hashing those because a helper hashed em is a diagnostic, not a privacy win. Send fbc when you have fbclid. The Dataset Quality API will not invent the cookie you dropped at hosted checkout.
Names that do not translate
- POST /{pixel-id}/events is ingest. GET /dataset_quality is the score.
- Events Manager EMQ is one dataset in a UI. dataset_quality is the same class of metric at scale.
- composite_score is out of 10, web events only.
- event_coverage is not EMQ. It is Pixel vs CAPI coverage with shared dedup keys.
- dedupe_key_feedback is event_id, external_id, fbp coverage, not a match key hash.
- data_freshness.upload_frequency is real_time or hourly, not event_time.
- event_spend and event_ad_sets arrived April 2026. They are spend, not match quality.
- agent_name filters partner_agent. Omitting it includes every sender.
A 200 is still not a join
People google Meta CAPI 200 and assume the purchase attributed. Graph can accept a body that never matches a Meta account. EMQ exists because ingest and match are different. Diagnostics exist because a matched event can still be low quality. Coverage exists because a server Purchase that never shared event_id with the pixel is a second Purchase or a drop, depending on the rest of the key.
If you run pixel plus CAPI, send the same event_id both sides. Put fbp and fbc on the server event for users whose browser tag never ran. Do not wait for the Events Manager tile to load on a Thursday. Pull web{event_match_quality{composite_score,match_key_feedback,diagnostics},event_coverage,dedupe_key_feedback,data_freshness,event_name}. Alert on diagnostics.name, not on HTTP 200.
Offline, app, and conversion-lead EMQ are not on this web field. The docs say EMQ is currently available only for web events and to contact a Meta representative for other types. Pulling dataset_quality and finding only website rows is expected. It is not a broken token.
Event match quality (EMQ) is a score (out of 10) that indicates how effective the customer information sent from your server may be at matching event instances to a Meta account.
Meta Dataset Quality API
What to do
Keep posting CAPI with hashed em and ph, plaintext IP and user-agent, fbp, fbc, and event_id. Then GET dataset_quality on a schedule. Store composite_score, match_key_feedback, diagnostics, event_coverage.percentage, and upload_frequency per event_name. Fix empty client_ip_address and missing event_id before you argue about bidding.
Do not point a shared quality dashboard at a single Events Manager screenshot. The API exists because screenshots do not scale. Do not cite an agency 20 percent drop as the industry. Read your dataset. Lint the body you POST. The Meta pack is vendor/meta-conversions-api. It checks the envelope. It does not compute EMQ.
The contract page for the quality fields is the Dataset Quality API. This post is the market fact: EMQ is a GET now, and a 200 from events is still not a match. Pixellint is not affiliated with Meta. Passing a linter means the artifact matches the published CAPI envelope. It does not mean Events Manager scored the join.
Checklist
- GET /dataset_quality with dataset_id and a token that can read the dataset. Do not use the events POST as the score.
- Request web{event_match_quality,event_coverage,dedupe_key_feedback,data_freshness,event_name}.
- Treat composite_score as web-only, out of 10, real time.
- Fix diagnostics (empty or mismatched IP, missing match keys) instead of celebrating HTTP 200.
- Send event_id on pixel and CAPI. Send fbp and fbc in the clear. Hash em and ph. Do not hash IP or UA.
- After April 2026, pull event_spend and event_ad_sets if the token has ads_read or ads_management.
Sources
Contract pages
The dated argument is above. These pages are the field lists.