curl --request POST \
--url https://api.eu.linqalpha.com/v1/briefings/preview \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"query": "<string>",
"tickers": [
"<string>"
],
"stock_ids": [
"<string>"
],
"language": "<string>",
"timezone": "<string>",
"previous_delivery_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "<string>",
"user_email": "<string>",
"user_name": "<string>"
}
'import requests
url = "https://api.eu.linqalpha.com/v1/briefings/preview"
payload = {
"query": "<string>",
"tickers": ["<string>"],
"stock_ids": ["<string>"],
"language": "<string>",
"timezone": "<string>",
"previous_delivery_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "<string>",
"user_email": "<string>",
"user_name": "<string>"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
tickers: ['<string>'],
stock_ids: ['<string>'],
language: '<string>',
timezone: '<string>',
previous_delivery_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
user_id: '<string>',
user_email: '<string>',
user_name: '<string>'
})
};
fetch('https://api.eu.linqalpha.com/v1/briefings/preview', 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.eu.linqalpha.com/v1/briefings/preview",
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([
'query' => '<string>',
'tickers' => [
'<string>'
],
'stock_ids' => [
'<string>'
],
'language' => '<string>',
'timezone' => '<string>',
'previous_delivery_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'user_id' => '<string>',
'user_email' => '<string>',
'user_name' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.eu.linqalpha.com/v1/briefings/preview"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.eu.linqalpha.com/v1/briefings/preview")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v1/briefings/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "BRIEFING_NOT_FOUND",
"msg": "Brief delivery not found.",
"message": "Brief delivery not found."
},
"payload": null
}{
"error": null,
"payload": {
"delivery_id": "b1f2c3d4-5678-90ab-cdef-1234567890ab",
"status": "pending"
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": null
}{
"error": {
"code": "API_KEY_MISSING",
"msg": "header does not contain api key",
"message": "header does not contain api key"
},
"payload": null
}Preview Briefing On-Demand
Run a briefing on-demand from an ad-hoc prompt as a fire-and-forget job: enqueue the run and get a pending delivery handle immediately, then poll GET /v1/briefings/deliveries/{delivery_id} for the result.
curl --request POST \
--url https://api.eu.linqalpha.com/v1/briefings/preview \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"query": "<string>",
"tickers": [
"<string>"
],
"stock_ids": [
"<string>"
],
"language": "<string>",
"timezone": "<string>",
"previous_delivery_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "<string>",
"user_email": "<string>",
"user_name": "<string>"
}
'import requests
url = "https://api.eu.linqalpha.com/v1/briefings/preview"
payload = {
"query": "<string>",
"tickers": ["<string>"],
"stock_ids": ["<string>"],
"language": "<string>",
"timezone": "<string>",
"previous_delivery_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "<string>",
"user_email": "<string>",
"user_name": "<string>"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
tickers: ['<string>'],
stock_ids: ['<string>'],
language: '<string>',
timezone: '<string>',
previous_delivery_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
user_id: '<string>',
user_email: '<string>',
user_name: '<string>'
})
};
fetch('https://api.eu.linqalpha.com/v1/briefings/preview', 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.eu.linqalpha.com/v1/briefings/preview",
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([
'query' => '<string>',
'tickers' => [
'<string>'
],
'stock_ids' => [
'<string>'
],
'language' => '<string>',
'timezone' => '<string>',
'previous_delivery_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'user_id' => '<string>',
'user_email' => '<string>',
'user_name' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.eu.linqalpha.com/v1/briefings/preview"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.eu.linqalpha.com/v1/briefings/preview")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v1/briefings/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"tickers\": [\n \"<string>\"\n ],\n \"stock_ids\": [\n \"<string>\"\n ],\n \"language\": \"<string>\",\n \"timezone\": \"<string>\",\n \"previous_delivery_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"user_id\": \"<string>\",\n \"user_email\": \"<string>\",\n \"user_name\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "BRIEFING_NOT_FOUND",
"msg": "Brief delivery not found.",
"message": "Brief delivery not found."
},
"payload": null
}{
"error": null,
"payload": {
"delivery_id": "b1f2c3d4-5678-90ab-cdef-1234567890ab",
"status": "pending"
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": null
}{
"error": {
"code": "API_KEY_MISSING",
"msg": "header does not contain api key",
"message": "header does not contain api key"
},
"payload": null
}delivery_id.
The output comes from the same engine behind your scheduled briefings, so it matches their depth, formatting, and citations — letting you preview a briefing before committing to a schedule.
Stock Selection
Scope the run to specific stocks in either of two ways (omit both to cover the full market):stock_ids(recommended) — Internal stock UUIDs. Use the Map Tickers endpoint to convert ticker symbols to stock IDs first.tickers— Ticker symbols (e.g.["AAPL", "MSFT"]). Automatically resolved to stock IDs via the ticker mapping service. A symbol that cannot be resolved does not fail the request: it is forwarded upstream, retried through a second resolver there, and dropped from the scope if it still cannot be matched.
stock_ids and tickers are provided, stock_ids takes priority.
Polling for the result
The202 response returns { delivery_id, status } with status: "pending" — the briefing is not ready yet. Poll GET /v1/briefings/deliveries/{delivery_id} until its status is terminal, then read the content from that response. status is the same field returned by Get Briefing Delivery.
previous_delivery_id
Pass the delivery_id of an earlier delivery to carry formatting and continuity from it into this run. The delivery must belong to your organization; otherwise the request returns BRIEFING_NOT_FOUND (see below).
Errors
Domain errors are returned as HTTP200 with an error.code (and payload: null), consistent with the other briefing JSON endpoints. Input-validation failures are the exception — they return HTTP 400.
| Condition | HTTP status | error.code |
|---|---|---|
query missing or empty | 400 | INVALID_REQUEST_BODY |
previous_delivery_id is not a valid UUID | 400 | INVALID_REQUEST_BODY |
previous_delivery_id not owned by the caller | 200 | BRIEFING_NOT_FOUND |
| Upstream / generation failure | 200 | BRIEFING_GENERATE_FAIL |
Authentication
For platform API keys, optionally passuser_id (the customer_id), user_email, and user_name in the request body to select which user the briefing runs as. Ordinary organization-bound keys resolve the user from the key itself and ignore these fields.Authorizations
Body
The ad-hoc briefing prompt (used as the briefing topic), run through the briefing engine
Optional ticker symbols to scope the briefing; auto-resolved to stock_ids (stock_ids take priority). An unresolvable symbol does not fail the request — it is retried through a second resolver upstream and dropped from the scope if still unmatched.
Optional internal stock ids to scope the briefing (preferred over tickers; no resolution needed)
Output language; auto-detected from the prompt when omitted
Data window (last 1 / 7 / 30 days, anchored at now). Defaults to daily.
daily, weekly, monthly IANA timezone (e.g. America/New_York) for the window and timestamps. Defaults to UTC.
A prior briefing delivery (that you own) to carry formatting/continuity from. Returns BRIEFING_NOT_FOUND if not owned.
User ID (customer_id) for platform API keys
User email for platform API keys
User name for platform API keys
Response
Domain error — returned with HTTP 200 and an error.code (payload null), consistent with the other briefing JSON endpoints. BRIEFING_NOT_FOUND when previous_delivery_id is not owned by the caller; BRIEFING_GENERATE_FAIL for a generic upstream/generation failure. An unresolvable tickers symbol is not an error — it is dropped from the scope after an upstream retry.