Import a table (columns + JSON rows)
curl --request POST \
--url https://api.retriever.run/v1/workspaces/{id}/tables \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Companies",
"columns": [
{
"key": "company",
"name": "Company"
},
{
"key": "domain",
"name": "Domain"
}
],
"rows": [
{
"company": "Acme",
"domain": "acme.example"
},
{
"company": "Beta",
"domain": null
}
]
}
'import requests
url = "https://api.retriever.run/v1/workspaces/{id}/tables"
payload = {
"name": "Companies",
"columns": [
{
"key": "company",
"name": "Company"
},
{
"key": "domain",
"name": "Domain"
}
],
"rows": [
{
"company": "Acme",
"domain": "acme.example"
},
{
"company": "Beta",
"domain": None
}
]
}
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({
name: 'Companies',
columns: [{key: 'company', name: 'Company'}, {key: 'domain', name: 'Domain'}],
rows: [{company: 'Acme', domain: 'acme.example'}, {company: 'Beta', domain: null}]
})
};
fetch('https://api.retriever.run/v1/workspaces/{id}/tables', 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.retriever.run/v1/workspaces/{id}/tables",
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([
'name' => 'Companies',
'columns' => [
[
'key' => 'company',
'name' => 'Company'
],
[
'key' => 'domain',
'name' => 'Domain'
]
],
'rows' => [
[
'company' => 'Acme',
'domain' => 'acme.example'
],
[
'company' => 'Beta',
'domain' => null
]
]
]),
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.retriever.run/v1/workspaces/{id}/tables"
payload := strings.NewReader("{\n \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\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.retriever.run/v1/workspaces/{id}/tables")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.retriever.run/v1/workspaces/{id}/tables")
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 \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"columns": [
{
"key": "<string>",
"name": "<string>",
"kind": "<string>",
"qualification": {},
"hidden": true
}
],
"row_count": 123,
"fit_counts": {
"qualified": 123,
"disqualified": 123,
"unknown": 123
},
"links": {
"self": "<string>",
"rows": "<string>",
"app": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "prompt: prompt must not be blank",
"details": [
{
"path": "prompt",
"message": "prompt must not be blank"
}
]
}
}{
"error": {
"code": "not_authenticated",
"message": "A valid API key is required."
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "body_too_large",
"message": "The request body exceeds the 25 MiB limit (26214400 bytes)."
}
}{
"error": {
"code": "invalid_request",
"message": "Content-Type must be application/json."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry in 12 s."
}
}Workspaces
Import a table (columns + JSON rows)
Single transaction: one error rolls back the entire import. Every row property must match a declared column. There is no endpoint to append rows to an existing table.
At most 200 columns and 10,000 rows, refused with 400 before anything
is written. The body can be at most 25 MiB, 26,214,400 bytes
(413 body_too_large).
POST
/
v1
/
workspaces
/
{id}
/
tables
Import a table (columns + JSON rows)
curl --request POST \
--url https://api.retriever.run/v1/workspaces/{id}/tables \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Companies",
"columns": [
{
"key": "company",
"name": "Company"
},
{
"key": "domain",
"name": "Domain"
}
],
"rows": [
{
"company": "Acme",
"domain": "acme.example"
},
{
"company": "Beta",
"domain": null
}
]
}
'import requests
url = "https://api.retriever.run/v1/workspaces/{id}/tables"
payload = {
"name": "Companies",
"columns": [
{
"key": "company",
"name": "Company"
},
{
"key": "domain",
"name": "Domain"
}
],
"rows": [
{
"company": "Acme",
"domain": "acme.example"
},
{
"company": "Beta",
"domain": None
}
]
}
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({
name: 'Companies',
columns: [{key: 'company', name: 'Company'}, {key: 'domain', name: 'Domain'}],
rows: [{company: 'Acme', domain: 'acme.example'}, {company: 'Beta', domain: null}]
})
};
fetch('https://api.retriever.run/v1/workspaces/{id}/tables', 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.retriever.run/v1/workspaces/{id}/tables",
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([
'name' => 'Companies',
'columns' => [
[
'key' => 'company',
'name' => 'Company'
],
[
'key' => 'domain',
'name' => 'Domain'
]
],
'rows' => [
[
'company' => 'Acme',
'domain' => 'acme.example'
],
[
'company' => 'Beta',
'domain' => null
]
]
]),
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.retriever.run/v1/workspaces/{id}/tables"
payload := strings.NewReader("{\n \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\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.retriever.run/v1/workspaces/{id}/tables")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.retriever.run/v1/workspaces/{id}/tables")
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 \"name\": \"Companies\",\n \"columns\": [\n {\n \"key\": \"company\",\n \"name\": \"Company\"\n },\n {\n \"key\": \"domain\",\n \"name\": \"Domain\"\n }\n ],\n \"rows\": [\n {\n \"company\": \"Acme\",\n \"domain\": \"acme.example\"\n },\n {\n \"company\": \"Beta\",\n \"domain\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"columns": [
{
"key": "<string>",
"name": "<string>",
"kind": "<string>",
"qualification": {},
"hidden": true
}
],
"row_count": 123,
"fit_counts": {
"qualified": 123,
"disqualified": 123,
"unknown": 123
},
"links": {
"self": "<string>",
"rows": "<string>",
"app": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "prompt: prompt must not be blank",
"details": [
{
"path": "prompt",
"message": "prompt must not be blank"
}
]
}
}{
"error": {
"code": "not_authenticated",
"message": "A valid API key is required."
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "body_too_large",
"message": "The request body exceeds the 25 MiB limit (26214400 bytes)."
}
}{
"error": {
"code": "invalid_request",
"message": "Content-Type must be application/json."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry in 12 s."
}
}Authorizations
API key ret_live_… created in Settings → API keys.
Path Parameters
Body
application/json