List sync events
Return the paginated, immutable sync-event log for the calling agency. Each event captures the outcome and record/byte counts of a completed sync, as reported by Airbyte when the job finished.
Rows arrive from two places: sync notifications (live, complete) and POST /connections/{id}/backfill, which imports history from Airbyte's jobs API. Backfilled rows carry fewer fields — the jobs API reports one combined row count with no emitted/committed split and no error classification. Both are keyed on (connection_id, job_id), so a backfill after the fact never duplicates a notification, and a re-delivered notification never double-counts.
This log only exists for workspaces whose Airbyte notifications point at Mythic; see POST /config/notifications.
curl -X GET "https://mythic-analytics.gulp.workers.dev/client/v1/airbyte/sync-events?connection_id=example_string&platform=example_string&client_id=example_string&success=true&limit=50&offset=0" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://mythic-analytics.gulp.workers.dev/client/v1/airbyte/sync-events?connection_id=example_string&platform=example_string&client_id=example_string&success=true&limit=50&offset=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/airbyte/sync-events?connection_id=example_string&platform=example_string&client_id=example_string&success=true&limit=50&offset=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/airbyte/sync-events?connection_id=example_string&platform=example_string&client_id=example_string&success=true&limit=50&offset=0", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
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/airbyte/sync-events?connection_id=example_string&platform=example_string&client_id=example_string&success=true&limit=50&offset=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'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"success": true,
"data": [
{
"id": "example_string",
"client_id": "example_string",
"agency_id": "example_string",
"connection_id": "oauth:meta_ads:acme-retail",
"platform": "example_string",
"job_id": 123,
"success": true,
"error_origin": "oauth_callback",
"error_type": "example_string",
"error_message": "example_string",
"started_at": "2024-12-25T10:00:00Z",
"finished_at": "2024-12-25T10:00:00Z",
"duration_seconds": 42,
"landed": true,
"records_emitted": 15230,
"records_committed": 15230,
"records_filtered_out": 42,
"bytes_emitted": 42,
"bytes_committed": 42,
"bytes_filtered_out": 42,
"log_url": "example_string",
"raw_payload": {},
"created_at": "2024-12-25T10:00:00Z"
}
],
"total": 128,
"limit": 50,
"offset": 0
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
/sync-events
Target server for requests. Edit to use your own host.
Agency key as bearer token, format Bearer ak_.... Grants full read-write access scoped to the agency. Agency-wide scoped keys (mcp_ with no fixed location) are accepted too and need airbyte:read or airbyte:write; a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.
Bearer ak_.... Grants full read-write access scoped to the agency. Agency-wide scoped keys (mcp_ with no fixed location) are accepted too and need airbyte:read or airbyte:write; a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.
Location secret key as bearer token, format Bearer sk_.... Grants read-only access; the agency is resolved from the location. Write endpoints return 403.
Bearer sk_.... Grants read-only access; the agency is resolved from the location. Write endpoints return 403.
Filter by Airbyte connection ID.
Filter by platform key.
Filter by client (location) identifier.
Filter by outcome. Pass true or false.
Maximum results per page. Default 50, clamped to 1–500.
Number of results to skip. Default 0.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Agency key as bearer token, format Bearer ak_.... Grants full read-write access scoped to the agency. Agency-wide scoped keys (mcp_ with no fixed location) are accepted too and need airbyte:read or airbyte:write; a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.
Bearer token. Location secret key as bearer token, format Bearer sk_.... Grants read-only access; the agency is resolved from the location. Write endpoints return 403.
Query Parameters
Filter by Airbyte connection ID.
Filter by platform key.
Filter by client (location) identifier.
Filter by outcome. Pass true or false.
Maximum results per page. Default 50, clamped to 1–500.
Number of results to skip. Default 0.