curl --request POST \
--url https://api.parallellabs.app/api/v0/lists/{listId}/import/preview \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"projectId": "<string>",
"path": "<string>",
"sheet": "<string>",
"companyId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/lists/{listId}/import/preview"
payload = {
"projectId": "<string>",
"path": "<string>",
"sheet": "<string>",
"companyId": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
projectId: '<string>',
path: '<string>',
sheet: '<string>',
companyId: '<string>'
})
};
fetch('https://api.parallellabs.app/api/v0/lists/{listId}/import/preview', 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.parallellabs.app/api/v0/lists/{listId}/import/preview",
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([
'projectId' => '<string>',
'path' => '<string>',
'sheet' => '<string>',
'companyId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/lists/{listId}/import/preview"
payload := strings.NewReader("{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/lists/{listId}/import/preview")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/lists/{listId}/import/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"headers": [
"<string>"
],
"headerMapping": {},
"existingHeaders": [
{}
],
"preview": [
{}
],
"rowCount": 123,
"sheets": [
"<string>"
],
"status": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Preview a CSV or Excel import into a list.
Returns the file’s columns, its first rows and a suggested headerMapping that matches file columns to the list’s existing columns. Review or adjust the mapping, then pass it to lists_importRecords.
curl --request POST \
--url https://api.parallellabs.app/api/v0/lists/{listId}/import/preview \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"projectId": "<string>",
"path": "<string>",
"sheet": "<string>",
"companyId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/lists/{listId}/import/preview"
payload = {
"projectId": "<string>",
"path": "<string>",
"sheet": "<string>",
"companyId": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
projectId: '<string>',
path: '<string>',
sheet: '<string>',
companyId: '<string>'
})
};
fetch('https://api.parallellabs.app/api/v0/lists/{listId}/import/preview', 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.parallellabs.app/api/v0/lists/{listId}/import/preview",
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([
'projectId' => '<string>',
'path' => '<string>',
'sheet' => '<string>',
'companyId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/lists/{listId}/import/preview"
payload := strings.NewReader("{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/lists/{listId}/import/preview")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/lists/{listId}/import/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"projectId\": \"<string>\",\n \"path\": \"<string>\",\n \"sheet\": \"<string>\",\n \"companyId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"headers": [
"<string>"
],
"headerMapping": {},
"existingHeaders": [
{}
],
"preview": [
{}
],
"rowCount": 123,
"sheets": [
"<string>"
],
"status": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Path Parameters
Body
The CSV or Excel file to preview
Request body for previewing a CSV or Excel import into a list. Send a CSV or Excel file (.csv, .xlsx, .xls) as multipart file, or name one saved in a project with projectId and path (files uploaded to a chat are saved under /uploads/ in the chat's project). For a workbook, sheet picks the sheet; the first sheet is the default.
Project (UUID) holding the file. Use with path instead of uploading a file.
Path of the file in the project, e.g. "/uploads/contacts.csv".
Workbook sheet to read. Defaults to the first sheet; ignored for CSV.
Company ID that owns the list. Required when authenticating with a personal access key (pak_…) — the key is not tied to a specific company so the server cannot infer it. Required when authenticating with a company API key only if the key belongs to a user who has access to multiple companies; otherwise it defaults to the key's company. Optional for JWT (dashboard) auth — defaults to the user's active company.
Response
File columns, sample rows and the suggested mapping
The file's columns, its first rows, and the suggested column mapping.
File column names.
Suggested mapping: file column name -> existing list column id, or "new".
The list's current columns (id, name, type).
The first 4 rows, keyed by column name.
Number of rows in the file (the chosen sheet, for a workbook).
Sheet names, for a workbook. Pass one as sheet to read it instead of the first.
Always "success".

