curl "https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv" \
-H "Authorization: Bearer $TRUEFAN_API_KEY" \
-O -J
import requests
resp = requests.get(
f"https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv",
headers={"Authorization": f"Bearer {api_key}"},
)
resp.raise_for_status()
with open("results.csv", "wb") as f:
f.write(resp.content)
external_id,generation_id,customer_name,score,result_video_url
usr_9182,f339beb9-305d-4a01-89ef-669b7ec70de3,Anmol,95,https://assets-studio.truefans.in/editor/.../a.mp4
usr_4471,a12c8e21-9f3d-4b6a-8e12-1234567890ab,Rahul,88,https://assets-studio.truefans.in/editor/.../b.mp4
{ "error": "API key required" }
{ "error": "Bulk job not found" }
{ "error": "Export not ready — bulk job has not finished yet", "status": "processing" }
Video Generation
Download CSV export
Download every row’s result as a single CSV file
GET
/
api
/
external
/
v1
/
bulk-jobs
/
{bulk_job_id}
/
export.csv
curl "https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv" \
-H "Authorization: Bearer $TRUEFAN_API_KEY" \
-O -J
import requests
resp = requests.get(
f"https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv",
headers={"Authorization": f"Bearer {api_key}"},
)
resp.raise_for_status()
with open("results.csv", "wb") as f:
f.write(resp.content)
external_id,generation_id,customer_name,score,result_video_url
usr_9182,f339beb9-305d-4a01-89ef-669b7ec70de3,Anmol,95,https://assets-studio.truefans.in/editor/.../a.mp4
usr_4471,a12c8e21-9f3d-4b6a-8e12-1234567890ab,Rahul,88,https://assets-studio.truefans.in/editor/.../b.mp4
{ "error": "API key required" }
{ "error": "Bulk job not found" }
{ "error": "Export not ready — bulk job has not finished yet", "status": "processing" }
Returns the whole batch as a real downloadable CSV file — one row per generation, with
external_id, generation_id, that row’s variables, and result_video_url. This is the only way to get per-row detail for a batch through this API — Get bulk job status only returns aggregate counts, never inline per-row data.
This file contains the actual data you submitted — names,
external_ids, whatever variables you sent — not just placeholder examples. Treat it the same way you’d treat any of your own customer data.string
required
Returned from Generate videos.
string
required
Bearer {api_key}curl "https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv" \
-H "Authorization: Bearer $TRUEFAN_API_KEY" \
-O -J
import requests
resp = requests.get(
f"https://dev-backend-ai.truefans.in/api/external/v1/bulk-jobs/{bulk_job_id}/export.csv",
headers={"Authorization": f"Bearer {api_key}"},
)
resp.raise_for_status()
with open("results.csv", "wb") as f:
f.write(resp.content)
external_id,generation_id,customer_name,score,result_video_url
usr_9182,f339beb9-305d-4a01-89ef-669b7ec70de3,Anmol,95,https://assets-studio.truefans.in/editor/.../a.mp4
usr_4471,a12c8e21-9f3d-4b6a-8e12-1234567890ab,Rahul,88,https://assets-studio.truefans.in/editor/.../b.mp4
{ "error": "API key required" }
{ "error": "Bulk job not found" }
{ "error": "Export not ready — bulk job has not finished yet", "status": "processing" }
Only available once the batch is fully done — check
csv_ready on Get bulk job status, or wait for the bulk_job.completed webhook, which only fires once this is already true.Response
Returned withContent-Type: text/csv and Content-Disposition: attachment — hitting this URL in a browser, or with curl -O -J, downloads a .csv file directly rather than returning JSON.
The header row is external_id, generation_id (TrueFan’s own ID for the row — useful for support/debugging), followed by every variable name used anywhere in the batch (a row that didn’t use a particular variable has an empty cell there), followed by result_video_url.