curl --request GET \
--url https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms \
--header 'x-api-key: <api-key>'import requests
url = "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"programId": "<string>",
"programName": "<string>",
"handle": "<string>",
"platform": "<string>",
"creatorId": "<string>",
"platformPostId": "<string>",
"postId": "<string>",
"postUrl": "<string>",
"date": "2023-12-25",
"optIns": 123,
"dmsSent": 123,
"linkClicks": 123,
"uniqueClickers": 123
}
],
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123,
"groupBy": "program",
"fromDate": "2023-12-25",
"toDate": "2023-12-25",
"summary": {
"optIns": 123,
"dmsSent": 123,
"linkClicks": 123,
"uniqueClickers": 123
},
"sortBy": "linkClicks",
"sortOrder": "asc"
}Report the comment-to-DM funnel
Comment-to-DM attribution for each visible program: how many leads opted in, how many got the first DM, and how many tapped the DM link.
Every row has the same fields. A field the chosen grouping does not use is null. Group the report with groupBy:
program(default): one row per program.account: one row per program and creator account that sent the DMs.post: one row per program, creator account, and the post the lead commented on.postIdis the id used byGET /postswhen the post is tracked; otherwise it isnull. A lead who DMed the keyword directly has no post, so that row has anullplatformPostId.day: one row per day.
Each event counts on its own day in America/New_York, the same rule as the dashboard DMs sent and DM clicks tiles: an opt-in on the day the conversation opened, a DM on the day it was sent, a tap on the day of the tap. fromDate and toDate apply to those days, so a tap can fall in a range that does not include its DM.
Taps on links sent by Launchpoint’s earlier comment automations (before 2026-09-27) are included and belong to their post. Opt-ins and sends from that period were not stored.
Sort with sortBy and sortOrder (default desc). sortBy defaults to date for groupBy=day and to linkClicks otherwise; sortBy=date works only with groupBy=day. Ties keep a stable order, so pages do not shift between reads. summary sums every row in the report, not only the current page.
curl --request GET \
--url https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms \
--header 'x-api-key: <api-key>'import requests
url = "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://dashboard.launchpointhq.com/api/v1/analytics/comment-dms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"programId": "<string>",
"programName": "<string>",
"handle": "<string>",
"platform": "<string>",
"creatorId": "<string>",
"platformPostId": "<string>",
"postId": "<string>",
"postUrl": "<string>",
"date": "2023-12-25",
"optIns": 123,
"dmsSent": 123,
"linkClicks": 123,
"uniqueClickers": 123
}
],
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123,
"groupBy": "program",
"fromDate": "2023-12-25",
"toDate": "2023-12-25",
"summary": {
"optIns": 123,
"dmsSent": 123,
"linkClicks": 123,
"uniqueClickers": 123
},
"sortBy": "linkClicks",
"sortOrder": "asc"
}Authorizations
API key created in Dashboard → Settings → Developer
Query Parameters
Choose the data scope. company (default) limits results to the API key company's data. agency includes the parent agency and its linked brands. scope=agency requires a parent agency key; other keys receive 403.
company, agency Pagination page number
x >= 1Rows to return per page
1 <= x <= 100Narrow the report to one program
How to group the rows
program, account, post, day Field to sort rows by. Defaults to date for groupBy=day and linkClicks otherwise. date needs groupBy=day
linkClicks, uniqueClickers, dmsSent, optIns, date Sort direction
asc, desc Count events on or after this day (YYYY-MM-DD, America/New_York)
Count events on or before this day (YYYY-MM-DD, America/New_York)
Response
Comment-to-DM funnel returned successfully
Show child attributes
Show child attributes
program, account, post, day Show child attributes
Show child attributes
linkClicks, uniqueClickers, dmsSent, optIns, date asc, desc