Destination activity log
The activity log for the calling location's destinations, newest first: ONE row per source event and destination, showing the outcome of its latest observed attempt. A retried delivery that finally succeeded is one success row, not a failed row plus a success row. For per-attempt rows use GET /client/v1/destinations/deliveries. Both agency and viewer keys may read.
Where the columns come from. contact, amount, currency, signals and the UTM fields are reconstructed at read time from the source event, its session and the person's CURRENT profile. They are not the payload that was sent. For exactly what was sent, open GET /client/v1/destinations/{id}/deliveries/{eventUuid}. An event delivered more than 2 days after it occurred (a backfill or redelivery) has no contact or signals.
Status. success means the platform's API accepted the event (for Google, check ingestion with the delivery status route). skipped means the destination logged a skip at send time, for example a rate limit or no usable identifier. Events your trigger rules filter out are never logged and never listed. retrying rows are still in flight and change. test rows only appear with status=test.
Paging. Pass next_cursor back as cursor, together with since and until set to the first page's meta.window, so later pages read the same window. A row whose status changes between page reads can move, so a full walk is best-effort, not a snapshot.
curl -X GET "https://mythic-analytics.gulp.workers.dev/client/v1/destinations/activity?hours=168&since=2024-12-25T10%3A00%3A00Z&until=2024-12-25T10%3A00%3A00Z&status=all&event_name=John%20Doe&destination_id=123e4567-e89b-12d3-a456-426614174000&search=example_string&limit=50&cursor=example_string&include_stats=true" \
-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/activity?hours=168&since=2024-12-25T10%3A00%3A00Z&until=2024-12-25T10%3A00%3A00Z&status=all&event_name=John%20Doe&destination_id=123e4567-e89b-12d3-a456-426614174000&search=example_string&limit=50&cursor=example_string&include_stats=true"
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/activity?hours=168&since=2024-12-25T10%3A00%3A00Z&until=2024-12-25T10%3A00%3A00Z&status=all&event_name=John%20Doe&destination_id=123e4567-e89b-12d3-a456-426614174000&search=example_string&limit=50&cursor=example_string&include_stats=true", {
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/activity?hours=168&since=2024-12-25T10%3A00%3A00Z&until=2024-12-25T10%3A00%3A00Z&status=all&event_name=John%20Doe&destination_id=123e4567-e89b-12d3-a456-426614174000&search=example_string&limit=50&cursor=example_string&include_stats=true", 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/activity?hours=168&since=2024-12-25T10%3A00%3A00Z&until=2024-12-25T10%3A00%3A00Z&status=all&event_name=John%20Doe&destination_id=123e4567-e89b-12d3-a456-426614174000&search=example_string&limit=50&cursor=example_string&include_stats=true')
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": [
{
"ts": "2024-12-25T10:00:00Z",
"event_uuid": "example_string",
"event_name": "John Doe",
"sent_event_name": "John Doe",
"action_id": "example_string",
"action_name": "John Doe",
"destination_type": "meta_capi",
"status": "success",
"attempt": 42,
"max_attempts": 42,
"response_status": 42,
"error": "example_string",
"duration_ms": 42,
"enrichment_applied": true,
"contact": {
"person_id": "example_string",
"name": "John Doe",
"email": "user@example.com"
},
"amount": 3.14,
"currency": "example_string",
"match_quality": 3.14,
"test_events_only": true,
"signals": {
"fbc": true,
"gclid": true,
"email": true,
"phone": true,
"utm": true
},
"utm_source": "example_string",
"utm_medium": "example_string",
"utm_campaign": "example_string",
"session_id": "example_string",
"distinct_id": "example_string"
}
],
"next_cursor": "example_string",
"meta": {
"limit": 50,
"window": {
"since": "2024-12-25T10:00:00Z",
"until": "2024-12-25T10:00:00Z"
},
"stats": {
"total": 42,
"successes": 42,
"failures": 42,
"skipped": 42,
"retrying": 42,
"success_rate": 3.14,
"avg_match_quality": 3.14,
"emq_rows": 42,
"event_names": [
"John Doe"
]
}
}
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please try again later",
"code": 429,
"retryAfter": 3600
}
{
"error": "Error",
"message": "Upstream data store returned an error.",
"code": 502
}
{
"error": "Service Unavailable",
"message": "The service is temporarily unavailable. Please try again later",
"code": 503
}
/client/v1/destinations/activity
Target 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.
Window length in hours, ending at until (default now). Default 168, min 1, max 720. Not allowed together with since.
Window start. ISO 8601 or YYYY-MM-DD HH:MM:SS (UTC); milliseconds are kept. The window may span at most 720 hours.
Window end. ISO 8601 or YYYY-MM-DD HH:MM:SS (UTC). Default now.
Status of the latest attempt. all (the default) lists every row except test sends.
Exact event name as SENT to the destination (for example Purchase), as listed in meta.stats.event_names.
Only this destination (action id). action_id is accepted as an alias.
Case-insensitive substring of the contact's email or name, 2 to 100 characters. Person-based: an event with no resolved person is not found.
Rows per page. Default 50, min 1, max 100.
The previous page's next_cursor. Opaque.
Include meta.stats (header counts and event names). Default true; send false on later pages and exports.
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.
Query Parameters
Window length in hours, ending at until (default now). Default 168, min 1, max 720. Not allowed together with since.
Window start. ISO 8601 or YYYY-MM-DD HH:MM:SS (UTC); milliseconds are kept. The window may span at most 720 hours.
Window end. ISO 8601 or YYYY-MM-DD HH:MM:SS (UTC). Default now.
Status of the latest attempt. all (the default) lists every row except test sends.
allsuccessfailedskippedretryingtestExact event name as SENT to the destination (for example Purchase), as listed in meta.stats.event_names.
Only this destination (action id). action_id is accepted as an alias.
Case-insensitive substring of the contact's email or name, 2 to 100 characters. Person-based: an event with no resolved person is not found.
Rows per page. Default 50, min 1, max 100.
The previous page's next_cursor. Opaque.
Include meta.stats (header counts and event names). Default true; send false on later pages and exports.
Responses
Pass as cursor for the next page; null on the last page.