curl --request GET \
--url http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history', 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 => "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history",
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 := "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history"
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("http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"sender": "assistant",
"message": "MOGL connects athletes with brands for paid NIL opportunities.",
"is_read": "1",
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"turn_id": 546,
"sender_id": null,
"created_at": "2026-07-22T06:46:17Z",
"conversation_id": "550e8400-e29b-41d4-a716-446655440000",
"deal_type": null,
"job_id": null,
"response_type": "direct_answer",
"source_ids": [
"athlete_kb:what-is-mogl"
],
"confidence": 0.9,
"scope": "athlete",
"context_mode": "assistant_help",
"resolved_job_ids": [],
"context_resolution": {
"scope": "athlete",
"context_mode": "assistant_help",
"legacy_context_mode": "assistant_help",
"requested_job_id": null,
"resolved_job_id": null,
"resolved_job_ids": [],
"resolution_reason": "portfolio_follow_up",
"confidence": 1,
"candidate_count": 2,
"truncated": false,
"lifecycle_mode": "all",
"portfolio_offset": 0,
"response_mode": "detail",
"requested_segment": null,
"requested_actions": [],
"referenced_count": 3,
"count_mismatch": true,
"referenced_turn_id": null,
"help_topic": "knowledge_lookup",
"clarification_segments": [],
"clarification_required": false,
"portfolio_groups": [
{
"segment": "awaiting_payment",
"count": 3
}
],
"portfolio_group_candidates": [
{
"segment": "awaiting_payment",
"count": 3
}
],
"displayed_job_ids": [
2
],
"deal_type": null,
"choice_count": 0
},
"continuation_cursor": null,
"abstain_reason": null,
"support_request_summary": "The athlete needs help resolving a payout issue.",
"support_action": {
"type": "mailto",
"label": "pre-filled in email here",
"url": "mailto:athlete-support@mogl.online?subject=Help%20from%20the%20AI%20Athlete%20Assistant%20needed&body=The%20athlete%20needs%20help%20with%20a%20payout."
},
"quick_button_suggestions": [
"<string>"
],
"clarification_draft": {
"id": 81,
"status": "pending",
"draft_text": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the video?",
"athlete_snippet": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the vide",
"created_at": "2026-07-22T06:46:17Z",
"sent_chat_id": null,
"sent_text": null,
"sent_at": null,
"responded_chat_id": null,
"responded_message_text": null,
"responded_at": null,
"superseded_by_id": null,
"brand_id": 4,
"connection_id": 912
},
"superseded_clarification_drafts": [
{
"id": 81,
"status": "pending",
"draft_text": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the video?",
"athlete_snippet": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the vide",
"created_at": "2026-07-22T06:46:17Z",
"sent_chat_id": null,
"sent_text": null,
"sent_at": null,
"responded_chat_id": null,
"responded_message_text": null,
"responded_at": null,
"superseded_by_id": null,
"brand_id": 4,
"connection_id": 912
}
]
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"path": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history",
"per_page": 10,
"to": 10,
"total": 48
},
"links": {
"first": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=1",
"last": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=5",
"prev": null,
"next": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=2"
}
}{
"message": "Unauthenticated."
}Get AI assistant conversation history
Returns paginated conversation turns for the authenticated athlete. Supply deal_type + job_id for a deal-specific view, or omit both for the unified thread. For deal_type=fan_req, job_id is fan_request_service.id. Each database turn is expanded into the same athlete and assistant chat items used before the loop migration, and matching assistant turns are marked as read. Assistant items may contain either the historical/v3 semantic context_resolution shape or the version=loop-1 trace shape. Top-level scope, context_mode, job_id, and resolved_job_ids remain compatible for both shapes; loop values are derived from successful trace evidence. Loop portfolio history may carry optional strict compact portfolio_state metadata for trusted follow-ups; raw arguments, full rows, and full tool results remain excluded. Existing job-support and no-deal support escalation turns may include the same sanitized summary and review-only support_action returned by chat; the athlete must explicitly send the mailto. Safe no-deal knowledge history remains text/source-only with null job_id and empty resolved_job_ids.
curl --request GET \
--url http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history', 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 => "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history",
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 := "http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history"
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("http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/athlete/ai-athlete-assistant/history")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"sender": "assistant",
"message": "MOGL connects athletes with brands for paid NIL opportunities.",
"is_read": "1",
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"turn_id": 546,
"sender_id": null,
"created_at": "2026-07-22T06:46:17Z",
"conversation_id": "550e8400-e29b-41d4-a716-446655440000",
"deal_type": null,
"job_id": null,
"response_type": "direct_answer",
"source_ids": [
"athlete_kb:what-is-mogl"
],
"confidence": 0.9,
"scope": "athlete",
"context_mode": "assistant_help",
"resolved_job_ids": [],
"context_resolution": {
"scope": "athlete",
"context_mode": "assistant_help",
"legacy_context_mode": "assistant_help",
"requested_job_id": null,
"resolved_job_id": null,
"resolved_job_ids": [],
"resolution_reason": "portfolio_follow_up",
"confidence": 1,
"candidate_count": 2,
"truncated": false,
"lifecycle_mode": "all",
"portfolio_offset": 0,
"response_mode": "detail",
"requested_segment": null,
"requested_actions": [],
"referenced_count": 3,
"count_mismatch": true,
"referenced_turn_id": null,
"help_topic": "knowledge_lookup",
"clarification_segments": [],
"clarification_required": false,
"portfolio_groups": [
{
"segment": "awaiting_payment",
"count": 3
}
],
"portfolio_group_candidates": [
{
"segment": "awaiting_payment",
"count": 3
}
],
"displayed_job_ids": [
2
],
"deal_type": null,
"choice_count": 0
},
"continuation_cursor": null,
"abstain_reason": null,
"support_request_summary": "The athlete needs help resolving a payout issue.",
"support_action": {
"type": "mailto",
"label": "pre-filled in email here",
"url": "mailto:athlete-support@mogl.online?subject=Help%20from%20the%20AI%20Athlete%20Assistant%20needed&body=The%20athlete%20needs%20help%20with%20a%20payout."
},
"quick_button_suggestions": [
"<string>"
],
"clarification_draft": {
"id": 81,
"status": "pending",
"draft_text": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the video?",
"athlete_snippet": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the vide",
"created_at": "2026-07-22T06:46:17Z",
"sent_chat_id": null,
"sent_text": null,
"sent_at": null,
"responded_chat_id": null,
"responded_message_text": null,
"responded_at": null,
"superseded_by_id": null,
"brand_id": 4,
"connection_id": 912
},
"superseded_clarification_drafts": [
{
"id": 81,
"status": "pending",
"draft_text": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the video?",
"athlete_snippet": "Hey Wonolo, I don't see any instructions about footwear for the Instagram Reel. Is it okay if I wear sandals in the vide",
"created_at": "2026-07-22T06:46:17Z",
"sent_chat_id": null,
"sent_text": null,
"sent_at": null,
"responded_chat_id": null,
"responded_message_text": null,
"responded_at": null,
"superseded_by_id": null,
"brand_id": 4,
"connection_id": 912
}
]
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"path": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history",
"per_page": 10,
"to": 10,
"total": 48
},
"links": {
"first": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=1",
"last": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=5",
"prev": null,
"next": "https://api.mogl.online/api/athlete/ai-athlete-assistant/history?page=2"
}
}{
"message": "Unauthenticated."
}Authorizations
JWT Bearer token authentication. Use the /api/login endpoint to obtain a token.
Query Parameters
Deal kind. Defaults to job when only job_id is supplied.
job, fan_req "job"
Partner job id when deal_type=job; fan_request_service.id when deal_type=fan_req. Omit with deal_type to return the unified thread.
x >= 142
Sort by creation time. -created_at returns newest first; +created_at returns oldest first.
-created_at, +created_at "-created_at"
Page number (default 1).
1
Items per page (default 10).
10
Alternative to limit. Takes precedence over limit if both are provided.
10