Extension bootstrap
The agency, the key in use (prefix and name, never the secret), every location on the roster with what each has connected for Meta and Google, and the extension controls an operator can set.
connected means an active ad-platform connection exists. synced means Mythic would find its ad tables: a connection whose dataset sits in Mythic's warehouse and has synced at least once, or a legacy connection that has synced. It is a cheap proxy that never queries BigQuery, so a synced location can still answer 424 ads_table_missing on /client/v1/constraints.
curl -X GET "https://mythic-analytics.gulp.workers.dev/client/v1/extension/me" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://mythic-analytics.gulp.workers.dev/client/v1/extension/me"
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/extension/me", {
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/extension/me", 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/extension/me')
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": {
"agency": {
"id": "6f1c...",
"name": "Acme Agency"
},
"key": {
"type": "mcp",
"prefix": "mcp_3fa9",
"name": "Chrome extension · 2026-10-06",
"scopes": [
"extension:read",
"constraints:read"
]
},
"locations": [
{
"id": "c84d700c-...",
"name": "Boundless Therapy",
"status": "active",
"platforms": {
"meta": {
"connected": true,
"synced": true
},
"google": {
"connected": false,
"synced": false
}
}
}
],
"roster_size": 1,
"extension": {
"min_version": "1.0.0",
"notice": "Meta is rolling out a new Ads Manager layout this week."
}
}
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Forbidden",
"message": "You don't have permission to access this resource",
"code": 403
}
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please try again later",
"code": 429,
"retryAfter": 3600
}
/client/v1/extension/me
Target server for requests. Edit to use your own host.
Agency-wide mcp_ key holding extension:read, or an agency key (ak_). A location secret key (sk_) or a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.
mcp_ key holding extension:read, or an agency key (ak_). A location secret key (sk_) or a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Agency-wide mcp_ key holding extension:read, or an agency key (ak_). A location secret key (sk_) or a client-bound mcp_ key gets 403 agency_key_required. See Using an mcp_ key over HTTP.