Data Export API v1: legacy reference
This page is a legacy reference for the v1 asynchronous export contract. The current implementation rejects its async submit and fetch operations with a deprecation error. Use Export API v2: bulk object exports for new export integrations. If an existing client depends on v1, confirm its deployed behavior and migration plan with your Enterpret team.
The separate v1 label lookup still has an implementation. Do not infer that every endpoint with a v1 path has the same deprecation behavior. No retirement date or successful v1 async export is promised by this reference.
Version and migration guidance
V1 used a filtered feedback-record request, a query ID, polling, and JSON result files. V2 discovers object IDs and returns temporary links to CSV change-window files. It uses different requests, pagination, time semantics, and output schemas; replacing the version number in an existing URL is not a complete migration.
Discover the actual export objects and inspect their CSV headers.
Map the v1 feedback filters, labels, and related data to the objects and downstream transformations you need.
Review v2 time-window, update, and deletion limitations before designing a warehouse sync.
Replace query-ID polling with the v2 cursor workflow and review authentication requirements.
Authorization
Use an Enterpret API key authorized for data export, with the dataExport scope, in the Authorization: Bearer API_KEY header. Obtain or enable the appropriate key through the controls available to your authorized administrator or your Enterpret team. Authentication does not restore deprecated async functionality.
All identifiers and responses below are illustrative. They are not live query IDs, credentials, or download URLs.
Endpoint reference
| Method | Public URL | Current source behavior |
|---|---|---|
| POST | https://api.enterpret.com/export/external/v1/async/submit | Registered route; the called async method returns a deprecation error. |
| POST | https://api.enterpret.com/export/external/v1/async/fetch | Registered route; the called async method returns a deprecation error. |
| GET | https://api.enterpret.com/export/external/v1/labels/LABEL_ID | Separate label lookup for the authenticated organization and an available label. |
Historical SubmitAsync request
The following schema information is retained to help interpret old clients and files. It is not an instruction to start a new v1 export.
Historical request fields
| Field | Meaning |
|---|---|
listRecords | Legacy feedback-record selection. |
pageSize | Optional 64-bit batch-size value at the top level, beside listRecords. It does not belong inside listRecords. |
listRecords.filter | One leaf filter or one recursive operation. Combine separate predicates in params using AND or OR. |
listRecords.timerange | Legacy source/record-creation time selection, using Unix seconds or a relative range. |
listRecords.updatedTimeRange | Alternative legacy analytics-ingestion time selection. Do not send it together with timerange or treat it as a feed of every record change. |
Use exact integration source IDs. The legacy source field is a string, not a case-insensitive display-name selector. The example assumes a Qualtrics source exists. Protobuf JSON represents 64-bit integers as decimal strings; empty or default response fields can be omitted.
Historical request example
This example selects Qualtrics feedback from the last 30 days with a Reason or Sentiment label. Each filter node has one leaf or one operation, and pageSize is correctly placed at the top level.
{ "pageSize": "5000", "listRecords": { "filter": { "operation": { "op": "AND", "params": [ { "filter": { "source": "Qualtrics" } }, { "operation": { "op": "OR", "params": [ { "filter": { "hasLabel": { "reason": true } } }, { "filter": { "hasLabel": { "sentiment": true } } } ] } } ] } }, "timerange": { "relative": { "unit": "Day", "value": "30" } } } }
Historical submit response
The old success contract returned a queryID. This shape does not establish that a current submit request will succeed.
Historical response shape
{ "queryID": "<queryID>" }
Historical FetchAsync request
Historical fetch fields
The legacy fetch body contains the queryID from a successful submit. A query ID is not a v2 cursor.
Historical fetch example
{ "queryID": "<queryID>" }
Historical fetch responses
The old wrapper exposed isCompleted and responseFiles. Missing or false completion did not distinguish every queued, running, or failed state. An empty JSON response was not proof of healthy progress. The current async method returns a deprecation error instead of establishing a new polling workflow.
A historical completed response could look like:
{ "isCompleted": true, "responseFiles": [ "<temporary-download-url>" ] }
Historical result-file shape
Previously generated v1 files contain a JSON object with a records array, rather than CSV or newline-delimited JSON. Prediction entries are objects: use predictions[].labelID for label lookup. Optional metadata, summaries, English translations, and empty/default fields are not guaranteed on every record; do not require originRecordID.
{ "records": [ { "id": "<recordID>", "orgID": "<organizationID>", "source": "Qualtrics", "type": "RecordTypeSurvey", "sourceTimestamp": "1704067200", "ingestedAt": "1704153600", "updatedAt": "1704240000", "predictions": [ { "labelID": "<labelID>" } ], "survey": { "surveyResponse": { "responses": [ { "question": "What could be improved?", "answer": "Search" } ] } } } ] }
Old download links are temporary. Contact Enterpret about unavailable historic files; this reference does not promise retained files, link renewal, or a completion deadline.
Separate label lookup
To look up a known label ID, use the separately implemented endpoint. Replace API_KEY and LABEL_ID with values for your authorized organization.
curl --request GET 'https://api.enterpret.com/export/external/v1/labels/LABEL_ID' \ --header 'Authorization: Bearer API_KEY'
An authorized response for an available label has a label object. Returned fields depend on the label and may omit default values:
{ "label": { "id": "<labelID>", "displayName": "<label name>", "type": "REASON", "createdAt": "1704067200", "isVisible": true } }
Legacy client migration notes
The old four-language submit-and-poll examples have been replaced with the corrected historical JSON above and these migration checks. New integrations should follow the v2 guide.
Bash and cURL
Use the complete public URL, including /export. Review the HTTP status before treating a body as a result. Do not retry a deprecation response as if it were a pending job.
Python
Handle HTTP errors before parsing the success body. Replace the v1 query-ID polling loop with v2 file downloads and cursor traversal; use bounded retries for retryable failures.
Go
Update the request and response types for the v2 object/time/cursor contract and CSV files. A legacy records JSON decoder does not parse v2 CSV exports.
JavaScript
Handle omitted arrays and opaque pagination tokens according to the v2 contract. Continue based on a returned cursor rather than assuming that an empty file page ends the export.
Troubleshooting and support
The current async implementation returns HTTP 422 for its deprecation error, whose message is endpoint deprecated: Snowflake backend has been removed for T2 organizations. Treat that response as terminal for the requested v1 operation. Do not poll indefinitely or keep resubmitting it.
Authentication failures, an unavailable label, and a deprecated async operation are different conditions. Keep the endpoint, HTTP status, response message, and any existing query ID when contacting Enterpret Support. Confirm deployment-specific behavior with your Enterpret team before relying on an older integration.