curl --request POST \
--url https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish', 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://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"jobId": "<string>",
"backgroundJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue": "ingest",
"jobName": "<string>",
"status": "queued",
"notify_email": true
}{
"error": "UNAUTHORIZED",
"details": {
"message": "Missing or invalid authentication token"
}
}{
"error": "FORBIDDEN",
"details": {
"message": "User does not have permission to access this resource"
}
}{
"error": "NOT_FOUND",
"details": {
"message": "Resource not found"
}
}{
"error": "INTERNAL_SERVER_ERROR",
"details": {
"message": "An unexpected error occurred"
}
}Publish Catalog
Enqueues an async job to publish a catalog and make it available for feeds. Returns 202 Accepted immediately. Poll GET /api/workspace/{workspaceId}/jobs/{backgroundJobId} for status.
curl --request POST \
--url https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish', 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://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.alana.shopping/api/workspace/{workspaceId}/catalogs/{catalogId}/publish")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"jobId": "<string>",
"backgroundJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue": "ingest",
"jobName": "<string>",
"status": "queued",
"notify_email": true
}{
"error": "UNAUTHORIZED",
"details": {
"message": "Missing or invalid authentication token"
}
}{
"error": "FORBIDDEN",
"details": {
"message": "User does not have permission to access this resource"
}
}{
"error": "NOT_FOUND",
"details": {
"message": "Resource not found"
}
}{
"error": "INTERNAL_SERVER_ERROR",
"details": {
"message": "An unexpected error occurred"
}
}Authorizations
Bearer token authentication via Auth0. Users authenticate through Auth0 Universal Login. Include the access token in the Authorization header: Authorization: Bearer <token>
Path Parameters
The workspace ID
^ws_[a-z0-9]+$Response
Publish job enqueued. Poll /api/workspace/{workspaceId}/jobs/{backgroundJobId} for status.
Returned when a background job is successfully enqueued for async processing (202 Accepted). Poll GET /api/workspace/{workspaceId}/jobs/{backgroundJobId} for status updates. An in-app toast notification is shown when the job reaches a terminal state. Pass notify_email: true in the request to also receive an email on completion or failure.
BullMQ job ID (matches backgroundJobId for correlation)
Internal background_jobs record ID. Use this to poll the jobs status endpoint.
Worker queue the job was added to
ingest, catalog, media Job type identifier (e.g. pipeline_run, platform_sync, workflow_batch)
Initial status. Transitions to active → completed | failed as the worker processes it.
queued Whether the user opted in to receive an email notification when the job completes or fails. Defaults to false if not provided in the request.