Export Submissions (CSV)
curl --request POST \
--url https://api.opnform.com/open/forms/{id}/submissions/export \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"columns": {}
}'import requests
url = "https://api.opnform.com/open/forms/{id}/submissions/export"
payload = { "columns": {} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({columns: {}})
};
fetch('https://api.opnform.com/open/forms/{id}/submissions/export', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'columns' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.opnform.com/open/forms/{id}/submissions/export"
payload := strings.NewReader("{\n \"columns\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.opnform.com/open/forms/{id}/submissions/export")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"columns\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opnform.com/open/forms/{id}/submissions/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"columns\": {}\n}"
response = http.request(request)
puts response.read_body"<string>"Submissions
Export Submissions (CSV)
Export submissions as CSV. Large exports are processed asynchronously. Requires forms-read.
POST
/
open
/
forms
/
{id}
/
submissions
/
export
Export Submissions (CSV)
curl --request POST \
--url https://api.opnform.com/open/forms/{id}/submissions/export \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"columns": {}
}'import requests
url = "https://api.opnform.com/open/forms/{id}/submissions/export"
payload = { "columns": {} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({columns: {}})
};
fetch('https://api.opnform.com/open/forms/{id}/submissions/export', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'columns' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.opnform.com/open/forms/{id}/submissions/export"
payload := strings.NewReader("{\n \"columns\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.opnform.com/open/forms/{id}/submissions/export")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"columns\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opnform.com/open/forms/{id}/submissions/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"columns\": {}\n}"
response = http.request(request)
puts response.read_body"<string>"Export Submissions (CSV)
Export submissions for a form as a CSV file. Large exports are processed asynchronously in the background, while smaller exports are processed immediately.Authentication & Scope
Requiresforms-read ability.
Request
POST /open/forms/{id}/submissions/export HTTP/1.1
Host: api.opnform.com
Content-Type: application/json
Authorization: Bearer <token>
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | number | Numeric ID of the form. |
Body Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| columns | object | Yes | Keys are field IDs, system columns, or attribution columns such as meta.attribution.utm_source; values indicate whether to include them. |
{
"columns": {
"field_name": true,
"field_email": true,
"meta.attribution.utm_source": true,
"created_at": true
}
}
Response
The API automatically determines whether to process the export synchronously or asynchronously based on the form size.Synchronous Export (Small Forms)
200 OK – Returns a CSV file download immediately. The response’s Content-Type will be text/csv and include the Content-Disposition header.
Asynchronous Export (Large Forms)
200 OK – Returns a job status object for background processing:
{
"message": "Export started. Large export will be processed in the background.",
"job_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"is_async": true
}
Use the
job_id to check export progress using the Export Status
endpoint.Error Responses
403 Forbidden – The token lacks forms-read or you don’t have access.
The columns map may include ip_address. IP metadata is emitted only when
IP tracking is enabled on the form and available in its workspace plan. Field
columns are matched by their exact saved IDs, including removed fields.
If a form field also uses ip_address as its ID, its answer is exported in
its own named column alongside any permitted IP metadata.Authorizations
Personal Access Token
Path Parameters
Body
application/json
Object mapping field IDs, system columns, or namespaced attribution columns (for example meta.attribution.utm_source) to booleans.
Show child attributes
Show child attributes
Response
Synchronous export (CSV file) or asynchronous export (job status)
CSV file download for small forms
Was this page helpful?