Meta's own verdict on the data you send
meta_capi destinations only. A 200 from the Conversions API means Meta ACCEPTED the event, not that it can use it: Meta separately scores every dataset on whether those events can be matched to real accounts, and a destination with a spotless delivery log can still be feeding Meta events it cannot match. This endpoint reads that scoring (Meta's Dataset Quality API) for the destination's pixel.
One token does both. Quality is read with the destination's OWN stored credential. Generate it in Events Manager under Settings → Conversions API → "Set up with Dataset Quality API" (the recommended option) and the same system-user token sends events and reads quality, scoped to that one dataset. A token generated with the plain option delivers normally and returns 409 insufficient_permission here — regenerate it and store it again.
Absent is not zero. Every metric is null when Meta reported nothing for it — most often dedupe feedback on a dataset with too little paired browser/server traffic to judge. null means unknown, and is never rendered as a failing score.
Meta keeps no history. The live response is the current score. history=N adds the last N days from Mythic's own daily snapshot, which is the only way to see when something moved.
Test fires are set aside. test_event_code keeps an event out of Meta's reporting, not out of its quality scoring — measured: a test delivery through POST /{id}/test is scored like any other event, and scores badly, because its customer parameters are synthetic. An event whose deliveries in the last 28 days were all test fires is therefore flagged test_events_only and excluded from summary; it stays in events and is named in summary.excluded_test_events, so the headline can always be reconciled against the list. An event with no deliveries of ours at all is never treated this way.
curl -X GET "https://mythic-analytics.gulp.workers.dev/client/v1/destinations/example_string/quality?history=0" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://mythic-analytics.gulp.workers.dev/client/v1/destinations/example_string/quality?history=0"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://mythic-analytics.gulp.workers.dev/client/v1/destinations/example_string/quality?history=0", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://mythic-analytics.gulp.workers.dev/client/v1/destinations/example_string/quality?history=0", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://mythic-analytics.gulp.workers.dev/client/v1/destinations/example_string/quality?history=0')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"action_id": "123e4567-e89b-12d3-a456-426614174000",
"dataset_id": "example_string",
"events": [
{
"event_name": "John Doe",
"event_match_quality": 3.14,
"match_keys": [
{
"identifier": "example_string",
"coverage_percentage": 3.14
}
],
"event_coverage_percentage": 3.14,
"event_coverage_goal_percentage": 3.14,
"additional_conversions_percentage": 3.14,
"potential_additional_conversions_percentage": 3.14,
"dedupe_key": "example_string",
"browser_events_with_dedupe_key_percentage": 3.14,
"server_events_with_dedupe_key_percentage": 3.14,
"browser_coverage_from_dedupe_key_percentage": 3.14,
"upload_frequency": "example_string",
"flags": [
{
"code": "emq_low",
"severity": "info",
"message": "example_string"
}
]
}
],
"summary": {
"events_scored": 42,
"events_returned": 42,
"min_event_match_quality": 3.14,
"worst_event": "example_string",
"critical_flags": 42,
"warning_flags": 42,
"status": "ok",
"excluded_test_events": [
"example_string"
]
},
"history": [
{
"day": "2024-12-25",
"event_name": "John Doe",
"event_match_quality": 3.14,
"event_coverage_percentage": 3.14,
"server_dedupe_key_percentage": 3.14,
"browser_dedupe_key_percentage": 3.14
}
]
}
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Not Found",
"message": "The requested resource was not found",
"code": 404
}
{
"error": "Conflict",
"message": "The request conflicts with the current state of the resource",
"code": 409,
"details": "Resource already exists"
}
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please try again later",
"code": 429,
"retryAfter": 3600
}
{
"error": "Error",
"message": "Meta was unreachable or returned an unexpected error",
"code": 502
}
{
"error": "Error",
"message": "Meta did not respond in time",
"code": 504
}
/client/v1/destinations/{id}/qualityTarget server for requests. Edit to use your own host.
Client key as bearer token. Use an agency key (Bearer ak_...) for read-write access or a location secret key (Bearer sk_...) for read-only access. Scoped keys (mcp_) are accepted too and need destinations:read or destinations:write. See Using an mcp_ key over HTTP.
Bearer ak_...) for read-write access or a location secret key (Bearer sk_...) for read-only access. Scoped keys (mcp_) are accepted too and need destinations:read or destinations:write. See Using an mcp_ key over HTTP.
Include the last N days of daily snapshots alongside the live read. Default 0 (live only). Values outside 0-90 are clamped.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Client key as bearer token. Use an agency key (Bearer ak_...) for read-write access or a location secret key (Bearer sk_...) for read-only access. Scoped keys (mcp_) are accepted too and need destinations:read or destinations:write. See Using an mcp_ key over HTTP.
Path Parameters
Query Parameters
Include the last N days of daily snapshots alongside the live read. Default 0 (live only). Values outside 0-90 are clamped.