Refresh an existing external content PDF upload URL
curl --request POST \
--url https://api.linqalpha.com/v1/external_content/refresh_upload_url \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "bloomberg_market_wrap",
"content_date": "2026-09-04"
}
'import requests
url = "https://api.linqalpha.com/v1/external_content/refresh_upload_url"
payload = {
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "bloomberg_market_wrap",
"content_date": "2026-09-04"
}
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({
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
source_type: 'bloomberg_market_wrap',
content_date: '2026-09-04'
})
};
fetch('https://api.linqalpha.com/v1/external_content/refresh_upload_url', 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.linqalpha.com/v1/external_content/refresh_upload_url",
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([
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'source_type' => 'bloomberg_market_wrap',
'content_date' => '2026-09-04'
]),
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.linqalpha.com/v1/external_content/refresh_upload_url"
payload := strings.NewReader("{\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\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.linqalpha.com/v1/external_content/refresh_upload_url")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linqalpha.com/v1/external_content/refresh_upload_url")
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 \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "<string>",
"msg": "<string>",
"message": "<string>"
},
"payload": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "<string>",
"content_date": "2023-12-25",
"status": "active",
"pdf_file_key": "<string>",
"file_extension": "pdf",
"upload_url": "<string>"
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}Briefing
Refresh External Content PDF Upload URL
Issues a 600-second presigned PUT URL for an existing active PDF source without changing articles, extracted content, metadata, timestamps, or attachment history. The API key must belong to the target organization or its platform. Upload with Content-Type: application/pdf. Missing or invalid sources return an error; never retry using content ingestion. Successful URL issuance does not confirm PDF upload or customer delivery. Error messages use fixed public descriptions and never include upstream response bodies.
POST
/
v1
/
external_content
/
refresh_upload_url
Refresh an existing external content PDF upload URL
curl --request POST \
--url https://api.linqalpha.com/v1/external_content/refresh_upload_url \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "bloomberg_market_wrap",
"content_date": "2026-09-04"
}
'import requests
url = "https://api.linqalpha.com/v1/external_content/refresh_upload_url"
payload = {
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "bloomberg_market_wrap",
"content_date": "2026-09-04"
}
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({
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
source_type: 'bloomberg_market_wrap',
content_date: '2026-09-04'
})
};
fetch('https://api.linqalpha.com/v1/external_content/refresh_upload_url', 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.linqalpha.com/v1/external_content/refresh_upload_url",
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([
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'source_type' => 'bloomberg_market_wrap',
'content_date' => '2026-09-04'
]),
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.linqalpha.com/v1/external_content/refresh_upload_url"
payload := strings.NewReader("{\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\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.linqalpha.com/v1/external_content/refresh_upload_url")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linqalpha.com/v1/external_content/refresh_upload_url")
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 \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_type\": \"bloomberg_market_wrap\",\n \"content_date\": \"2026-09-04\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "<string>",
"msg": "<string>",
"message": "<string>"
},
"payload": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "<string>",
"content_date": "2023-12-25",
"status": "active",
"pdf_file_key": "<string>",
"file_extension": "pdf",
"upload_url": "<string>"
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}Recover a missing PDF attachment for an existing external content source using its organization, source type, and content date.
Pass
source_type exactly as registered. Refresh does not trim or otherwise normalize this identity.
Both ingestion and refresh require a valid calendar content_date in YYYY-MM-DD format, with a year from 0001 to 9999. Impossible dates and year 0000 return HTTP 400 at the Public API validation boundary.
The endpoint preserves the source’s articles, extracted text, metadata, timestamps, and attachment history. It returns a presigned PUT URL for the existing stored PDF key, valid for 600 seconds. Upload the PDF with Content-Type: application/pdf.
The source must already exist, be active, and have a PDF key. The API key must belong to the target organization or its platform. A missing source or failed refresh returns an error; clients must not retry through the content ingestion endpoint because ingestion replaces article content.
Authentication, authorization, missing-source, and validation failures return HTTP 401, 403, 404, and 422 respectively. Upstream server failures, network errors, and timeouts return HTTP 503 and can be retried with bounded backoff.
An unavailable upstream refresh route also returns HTTP 404. Error messages use fixed public descriptions and do not include upstream response bodies.
A successful refresh confirms that an upload URL was issued. Verify the subsequent PUT succeeds before marking the PDF uploaded; this endpoint does not confirm customer delivery.Authorizations
Body
application/json
Exact source type as registered; refresh does not trim or otherwise normalize this identity.
Minimum string length:
1Example:
"bloomberg_market_wrap"
Valid calendar date in YYYY-MM-DD format; years 0001 through 9999 are supported.
Pattern:
^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$Example:
"2026-09-04"
Was this page helpful?