POST /collections
Create a new collection linked to a source for instant database sync.

Authentication

API Key (header: X-API-Key) API Key (cookie: better-auth.session_token)

Request Body required

Request body

application/json
name string REQUIRED
Collection name
slug string REQUIRED
URL-safe slug
source_id string REQUIRED
Source ID to sync from
primary_key_path string REQUIRED
JSONPath to the record primary key
event_type_field string
Field used to determine event type
description string
Optional description

Responses

201 Collection created
application/json
collection object | null REQUIRED
id string REQUIRED
org_id string REQUIRED
env_id string REQUIRED
name string REQUIRED
slug string REQUIRED
source_id string REQUIRED
primary_key_path string REQUIRED
event_type_field string | null REQUIRED
description string | null REQUIRED
status string REQUIRED
record_count integer REQUIRED
last_sync_at string | null REQUIRED
created_at string REQUIRED
updated_at string REQUIRED
backfill_status string | null REQUIRED
backfill_progress integer | null REQUIRED
backfill_total integer | null REQUIRED
backfill_cursor string | null REQUIRED
backfill_started_at string | null REQUIRED
backfill_completed_at string | null REQUIRED
backfill_error string | null REQUIRED
source_name string | null REQUIRED
400 Bad request
401 Unauthorized
404 Source not found
curl -X POST 'https://hookstream.io/v1/collections' \  -H 'Authorization: Bearer YOUR_API_TOKEN' \  -H 'Content-Type: application/json' \  -d '{  "name": "Users",  "slug": "users",  "source_id": "string",  "primary_key_path": "$.id",  "event_type_field": "string",  "description": "string"}'
const response = await fetch('https://hookstream.io/v1/collections', {  method: 'POST',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN",      "Content-Type": "application/json"  },  body: JSON.stringify({    "name": "Users",    "slug": "users",    "source_id": "string",    "primary_key_path": "$.id",    "event_type_field": "string",    "description": "string"  })});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.post('https://hookstream.io/v1/collections', headers=headers, json={  "name": "Users",  "slug": "users",  "source_id": "string",  "primary_key_path": "$.id",  "event_type_field": "string",  "description": "string"})print(response.json())
package mainimport (	"fmt"	"io"	"net/http"	"strings")func main() {	body := strings.NewReader(`{  "name": "Users",  "slug": "users",  "source_id": "string",  "primary_key_path": "$.id",  "event_type_field": "string",  "description": "string"}`)	req, _ := http.NewRequest("POST", "https://hookstream.io/v1/collections", body)	req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")	req.Header.Set("Content-Type", "application/json")	resp, _ := http.DefaultClient.Do(req)	defer resp.Body.Close()	result, _ := io.ReadAll(resp.Body)	fmt.Println(string(result))}
201 Response
{  "collection": {    "id": "<string>",    "org_id": "<string>",    "env_id": "<string>",    "name": "<string>",    "slug": "<string>",    "source_id": "<string>",    "primary_key_path": "<string>",    "event_type_field": "<string>",    "description": "<string>",    "status": "<string>",    "record_count": 123,    "last_sync_at": "<string>",    "created_at": "<string>",    "updated_at": "<string>",    "backfill_status": "<string>",    "backfill_progress": 123,    "backfill_total": 123,    "backfill_cursor": "<string>",    "backfill_started_at": "<string>",    "backfill_completed_at": "<string>",    "backfill_error": "<string>",    "source_name": "<string>"  }}