get-campaign-event-export-result
curl --request GET \
--url https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result', 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://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": [
{
"id": "E252EB67-48E3-49DC-866D-F8C26161230D",
"user_id": "user_12345",
"notifly_user_id": "notifly_user_abcde",
"device_id": "ios_device_98765",
"notifly_device_id": "notifly_device_xyz",
"channel": "push_notification",
"event_name": "send_success",
"failure_reason": null,
"resource_title": "6월 신규 혜택 안내",
"resource_type": "campaign",
"campaign_id": "camp_202406_promo",
"experiment_group_name": "A",
"user_journey_id": null,
"user_journey_node_id": null,
"time": "1749373994000000",
"message_data": {
"title": "지금 확인하고 혜택 받기!",
"body": "6월 신규 회원님만을 위한 특별 이벤트 🎁",
"link": "link://link/feed?id=1243"
},
"channel_metadata": {
"channel_subtype": "image",
"brand_message_target": null
}
}
],
"total_page_count": 1
}{
"status": "processing",
"message": "Data is being generated."
}{
"status": "not_found",
"message": "The specified project_id and export_id could not be found."
}{
"error": "Timeout"
}{
"status": "invalid_page",
"message": "The requested page does not exist."
}{
"status": "error",
"message": "An error occurred while processing the data."
}메시지 이벤트 데이터 내보내기
캠페인 이벤트 데이터 내보내기 결과 조회
Export 요청으로 얻은 export_id를 활용해 비동기로 생성된 데이터를 페이지 당 최대 1,000개 단위로 조회합니다.
GET
/
projects
/
{projectId}
/
campaign-event-data
/
exports
/
{exportId}
/
result
get-campaign-event-export-result
curl --request GET \
--url https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result', 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://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.notifly.tech/projects/{projectId}/campaign-event-data/exports/{exportId}/result")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": [
{
"id": "E252EB67-48E3-49DC-866D-F8C26161230D",
"user_id": "user_12345",
"notifly_user_id": "notifly_user_abcde",
"device_id": "ios_device_98765",
"notifly_device_id": "notifly_device_xyz",
"channel": "push_notification",
"event_name": "send_success",
"failure_reason": null,
"resource_title": "6월 신규 혜택 안내",
"resource_type": "campaign",
"campaign_id": "camp_202406_promo",
"experiment_group_name": "A",
"user_journey_id": null,
"user_journey_node_id": null,
"time": "1749373994000000",
"message_data": {
"title": "지금 확인하고 혜택 받기!",
"body": "6월 신규 회원님만을 위한 특별 이벤트 🎁",
"link": "link://link/feed?id=1243"
},
"channel_metadata": {
"channel_subtype": "image",
"brand_message_target": null
}
}
],
"total_page_count": 1
}{
"status": "processing",
"message": "Data is being generated."
}{
"status": "not_found",
"message": "The specified project_id and export_id could not be found."
}{
"error": "Timeout"
}{
"status": "invalid_page",
"message": "The requested page does not exist."
}{
"status": "error",
"message": "An error occurred while processing the data."
}페이지네이션 방식이 API는 페이지 기반 페이지네이션을 사용합니다:
- 페이지 번호: 0부터 시작하는 정수 값
- 페이지 크기: 각 페이지당 최대 1,000개의 이벤트 데이터
- 전체 페이지 수:
total_page_count필드로 제공 - 유효한 페이지 범위: 0 ~ (total_page_count - 1)
Message Data 채널 별 지원 조건push-notification을 제외한 다른 채널의 message_data 컬럼은 2025-07-18 이후의 데이터만 지원합니다.또한, in-app-message와 in-web-message 채널은 아래의 SDK 버전 이후부터 지원됩니다:
- iOS SDK: 1.17.2
- Android SDK: 1.18.1
- React Native SDK: 3.10.1
- JavaScript SDK: 2.17.4
메시지 데이터 예시
- text-message
- email
- kakao-friendtalk
- kakao-alimtalk
- in-app-message
- in-web-message
- web-push-notification
- webhook
{
"requestId": "요청 ID",
"requestDate": "YYYY-MM-DD HH:mm:ss",
"templateId": "템플릿 ID",
"title": "메시지 제목",
"body": "본문 내용",
"sendNo": "07000000000",
"recipientNo": "01012345678",
"messageType": "MMS",
"countryCode": "82",
"adYn": "N",
"attachFileList": [
{
"fileId": 123456789,
"fileName": "image.jpg",
"filePath": "/path/to/image/",
"saveFileName": "saved.jpg",
"uploadType": "TEMPORARY"
}
]
}
{
"title": "메일 제목",
"body": {
"html": "<html><body><p>메일 본문</p></body></html>",
"text": "내용"
}
}
{
"plusFriendId": "@채널명",
"senderKey": "발신 키",
"recipientNo": "01012345678",
"content": "메시지 내용",
"buttons": [
{
"ordering": 1,
"type": "WL",
"name": "버튼명",
"linkMo": "https://m.example.com",
"linkPc": "https://example.com",
"schemeIos": "",
"schemeAndroid": ""
}
],
"isAd": true
}
{
"plusFriendId": "@채널명",
"senderKey": "발신 키",
"recipientNo": "01012345678",
"templateCode": "템플릿 코드",
"content": "[브랜드] 메시지 본문",
"templateExtra": "추가 안내",
"buttons": [
{
"ordering": 1,
"type": "WL",
"name": "버튼명",
"linkMo": "https://m.example.com",
"linkPc": "https://example.com"
}
]
}
{
"templateName": "템플릿 이름"
}
{
"templateName": "템플릿 이름"
}
{
"notifly": {
"ti": "제목",
"bd": "본문",
"cid": "캠페인 ID",
"mid": "메시지 ID",
"u": "https://your-link.com",
"ic": "https://your-icon.png",
"bg": "#ffffff",
"im": "https://your-image.jpg",
"sd": "/push-sound.mp3",
"tg": "notifly-push-notification",
"vb": [200, 100, 200],
"ri": false,
"data": {},
"ac": [
{ "action": "click", "title": "Go to Link" },
{ "action": "close", "title": "Close" }
]
}
}
{
"url": "https://your.webhook.endpoint",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"data": "{ \"key\": \"value\" }"
}
인증
POST /authenticate로 발급받은 인증 토큰을 Bearer 형식으로 전달합니다.
쿼리 매개변수
0부터 시작하는 페이지 번호 (범위 0 ~ total_page_count - 1)
필수 범위:
x >= 0⌘I
