Check Export Status
curl --request GET \
--url https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status', 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 => "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status",
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 := "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status"
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("https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "processing",
"progress": 50,
"form_id": 123,
"user_id": 123,
"job_id": "<string>",
"processed_submissions": 123,
"total_submissions": 123,
"file_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}Submissions
Check Export Status
Check the status of an asynchronous export job. Requires forms-read.
GET
/
open
/
forms
/
{id}
/
submissions
/
export
/
{job_id}
/
status
Check Export Status
curl --request GET \
--url https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status', 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 => "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status",
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 := "https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status"
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("https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opnform.com/open/forms/{id}/submissions/export/{job_id}/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "processing",
"progress": 50,
"form_id": 123,
"user_id": 123,
"job_id": "<string>",
"processed_submissions": 123,
"total_submissions": 123,
"file_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}Check Export Status
Check the status and progress of an asynchronous CSV export job.Authentication & Scope
Requiresforms-read ability.
Request
GET /open/forms/{id}/submissions/export/{job_id}/status HTTP/1.1
Host: api.opnform.com
Authorization: Bearer <token>
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | number | Numeric ID of the form. |
| job_id | string | Export job identifier. |
Response
Processing Status
{
"status": "processing",
"progress": 65,
"form_id": 123,
"user_id": 456,
"processed_submissions": 650,
"total_submissions": 1000,
"created_at": "2024-06-12T09:15:23.000Z",
"updated_at": "2024-06-12T09:16:10.000Z",
"job_id": "export_abc123def456"
}
Completed Status
{
"status": "completed",
"progress": 100,
"form_id": 123,
"user_id": 456,
"processed_submissions": 1000,
"total_submissions": 1000,
"file_url": "https://storage.example.com/exports/form-123-submissions-2024-06-12-09-15-23.csv",
"expires_at": "2024-06-13T09:15:23.000Z",
"created_at": "2024-06-12T09:15:23.000Z",
"updated_at": "2024-06-12T09:16:30.000Z",
"job_id": "export_abc123def456"
}
Failed Status
{
"status": "failed",
"progress": 0,
"form_id": 123,
"user_id": 456,
"error_message": "Database connection timeout",
"created_at": "2024-06-12T09:15:23.000Z",
"updated_at": "2024-06-12T09:15:45.000Z",
"job_id": "export_abc123def456"
}
Response Fields
| Field | Type | Description |
|---|---|---|
status | string | Job status: processing, completed, or failed |
progress | number | Completion percentage (0-100) |
form_id | number | ID of the form being exported |
user_id | number | ID of the user who initiated the export |
job_id | string | Export job identifier |
processed_submissions | number | Number of submissions processed so far |
total_submissions | number | Total number of submissions to process |
file_url | string | Download URL for completed exports |
expires_at | string | File expiration timestamp (workspace policy, 24 hours by default) |
error_message | string | Error description for failed exports |
created_at | string | Job creation timestamp |
updated_at | string | Last update timestamp |
Only
status, progress, form_id, user_id, job_id, created_at, and
updated_at are always present. Other fields appear based on the job state.The download URL is a bearer link. It remains valid until
expires_at,
according to the workspace file-link policy (24 hours by default).Error Responses
404 Not Found – Export job not found or has expired.
403 Forbidden – The token lacks forms-read or you don’t have access.
Usage Example
After initiating an export that returnsis_async: true, poll this endpoint to track progress:
1
Start export
Call the export endpoint and receive a
job_id.2
Poll status
Use the
job_id to check export progress every few seconds.Avoid polling too frequently. Check every 2-5 seconds for optimal
performance.
3
Download file
When status is
completed, use the file_url to download your CSV file.Download the file before the
expires_at timestamp. The workspace policy is 24 hours by default.Authorizations
Personal Access Token
Response
Export job status
Current status of the export job
Available options:
processing, completed, failed Completion percentage (0-100)
Required range:
0 <= x <= 100ID of the form being exported
ID of the user who initiated the export
Export job identifier
Number of submissions processed so far
Total number of submissions to process
Download URL for completed exports
File expiration timestamp (workspace policy, 24 hours by default)
Error description for failed exports
Job creation timestamp
Last update timestamp
Was this page helpful?