All NewsEducationTVBrokers
Equities & FundsCrypto & Digital AssetsAI & TechnologyBusiness & CorporateUS Politics & PolicyGeopolitics & Global RiskMacro, Rates & FXCommodities & EnergyEuropean Politics & MarketsAsia-PacificReal Estate & Property

PiQ Developer API

Put PiQ market headlines on your site, app or terminal. The API returns our categories and the latest stories in each one: headline, image and a link. Readers follow the link to PiQ for the full story.

Getting an API key

API access is by invitation. Email [email protected] with your company name, what you plan to build, and roughly how many requests you expect. We'll send you a key with rate limits and quotas set for your use case.

Keep your key secret. Call the API from your server, not from browser or mobile app code where users could read the key. If a key leaks, tell us and we'll rotate it.

Authentication

Send your key with every request, in the x-api-key header:

curl https://piqmarkets.com/api/v1/categories \
  -H "x-api-key: pqm_your_key_here"

Authorization: Bearer pqm_your_key_here works as well.

Base URL

https://piqmarkets.com/api/v1

All responses are JSON. All timestamps are ISO 8601 in UTC.

Endpoints

List categories

GET /api/v1/categories

Returns every category you can filter stories by.

{
  "items": [
    { "slug": "equities-funds", "name": "Equities & Funds" },
    { "slug": "crypto-digital-assets", "name": "Crypto & Digital Assets" }
  ]
}

List stories

GET /api/v1/stories

Returns live stories, newest first by default.

ParameterDescription
categoryOne or more category slugs, comma-separated (equities-funds,macro-rates-fx). Leave it out to get all categories.
sortlatest (default) orders by publish time. top returns our highest-impact stories first.
limitStories per page, 1–50. Default 20.
offsetNumber of stories to skip, for paging. Default 0.
sinceISO timestamp. Only return stories published after it. Useful for polling.
curl "https://piqmarkets.com/api/v1/stories?category=equities-funds&limit=2" \
  -H "x-api-key: pqm_your_key_here"
{
  "items": [
    {
      "id": "4b8ad6a1-0082-467f-b43a-c699f0a279e9",
      "headline": "Shein shares slide over 5% on second day of Hong Kong trading",
      "image": "https://cdn.example.com/shein.jpg",
      "category": { "slug": "equities-funds", "name": "Equities & Funds" },
      "publishedAt": "2026-09-02T08:50:02.717Z",
      "link": "https://piqmarkets.com/story/shein-shares-slide-over-5-on-second-day-of-hong-kong-trading?utm_source=your-company&utm_medium=api&utm_campaign=partner-api"
    }
  ],
  "limit": 2,
  "offset": 0,
  "hasMore": true
}

image can be null. When hasMore is true, ask for the next page with offset + limit.

Get one story

GET /api/v1/stories/{id}

{id} is a story's id, or the slug from its link. Returns a single story in the same shape as the list items above.

Rate limits and quotas

Each key has its own limits:

  • a per-minute rate limit
  • a daily quota (resets at 00:00 UTC)
  • a monthly quota (resets on the 1st, 00:00 UTC)

Responses tell you where you stand, for each limit your key has:

HeaderMeaning
X-RateLimit-LimitRequests allowed per minute
X-RateLimit-RemainingRequests left in the current minute
X-Quota-Daily-RemainingRequests left today
X-Quota-Monthly-RemainingRequests left this month

Going over a limit returns 429 Too Many Requests with a Retry-After header, in seconds:

{ "error": "rate_limited", "retryAfterSeconds": 12 }
{
  "error": "quota_exceeded",
  "scope": "daily",
  "resetAt": "2026-09-22T00:00:00.000Z"
}

Requests rejected with a 429 don't count toward your quota. Stories change every few minutes, so polling once a minute is plenty. Responses are cached for up to 30 seconds.

Errors

Errors come back with an HTTP status and a JSON body like { "error": "code" }.

StatusCodeMeaning
400unknown_categoryA category slug doesn't exist. Get the valid slugs from /categories.
400invalid_sincesince isn't a valid timestamp.
401invalid_api_keyThe key is missing, wrong, or has been revoked.
401api_key_expiredThe key has passed its expiry date.
404not_foundNo story with that id or slug.
429rate_limitedPer-minute limit reached. Wait Retry-After seconds.
429quota_exceededDaily or monthly quota used up.
500internal_errorSomething went wrong on our side. Try again shortly.
© PiQ · The news that matters, on your cadence.AboutFAQAPITermsPrivacyDMCA