Operate
Import & Export
R2-backed export (events, profiles, audiences, workflows) + CSV / JSON import. Async jobs with progress + sign-URL retrieval.
Features
- **CSV import** of 3 entity types: `profiles`, `events`, `contacts`. Column-mapping per field, `skipDuplicates` option, `dryRun` preview before apply.
- **On-demand export** of 4 entity types: `profiles`, `events`, `analytics`, `survey_responses`. Output format: CSV or JSON. Optional filters + date range.
- **Background runner + R2 storage** — fire the job, poll status, download via 15-min presigned URL when complete. No backend-streaming bottleneck on multi-GB exports.
- **ADMIN-gated + audit-logged** — every import + export records actor + payload size + filters in the audit log.
- **Migration-friendly** — combined with auth-service's bcrypt / scrypt / argon2 hash-import endpoint (separate module), this covers the "users + their events + their profiles" leg of moving onto Sendora from a legacy stack.
Common use cases
- Migrate a customer list from Mailchimp / HubSpot / Salesforce — CSV import with `dryRun` to preview before commit.
- Periodic export of survey responses + events for warehouse load (you trigger + load yourself; no cron, no destination push).
- Ad-hoc data pulls for analyst requests — export 30d of profiles + survey_responses to CSV, share via the presigned URL.
Import / export
Kick off an export
GROWTH+Async background job. Streams to R2; the response carries a `jobId` you poll until status flips to `completed`, then download via the signed URL.
curl -X POST https://api.sendoracloud.com/api/v1/orgs/<ORG_ID>/data-io/export \
-H "x-api-key: pk_prod_…" \
-d '{
"resource": "events",
"format": "csv",
"filters": { "from": "2026-04-01", "to": "2026-04-30" }
}'Poll a job
GROWTH+Returns `{ status, progress, downloadUrl? }`. `downloadUrl` is a 30-minute signed R2 URL — re-issue via `/jobs/:id/download` when expired.
curl "https://api.sendoracloud.com/api/v1/orgs/<ORG_ID>/data-io/jobs/{{JOB_ID}}" \
-H "x-api-key: pk_prod_…"Bulk import
GROWTH+Accepts CSV / JSONL via signed-URL upload. Use for one-time migrations from another platform or for nightly sync from your warehouse.
curl -X POST https://api.sendoracloud.com/api/v1/orgs/<ORG_ID>/data-io/import \
-H "x-api-key: pk_prod_…" \
-d '{
"resource": "profiles",
"format": "csv",
"sourceUrl": "https://your-cdn.example/profiles-2026-04.csv"
}'