Dump sessions (since last)
Returns only sessions created or updated since the previous call. Used for incremental syncs.
Query Parameters
- retryBoolean
- Default false. When true, returns the previous dump window again (for retries).
- client_identityString
- `client_identity` of the target client. Defaults to the signed-in member's client. Must be the signed-in client or one of its descendants; any other value returns 403 `OuterClientScopeForbidden`
- include_descendantsBooleandefault: false
- If `true`, returns data for the target client and all of its descendant clients. If `false`, returns data for the target client only
Response Fields
Same structure as Dump sessions (date range): sessions array (no pagination).
The per-caller last-call timestamp is tracked on the server at the client_member level, separately for each client_identity and include_descendants combination. Calling with a new combination is treated as the first call for that combination. If ingestion fails, you can re-request the same window with retry=true.
curl -X GET "https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
# Retry (re-fetch the previous window)
curl -X GET "https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last?retry=true" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"import requests
res = requests.get(
"https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last?retry=true",
headers={"Authorization": "Bearer ${ACCESS_TOKEN}"},
)
print(res.json())package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last?retry=true", nil)
req.Header.Set("Authorization", "Bearer ${ACCESS_TOKEN}")
req.Header.Set("Authorization", "Bearer ${ACCESS_TOKEN}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
b, _ := io.ReadAll(res.Body)
fmt.Println(string(b))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last?retry=true"))
.header("Authorization", "Bearer ${ACCESS_TOKEN}")
.header("Authorization", "Bearer ${ACCESS_TOKEN}")
.GET()
.build();
HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}const res = await fetch("https://opsapi.edutap.ai/ops/v1/sessions/dumps/since-last?retry=true", {
method: "GET",
headers: {"Authorization": "Bearer ${ACCESS_TOKEN}"},
});
console.log(await res.json());Response
{
"sessions": [
{
"chat_session_id": "sess_01HXABCD1234EFGH5678",
"client_id": "client_acme",
"client_identity": "acme",
"user_id": "user_abc123",
"course_id": "course_math_101",
"clip_id": "clip_01",
"title": "Solving quadratic equations",
"course_name": "High School Math I",
"course_category": "Math",
"course_sub_category": "Algebra",
"status": "ACTIVE",
"created_at": "2026-06-20T03:21:00Z",
"first_message_at": "2026-06-20T03:21:30Z",
"last_message_at": "2026-06-20T03:45:10Z",
"message_count": 14
}
]
}