Skip to main content
GET
/
v1
/
signals
List signals
curl --request GET \
  --url https://api.gildea.ai/v1/signals \
  --header 'X-API-Key: <api-key>'
import requests

url = "https://api.gildea.ai/v1/signals"

headers = {"X-API-Key": "<api-key>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};

fetch('https://api.gildea.ai/v1/signals', 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.gildea.ai/v1/signals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)

func main() {

url := "https://api.gildea.ai/v1/signals"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("X-API-Key", "<api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.gildea.ai/v1/signals")
.header("X-API-Key", "<api-key>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.gildea.ai/v1/signals")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'

response = http.request(request)
puts response.read_body
{
  "signals": [
    {
      "signal_id": "<string>",
      "url": "<string>",
      "title": "<string>",
      "published_at": "<string>",
      "content_type": "analysis",
      "domain": "reuters.com",
      "verified_unit_count": 0,
      "thesis": "<string>",
      "synopsis": "<string>",
      "themes": {
        "value_chain": [
          "<string>"
        ],
        "market_force": [
          "<string>"
        ]
      },
      "entities": [
        {
          "entity_id": "<string>",
          "name": "<string>",
          "type": "<string>"
        }
      ]
    }
  ],
  "has_more": true,
  "next_cursor": "<string>"
}
{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"field": "body.text",
"request_id": "<string>",
"retry_after": 123,
"reset": 123
}
}
{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}
{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"field": "body.text",
"request_id": "<string>",
"retry_after": 123,
"reset": 123
}
}
Each result is a lightweight card (identity + the central statement). For a signal’s full verified decomposition (the flat units[] with evidence), call Get signal with the signal_id.

Authorizations

X-API-Key
string
header
required

API key for authentication. Include in every request as X-API-Key: gld_your_key_here.

Query Parameters

entity
string | null

Filter by entity public ID (gld:/…) or exact entity name (case-insensitive). Family-level and alias-aware (Sonnet / Claude 3.5 resolve to Claude). Get public IDs from any entity_id field via GET /v1/entities. An unknown entity returns 404 (not an empty list), so a typo is distinguishable from a real no-match.

theme
string | null

Filter by theme label (see GET /v1/themes for valid labels). An unknown label returns 404, not an empty list.

keyword
string | null

Literal keyword filter on signal title and decomposition text (exact term match, not relevance-ranked). For natural-language semantic retrieval, use the q parameter on GET /v1/search instead.

content_type
enum<string> | null

Filter by content type: 'analysis' or 'event'.

Available options:
analysis,
event
published_after
string | null

ISO 8601 date — only signals published after this date.

published_before
string | null

ISO 8601 date — only signals published before this date.

window
string | null

Relative time shortcut, e.g. 7d, 2w, 14d, 1m (d=days, w=weeks, m=30-day months). Sugar for published_after = now - window. Cannot be combined with published_after.

sort
enum<string>
default:published

Result ordering. published (default): newest published first, for browsing. changed: the monitor change-feed — signals ordered by when they last changed (oldest change first). Page it with cursor to pull everything that changed since your last sync (newly published AND reprocessed signals), in order, without missing or repeating any. The cursor and sort must stay consistent across a pagination sequence.

Available options:
published,
changed
cursor
string | null

Opaque cursor from a previous response's next_cursor. Omit for the first page.

limit
integer
default:25

Page size (1–50, default 25). These endpoints are cursor-paginated: pass the returned next_cursor as cursor to walk the full result set. (Relevance-ranked GET /v1/search is not paginated — its limit is the total top-N returned, not a page size.)

Required range: 1 <= x <= 50

Response

Successful Response

signals
SignalCard · object[]
required

Signal cards matching the query.

has_more
boolean
required

Whether more results are immediately available beyond this page.

next_cursor
string | null

Pass back as cursor to continue. For sort=published it is the next-page cursor (null once has_more is false). For sort=changed it is a resume point you keep and poll forward from: it is returned even on the last page (when has_more is false) so you can fetch future changes, and is null only when nothing changed (keep your prior cursor).