Connect AppsFlyer to ChatGPT: Analyze Performance & Reporting Data
Learn how to connect AppsFlyer to ChatGPT using a managed MCP server. Automate mobile attribution reporting, OneLink generation, and SKAN analysis.
If you want to connect AppsFlyer to ChatGPT so your marketing operations and data engineering teams can analyze mobile attribution data, generate tracking links, and audit campaign performance, you need a Model Context Protocol (MCP) server. If your team uses Claude, check out our guide on connecting AppsFlyer to Claude or explore our broader architectural overview on connecting AppsFlyer to AI Agents.
Giving a Large Language Model (LLM) access to an enterprise mobile attribution platform is an immense engineering undertaking. AppsFlyer's APIs are incredibly dense, featuring complex aggregation models, plan-specific endpoint limitations, and massive data payloads. You can either spend months building, hosting, and maintaining a custom MCP server to translate LLM JSON arguments into AppsFlyer's highly specific query structures, or you can use a managed infrastructure layer to generate tools dynamically.
This guide breaks down exactly how to use Truto to generate a secure, authenticated MCP server for AppsFlyer, connect it natively to ChatGPT, and execute complex mobile marketing workflows using natural language.
The Engineering Reality of the AppsFlyer API
A custom MCP server acts as the translation layer between the open MCP standard and your target API. While the MCP specification makes it easy for models to discover tools, implementing it against AppsFlyer's specific architectural quirks is exceptionally painful.
If you decide to build a custom MCP server for AppsFlyer, you own the entire API lifecycle. Here are the specific integration challenges that break standard CRUD assumptions when working with AppsFlyer:
The Master API Dimension Matrix
Unlike SaaS platforms with simple GET /users endpoints, AppsFlyer's primary reporting engine - the Master API - is entirely dynamic. An LLM cannot just "get reports." It must construct a payload defining the app_id, from, to, groupings (e.g., pid, c, geo), and kpis (e.g., installs, clicks, revenue). Your MCP server must present a strict JSON Schema that teaches the LLM exactly which enumerations are valid for these arrays. If you simply pass raw LLM text to the Master API, it will reject the request. Furthermore, the Master API will return an HTTP 416 error if the connected account is on the free Zero plan, requiring your agent to handle plan-based permission errors gracefully.
Raw Data Volume and Pagination
AppsFlyer raw data reports (like the raw_installs or raw_in_app_events endpoints) return massive CSV payloads containing up to 1,000,000 rows per call. Feeding a million rows of CSV data directly back into an LLM's context window will instantly crash the session. Your MCP server must handle the translation of these specific maximum_rows constraints and manage pagination cursors explicitly, instructing the LLM on how to iterate through the dataset without blowing up its token limit.
SKAdNetwork (SKAN) Nullability Rules
Apple's privacy framework introduces heavy fragmentation into the API. When querying SKAN performance reports, you must dictate whether you are targeting SKAN V3 (/v2/ endpoints) or SKAN V4 (/v3/ endpoints). If an LLM requests V4 data but the postbacks belong to V3, AppsFlyer returns null for V4-specific fields. Additionally, querying SKAN endpoints for an Android app_id results in an immediate HTTP 400 error. Your MCP server logic must inherently understand and map these platform-specific edge cases.
Strict Rate Limits and the IETF Spec
When building agentic workflows that iterate over hundreds of campaigns or apps, you will hit AppsFlyer's rate limits. Truto does not retry, throttle, or apply backoff on rate limit errors. When the AppsFlyer API returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller.
However, Truto normalizes the upstream rate limit information into standardized headers per the IETF specification (ratelimit-limit, ratelimit-remaining, ratelimit-reset). This means your ChatGPT setup or agentic framework is responsible for reading these standardized headers and implementing the necessary retry/backoff logic. You cannot rely on the proxy layer to silently absorb these limits.
Setting Up the AppsFlyer MCP Server
To bypass these API headaches, you can use Truto to instantly spin up a managed MCP server. This requires two phases: generating the server URL in Truto, and registering that URL in ChatGPT.
Phase 1: Create the MCP Server in Truto
You can generate an MCP server scoped to a specific AppsFlyer account using either the Truto Dashboard or the Truto REST API.
Method A: Via the Truto UI
- Log into your Truto dashboard and navigate to Integrated Accounts.
- Connect a new AppsFlyer account (providing the necessary API tokens).
- Click into the integrated account page and select the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration. For example, restrict it to
readmethods only if you just want reporting data. - Copy the generated MCP server URL. Treat this URL as a sensitive credential.
Method B: Via the Truto API
If you are provisioning infrastructure programmatically, you can POST to the Truto API. Filter by methods and tags to constrain exactly what ChatGPT can touch.
curl -X POST https://api.truto.one/integrated-account/$INTEGRATED_ACCOUNT_ID/mcp \
-H "Authorization: Bearer $TRUTO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "AppsFlyer Performance Bot",
"config": {
"methods": ["read", "write", "custom"],
"tags": ["reports", "onelink", "skan"]
}
}'The response returns a url field (e.g., https://api.truto.one/mcp/<token>). This URL is fully authenticated and ready to handle JSON-RPC requests.
Phase 2: Connect the MCP Server to ChatGPT
ChatGPT supports custom MCP connectors. Depending on your environment, you can connect via the UI or by running a local proxy.
Method A: Via the ChatGPT UI (Developer Mode)
- In ChatGPT, go to Settings -> Apps -> Advanced settings.
- Toggle on Developer mode (available on Pro, Plus, Business, Enterprise, and Education plans).
- Under MCP servers / Custom connectors, click to add a new server.
- Enter a name (e.g., "AppsFlyer Analytics").
- Paste the Truto MCP URL into the Server URL field.
- Click Save. ChatGPT will immediately handshake with the URL and discover all available AppsFlyer tools.
Method B: Via Manual Config File (SSE Wrapper)
If you are running a local agent environment or orchestrating ChatGPT via an enterprise desktop setup, you can use the @modelcontextprotocol/server-sse wrapper to connect to Truto's HTTP endpoint.
Create a config file (e.g., appsflyer-mcp.json):
{
"mcpServers": {
"appsflyer": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"--url",
"https://api.truto.one/mcp/<YOUR_TRUTO_TOKEN>"
]
}
}
}Run your agent framework with this configuration, and it will proxy the JSON-RPC lifecycle directly to Truto.
AppsFlyer Hero Tools for AI Agents
Truto automatically generates tools from the AppsFlyer API schema. Below are 6 high-leverage hero tools that unlock mobile attribution workflows in ChatGPT.
list_all_apps_flyer_master_reports
The Master API is the core engine for aggregated data. This tool allows ChatGPT to query KPIs grouped by the dimensions you choose. It requires app_id, from, to (yyyy-mm-dd format), groupings (e.g., pid, c, geo), and kpis (e.g., installs, clicks, revenue).
"Pull a Master API report for app ID 'id123456789' from 2023-10-01 to 2023-10-31. Group the data by geo and campaign, and return the installs, clicks, and revenue KPIs."
list_all_apps_flyer_raw_installs
This tool fetches raw CSV data for app installs. Because raw data reports can return up to 1,000,000 rows, Truto manages the schema to ensure the LLM can define the exact timeframe safely. Requires raw data access on your AppsFlyer plan.
"Fetch the raw install logs for my Android app from yesterday between 08:00 and 12:00. Extract the first 500 rows to look for suspicious device IPs."
create_a_apps_flyer_onelink_link
OneLink allows marketers to create a single tracking link that routes users dynamically based on their device. This tool allows the agent to provision new tracking URLs programmatically for specific campaigns.
"Create a new OneLink link using our default template. Set the media source to 'twitter', the campaign name to 'winter_promo_2024', and the deep link path to 'shop/winter-sale'."
apps_flyer_cohort_reports_search
Cohort analysis is vital for understanding user retention and lifetime value (LTV). This tool builds a cohort report based on specific aggregation types (on_day or cumulative), KPIs, and groupings.
"Generate a cumulative cohort report for user acquisition over the last 30 days. Group the cohort by media source and show me the Day 7 and Day 14 retention rates."
create_a_apps_flyer_s_2_s_event
This tool allows the agent to send server-to-server in-app events directly to AppsFlyer. It is highly useful for triggering post-install conversions or revenue events from backend systems.
"Send an S2S event to AppsFlyer for user ID 'user_998'. The event name is 'subscription_purchased', the event value is 49.99, and the currency is USD."
list_all_apps_flyer_skan_performance_reports
SKAdNetwork (SKAN) data is required for measuring iOS campaigns. This tool pulls aggregated postbacks. The LLM must select the correct base URL (/v2/ for SKAN V3 or /v3/ for SKAN V4) depending on the analysis needed.
"Fetch the SKAN V4 performance report for our iOS app over the last 7 days. Break down the data by ad network and campaign ID to show me which partner is driving the most fine conversion values."
To view the complete inventory of available endpoints, schemas, and required parameters, visit the AppsFlyer integration page.
Workflows in Action
When you connect AppsFlyer to ChatGPT via MCP, the LLM can orchestrate multi-step data pipelines autonomously. Here are three realistic scenarios.
1. The Performance Marketing ROAS Audit
A performance marketer wants to analyze the return on ad spend (ROAS) across regions for a specific time period.
"Pull the Master API report for app 'id987654321' from November 1st to November 30th. Group it by geo and media source. Give me installs, total cost, and revenue. Calculate the ROAS for the top 5 countries."
Step-by-step execution:
- ChatGPT calls
list_all_apps_flyer_master_reportswithgroupings: ["geo", "pid"]andkpis: ["installs", "cost", "revenue"]. - The MCP server translates this into the required URL parameters and executes the request.
- ChatGPT receives the aggregated JSON response, calculates the Cost/Revenue ratio, and presents a markdown table of the top 5 performing countries.
sequenceDiagram
participant User as Marketer
participant ChatGPT as ChatGPT
participant MCP as Truto MCP Server
participant AF as AppsFlyer API
User->>ChatGPT: "Pull Master API report by geo..."
ChatGPT->>MCP: Call list_all_apps_flyer_master_reports<br>(geo, pid, installs, cost, revenue)
MCP->>AF: GET /export/master_report/v4
AF-->>MCP: Returns JSON aggregated data
MCP-->>ChatGPT: Returns tool result
ChatGPT-->>User: Renders ROAS calculation table2. Campaign Automation and Tracking Generation
A Mobile DevOps engineer is launching a new influencer campaign and needs to generate tracking links while testing the downstream event flow.
"Create a new OneLink tracker for the 'tiktok_influencers' campaign. Once generated, send a test S2S 'login' event simulating a user coming from that media source."
Step-by-step execution:
- ChatGPT calls
create_a_apps_flyer_onelink_linkwith the requiredmedia_sourceandcampaignparameters. - The MCP server creates the short link and returns the URL to the agent.
- ChatGPT then calls
create_a_apps_flyer_s_2_s_event, passing theeventName: loginand simulating the necessary attribution parameters. - The user receives the generated OneLink URL and confirmation that the test event was successfully logged.
3. SKAN V4 Troubleshooting
A Data Engineer is trying to understand why certain iOS campaigns are showing empty conversion values in their internal dashboards.
"Pull the SKAN V4 performance report for the last 3 days for our iOS app. Show me any campaigns where the coarse conversion value is null but fine conversion values exist."
Step-by-step execution:
- ChatGPT recognizes the need for V4 data and calls
list_all_apps_flyer_skan_performance_reports, explicitly configuring the/v3/API path. - The MCP server fetches the data.
- ChatGPT parses the output, scanning for records where V4-specific fields are missing, and explains to the engineer that V3 postbacks mixed into the V4 endpoint will result in these nulls.
Security and Access Control
Giving an LLM access to sensitive attribution data and marketing infrastructure requires strict governance. Truto's MCP architecture provides several layers of security:
- Method Filtering: When creating the MCP server, you can set
"methods": ["read"]to ensure ChatGPT can only run reports, completely blocking it from creating apps, deleting links, or firing custom S2S events. - Tag Filtering: You can restrict the server to specific resource tags. For example, setting
"tags": ["skan", "reports"]ensures the agent has no access toonelinkorpush_apiconfiguration endpoints. - Secondary Authentication (
require_api_token_auth): If you enable this flag during server creation, possessing the MCP URL is not enough. The client (or agent framework) must also pass a valid Truto API token in the Authorization header to execute tools. - Time-To-Live (
expires_at): You can generate ephemeral MCP servers by passing an ISO datetime. Once the expiration passes, Truto automatically destroys the token in its database and KV edge storage, instantly revoking the LLM's access.
Stop Writing Custom API Code
Connecting AppsFlyer to ChatGPT shouldn't require weeks of reading API documentation, dealing with complex array parsing for the Master API, or manually implementing IETF-compliant rate limit backoffs.
By leveraging Truto's SuperAI MCP infrastructure, you transform AppsFlyer's dense reporting and automation endpoints into dynamic, LLM-ready tools. You maintain complete control over access boundaries, ensuring your AI agents can perform deep data analysis without jeopardizing production marketing setups.
FAQ
- Does Truto automatically retry AppsFlyer rate limit errors?
- No. Truto passes HTTP 429 Too Many Requests errors directly back to the calling agent. Truto normalizes the upstream rate limit information into standard IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), but the caller is responsible for implementing retry and backoff logic.
- Can I filter which AppsFlyer endpoints ChatGPT can access?
- Yes. When generating the Truto MCP server, you can pass a config object with methods (e.g., read, write) and tags. This allows you to create read-only servers or scope access strictly to reporting endpoints.
- How does the MCP server handle AppsFlyer's Master API groupings?
- Truto translates the Master API's required dimensions and groupings into a strict JSON Schema query definition. The LLM populates these arrays based on the schema, and Truto formats them into the specific query parameters AppsFlyer requires.
- Why do some raw data tools return HTTP 400 or HTTP 416?
- AppsFlyer enforces strict plan-level restrictions. For example, the free Zero plan will return a 416 on Master API endpoints, and Protect360 features require specific account entitlements. Truto surfaces these errors directly to the LLM.