Create Link Column (Manual-Link)
curl --request POST \
--url https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234"
},
"uiMetadata": {
"title": "people"
},
"name": "people"
}
'import requests
url = "https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column"
payload = {
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234"
},
"uiMetadata": { "title": "people" },
"name": "people"
}
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({
uiDataType: 'LINK',
colOptions: {
relationType: 'HAS_MANY',
associateTableId: '6a175502-6458-4314-b4c5-3c2f29626dea',
associateWorkspaceId: 'b3e1a902-1234-4abc-9def-7f8a90bc1234'
},
uiMetadata: {title: 'people'},
name: 'people'
})
};
fetch('https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column', 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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column",
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([
'uiDataType' => 'LINK',
'colOptions' => [
'relationType' => 'HAS_MANY',
'associateTableId' => '6a175502-6458-4314-b4c5-3c2f29626dea',
'associateWorkspaceId' => 'b3e1a902-1234-4abc-9def-7f8a90bc1234'
],
'uiMetadata' => [
'title' => 'people'
],
'name' => 'people'
]),
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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column"
payload := strings.NewReader("{\n \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column")
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 \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\n}"
response = http.request(request)
puts response.read_body{
"id": "21224153-2f85-4b24-a306-4cfbc7e73f70",
"name": "people",
"uiDataType": "LINK",
"colOptions": {
"id": "28dde853-fc6e-4983-8121-b013f2b85e80",
"relationType": "HAS_MANY",
"columnId": "21224153-2f85-4b24-a306-4cfbc7e73f70",
"associatedColumnId": "518e2dfc-f8c9-459e-ac7e-99f3daa6d773",
"tableId": "2815ed2f-5acc-400d-94a9-ae5596da2c37",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234",
"childColumnId": "d1d1e3f0-8a3f-48e5-b93e-9e3f3d1ef4ff",
"parentColumnId": "9f642d9c-54ae-4801-95fe-e83e452b5b4b",
"isItSource": true
},
"uiMetadata": {
"title": "people"
}
}Links & Joins
Create Link Column (Manual-Link)
1️⃣ Overview
Purpose: Creates a new LINK type column in a table, establishing a bidirectional relationship between a parent table and a child/associated table.
This endpoint supports:
- Creating HAS_MANY, ONE_TO_ONE, and MANY_TO_MANY relation types
- Automatically creating a reciprocal link column in the associated table
⚠️ Note: Links are bidirectional. When a link is created from the parent with relation type
HAS_MANY, a corresponding column with relation typeBELONGS_TOis automatically created in the child table.
2️⃣ Endpoint
POST /noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column
3️⃣ Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | UUID | ✅ Yes | Workspace identifier |
| tableId | UUID | ✅ Yes | Source (parent) table identifier |
4️⃣ Authentication
Requires Bearer JWT Token
Authorization: Bearer <token>
5️⃣ Request Headers
| Header | Required |
|---|---|
| Authorization | ✅ Yes |
| Content-Type: application/json | ✅ Yes |
6️⃣ Request Body Schema
{
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "uuid",
"associateWorkspaceId": "uuid"
},
"uiMetadata": {
"title": "string"
},
"settings": {},
"name": "string"
}
7️⃣ Field Descriptions
| Field | Type | Required | Description |
|---|---|---|---|
| uiDataType | string | ✅ Yes | Must be LINK |
| colOptions.relationType | string | ✅ Yes | Relation type: HAS_MANY, ONE_TO_ONE, or MANY_TO_MANY |
| colOptions.associateTableId | UUID | ✅ Yes | The child or linked table ID |
| colOptions.associateWorkspaceId | UUID | ✅ Yes | The workspace ID of the child (associated) table |
| uiMetadata.title | string | ✅ Yes | Display name shown in the UI |
| name | string | ✅ Yes | Internal column name — must be unique within the table |
8️⃣ Example Request
curl -X POST https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234"
},
"uiMetadata": {
"title": "people"
},
"name": "people"
}'
9️⃣ Behavior Summary
Creates a LINK column in the source table.
Supports:
• HAS_MANY, ONE_TO_ONE, and MANY_TO_MANY relation types
• Bidirectional — a BELONGS_TO column is auto-created in the child table
• Column name must be unique within the table
• Returns the full column object including colOptions with resolved IDs
POST
/
noCo
/
api
/
v2
/
workspaces
/
{workspaceId}
/
tables
/
{tableId}
/
column
Create Link Column (Manual-Link)
curl --request POST \
--url https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234"
},
"uiMetadata": {
"title": "people"
},
"name": "people"
}
'import requests
url = "https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column"
payload = {
"uiDataType": "LINK",
"colOptions": {
"relationType": "HAS_MANY",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234"
},
"uiMetadata": { "title": "people" },
"name": "people"
}
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({
uiDataType: 'LINK',
colOptions: {
relationType: 'HAS_MANY',
associateTableId: '6a175502-6458-4314-b4c5-3c2f29626dea',
associateWorkspaceId: 'b3e1a902-1234-4abc-9def-7f8a90bc1234'
},
uiMetadata: {title: 'people'},
name: 'people'
})
};
fetch('https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column', 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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column",
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([
'uiDataType' => 'LINK',
'colOptions' => [
'relationType' => 'HAS_MANY',
'associateTableId' => '6a175502-6458-4314-b4c5-3c2f29626dea',
'associateWorkspaceId' => 'b3e1a902-1234-4abc-9def-7f8a90bc1234'
],
'uiMetadata' => [
'title' => 'people'
],
'name' => 'people'
]),
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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column"
payload := strings.NewReader("{\n \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\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://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://be.datagol.ai/noCo/api/v2/workspaces/{workspaceId}/tables/{tableId}/column")
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 \"uiDataType\": \"LINK\",\n \"colOptions\": {\n \"relationType\": \"HAS_MANY\",\n \"associateTableId\": \"6a175502-6458-4314-b4c5-3c2f29626dea\",\n \"associateWorkspaceId\": \"b3e1a902-1234-4abc-9def-7f8a90bc1234\"\n },\n \"uiMetadata\": {\n \"title\": \"people\"\n },\n \"name\": \"people\"\n}"
response = http.request(request)
puts response.read_body{
"id": "21224153-2f85-4b24-a306-4cfbc7e73f70",
"name": "people",
"uiDataType": "LINK",
"colOptions": {
"id": "28dde853-fc6e-4983-8121-b013f2b85e80",
"relationType": "HAS_MANY",
"columnId": "21224153-2f85-4b24-a306-4cfbc7e73f70",
"associatedColumnId": "518e2dfc-f8c9-459e-ac7e-99f3daa6d773",
"tableId": "2815ed2f-5acc-400d-94a9-ae5596da2c37",
"associateTableId": "6a175502-6458-4314-b4c5-3c2f29626dea",
"associateWorkspaceId": "b3e1a902-1234-4abc-9def-7f8a90bc1234",
"childColumnId": "d1d1e3f0-8a3f-48e5-b93e-9e3f3d1ef4ff",
"parentColumnId": "9f642d9c-54ae-4801-95fe-e83e452b5b4b",
"isItSource": true
},
"uiMetadata": {
"title": "people"
}
}Authorizations
This API uses OAuth 2.0 with the authorization code grant flow.
Path Parameters
Workspace identifier
Source (parent) table identifier
Body
application/json
Response
200 - application/json
Link column created successfully