Reference · 6 operations
Tables: imports and exports
Last updated from API version 2026-10-06 at (live spec, refreshed hourly). openapi.json
Imports
Import an uploaded CSV file into the table (runs in the background).
/api/v1/tables/{id}/imports- Scope
- write
- Credits
- Free
- Idempotency-Key
- optional
- Rate weight
- 5 requests
Upload the file first (POST .../imports/upload-url), preview it
(POST .../imports/preview), then start the import with the same
fileId. mapping (the preview's suggestion when omitted) maps file
columns to table columns, creating new ones (create) before any row
is written. dedupe sets each row's dedupe key (email, linkedin,
domain or the column value) and onConflict (updateEmpty by
default, overwrite, skip) applies to rows whose key exists.
The import runs in batches (500 or 1,000 rows, depending on the
workspace); each batch commits its rows and its
place in the file together, so an interrupted import resumes where it
stopped and never writes a row twice. Poll GET .../imports/{importId}
for progress and per-row errors (the first 500 are kept). With an
Idempotency-Key, a repeat returns the same import. Free.
Limits: 20 MB per file, 250,000 rows.
Parameters
- idpathstringrequired
The table id.
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255
Request body (required) · application/json
TableImportCreateRequest
- fileIdstringrequired0
- uploadIdstring0
From
imports/upload-url(required on the file's first use). - mappingarray of TableImportMappingEntry0
- dedupeTableImportDedupe0
- onConflictstringskipupdateEmptyoverwrite
- encodingstringutf-8utf-16leutf-16bewindows-1252
- delimiterstring,;tab|
- hasHeaderboolean0
Responses
200OK.Show schema
TableImportResponse
- 0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/tables/$ID/imports" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"fileId": "<fileId>"
}'Register a CSV upload and get a one-hour upload URL.
/api/v1/tables/{id}/imports/upload-url- Scope
- write
- Credits
- Free
- Idempotency-Key
- optional
Send the file's size (bytes, at most 20 MB) and type. POST the
file body to uploadUrl with the returned headers (they carry a
one-time upload token); the upload must be exactly bytes long. The
JSON answer's storageId is the fileId. Preview and import it with
fileId (and uploadId): only this API key (or dashboard user) in
this workspace can. Registrations not used within 24 hours are
deleted with their file; imported files 7 days after first use.
Parameters
- idpathstringrequired
The table id.
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255
Request body (required) · application/json
TableImportUploadUrlRequest
- bytesintegerrequired
The file's size; the upload must match it.
min 1max 20971520 - contentTypestringtext/csvtext/plaintext/tab-separated-valuesapplication/csvapplication/vnd.ms-excelapplication/octet-streamdefault "text/csv"
- fileNamestring0
Responses
200OK.Show schema
TableImportUploadUrlResponse
- dataobjectrequired0
+ Show child fields− Hide child fields
- uploadIdstringrequired0
Pass it with
fileIdto preview and import. - uploadUrlstringrequired0
- methodstringrequired0
- headersobjectrequired0
Send these headers with the upload (they tie the file to this registration).
- maxBytesintegerrequired0
- expiresAtintegerrequired0
- fileIdFieldstringrequired0
The field of the upload's JSON answer to pass as
fileId.
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/tables/$ID/imports/upload-url" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"bytes": 1
}'Preview an uploaded CSV: format, suggested mapping, sample rows, dedupe stats.
/api/v1/tables/{id}/imports/preview- Scope
- write
- Credits
- Free
- Idempotency-Key
- optional
Reads the first megabyte of the file. Detects the encoding (UTF-8,
UTF-16 with a BOM, else Windows-1252) and the separator (, ; tab
|), unless given; infers a type per column; suggests a mapping onto
the table's columns (or new columns); coerces the first rows
(sampleRows, default 20) with per-cell errors; and, with dedupe,
counts rows without a key, duplicates within the sample and keys that
already exist in the table. Writes nothing (the file is claimed for
the workspace).
Parameters
- idpathstringrequired
The table id.
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255
Request body (required) · application/json
TableImportPreviewRequest
- fileIdstringrequired0
- uploadIdstring0
From
imports/upload-url(required on the file's first use). - mappingarray of TableImportMappingEntry0
- dedupeTableImportDedupe0
- sampleRowsintegermin 1max 100
- encodingstringutf-8utf-16leutf-16bewindows-1252
- delimiterstring,;tab|
- hasHeaderboolean0
Responses
200OK.Show schema
TableImportPreviewResponse
- dataobjectrequired0
+ Show child fields− Hide child fields
- fileIdstringrequired0
- tableIdstringrequired0
- bytesintegerrequired0
- encodingstringrequired0
- delimiterstringrequired0
- hasHeaderbooleanrequired0
- headersarray of objectrequired0
+ Show child fields− Hide child fields
- indexinteger0
- namestring0
- inferredTypestring0
- samplearray of string0
- mappingarray of objectrequired0
+ Show child fields− Hide child fields
- sourceinteger0
- headerstring0
- columnKeystring0
- createobject0
- rowsarray of objectrequired0
+ Show child fields− Hide child fields
- rowinteger0
- cellsobject0
- errorsarray of object0
- totalsobjectrequired0
+ Show child fields− Hide child fields
- sampledRowsinteger0
- validRowsinteger0
- invalidRowsinteger0
- estimatedRowsinteger0
- exactboolean0
- dedupeobject | nullrequired0
+ Show child fields− Hide child fields
- onstring0
- columnKeystring0
- rowsWithKeyinteger0
- rowsWithoutKeyinteger0
- duplicatesInFileinteger0
- existingMatchesinteger | null0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/tables/$ID/imports/preview" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"fileId": "<fileId>"
}'An import's status, progress, counts and row errors.
/api/v1/tables/{id}/imports/{importId}- Scope
- write
- Credits
- Free
- Idempotency-Key
- Not used
Parameters
- idpathstringrequired
The table id.
- importIdpathstringrequired
The import id.
Responses
200OK.Show schema
TableImportResponse
- 0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/tables/$ID/imports/$IMPORT_ID" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Exports
Export the table, a view or a filtered selection as CSV, JSON Lines or JSON.
/api/v1/tables/{id}/exports- Scope
- write
- Credits
- Free
- Idempotency-Key
- required
- Rate weight
- 5 requests
Runs in the background. viewId applies a saved view (its filter,
sorts, column order and hidden columns); filter and sort override
it; columns picks column keys in order. Poll
GET .../exports/{exportId}: when status is done, downloadUrl
serves the file for 24 hours (then expired). CSV is UTF-8 with a BOM,
a header of column names, and text cells starting with =, +, -
or @ (also after leading spaces) prefixed with '.
Metered as data.export (18 credits) once per export: held when the
export is created (402 INSUFFICIENT_CREDITS if the wallet cannot
cover it), charged when the file is ready, released if the export
fails. credits.charged on the export reports it. Idempotency-Key
required. Limits: 50,000 rows (250,000 on some
workspaces; 422 LIMIT_EXCEEDED at create, nothing held). While the
workspace's tables are being upgraded: 409 TABLE_MIGRATING (retry later).
Parameters
- idpathstringrequired
The table id.
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255
Request body (required) · application/json
TableExportCreateRequest
- formatstringcsvjsonljsondefault "csv"
- viewIdstring0
- filterany0
A filter tree (the filter language).
- sortany0
Up to 3 sort keys.
- columnsarray of string0
Responses
200OK.Show schema
TableExportResponse
- 0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 402 Not enough credits (INSUFFICIENT_CREDITS). With an Idempotency-Key this
result is stored and replayed: after adding credits, retry with a new
Idempotency-Key.
· 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/tables/$ID/exports" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"format": "csv",
"viewId": "<viewId>"
}'An export's status and, when done, its download link (24 h).
/api/v1/tables/{id}/exports/{exportId}- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
Parameters
- idpathstringrequired
The table id.
- exportIdpathstringrequired
The export id.
Responses
200OK.Show schema
TableExportResponse
- 0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/tables/$ID/exports/$EXPORT_ID" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Models on this page
Shared objects the operations above link to. Clients must ignore fields they do not know.
TableImportMappingEntryobject
One file column: to an existing column (columnKey), to a new one (create), or skip.
- sourceintegerrequired
0-based column of the file.
min 0 - columnKeystring0
- createobject0
+ Show child fields− Hide child fields
- namestring0
- typestringtextnumberbooleanselectmulti_selectdateurlemailphonejson
- keystring0
- skipboolean0
TableImportDedupeobject
- onstringrequiredemaillinkedindomaincolumn
- columnKeystringrequired0
A mapped column whose (normalized) value is the row's dedupe key.
TableImportobject
- idstringrequired0
- tableIdstringrequired0
- statusstringrequiredqueuedrunningdonefailed
- fileIdstringrequired0
- optionsobjectrequired0
- progressobjectrequired0
+ Show child fields− Hide child fields
- bytesReadinteger0
- bytesTotalinteger0
- percentinteger0
- rowsSeenintegerrequired0
- insertedintegerrequired0
- updatedintegerrequired0
- skippedDuplicateintegerrequired0
Rows whose dedupe key already existed and that changed nothing.
- rejectedintegerrequired0
- 0
- errorsTruncatedbooleanrequired0
- failurestring | nullrequired0
- createdAtintegerrequired0
- updatedAtintegerrequired0
- finishedAtinteger | nullrequired0
TableImportRowErrorobject
- rowintegerrequired0
Line of the file (the header is line 1).
- codestringrequired0
- messagestringrequired0
- columnKeystring0
ResponseMetaobject
Metadata on every success response.
- requestIdstringrequired0
- 0
- pagePageMeta0
Cursor pagination.
hasMoreis the only end signal; pages may be short. - dryRunboolean0
True only on a dry-run response (action operations).
CreditsMetaobject
- usednumberrequired0
Credits charged by this request. Reads are free.
- balancenumber0
- estimatednumber0
Dry run only (action operations).
- availablenumber0
Dry run only (action operations).
- reservationIdstring | null0
Async operations only; the job settles this reservation.
PageMetaobject
Cursor pagination. hasMore is the only end signal; pages may be short.
- nextCursorstring | nullrequired0
- hasMorebooleanrequired0
- limitintegerrequiredmin 1max 200
TableExportobject
- idstringrequired0
- tableIdstringrequired0
- viewIdstring | nullrequired0
- formatstringrequiredcsvjsonljson
- statusstringrequiredqueuedrunningdonefailedexpired
- filterany0
- sortsarray of any0
- columnsarray of string | null0
- rowCountinteger | nullrequired0
- bytesinteger | nullrequired0
- fileNamestring | nullrequired0
- downloadUrlstring | nullrequired0
- expiresAtinteger | nullrequired0
- failurestring | nullrequired0
- creditsobject0
+ Show child fields− Hide child fields
- reservedboolean0
- chargednumber0
- createdAtintegerrequired0
- finishedAtinteger | nullrequired0