Skip to content

Migrating from Quantexa (Aylien) News API

Replace /v6/news/stories with /v1/news/everything. The OAuth token exchange disappears, per_page goes from 100 to 250, and the IPTC taxonomy is shared — but the Aylien Query Language, cursor paging and three of the five endpoints need rewriting rather than renaming.

Before you start: the API is not reachable

docs.aylien.com and api.aylien.com no longer resolveNXDOMAIN on both, checked against Cloudflare's resolver on 27 July 2026. Their status page still reads "All Systems Operational", so the public health indicator disagrees with DNS.

There is no formal end-of-life announcement; only the February 2023 acquisition, the rebrand from AYLIEN News API to Quantexa News API, and the company's own note that some previously well-served use cases are "no longer as strong a fit".

The mapping below is therefore derived from the official v6 documentation as archived on 19 June 2025. The APITube side was executed against the live API.

Why teams switch

Quantexa News API v6APITube
AvailabilityDomains do not resolveLive
Per request100 stories250
PagingCursor (next_page_cursor)page + per_page
AuthOAuth bearer tokenX-API-Key header, no exchange
Sentimentpositive / neutral / negative labelSigned score per axis, plus per entity
CategoriesIPTC MediaTopics + IABIPTC MediaTopics
Rate limit60/minute50/minute paid, 10/minute free

Your first request

bash
# Quantexa v6 (documented form — the host no longer resolves)
curl "https://api.aylien.com/v6/news/stories?title=tesla&language=en&per_page=100" \
  -H "Authorization: Bearer YOUR_TOKEN"
bash
# APITube
curl "https://api.apitube.io/v1/news/everything?title=tesla&language.code=en&per_page=100" \
  -H "X-API-Key: YOUR_API_KEY"

AQL entity blocks become parameters

Quantexa put entity filters inside aql as entities:{{ ... }} blocks in a Lucene-like syntax. APITube has no query language of that shape, so each condition becomes a plain parameter:

AQL conditionAPITube
surface_forms.text + type:Personperson.name
surface_forms.text + type:Organizationorganization.name
surface_forms.text + type:Locationlocation.name
stock_tickerno ticker filter exists
overall_prominence, overall_frequency— not filterable (frequency is in the response)
links.wikidata— not filterable (the link is in the response)
type: alone— APITube filters by named entity, not by type

Names resolve against an index: organization.name=Apple works, Apple Inc returns 400 ER0220; location.name=New York City works, New York returns 400 ER0218. The endpoint that used to be /v2/autocomplete/suggestions/entity-names is now /v1/suggest/entities?prefix=.

Parameter mapping

QuantexaAPITubeNote
titletitleLossless
texttitleNarrows — Quantexa matched title and body
bodyNo body-text search
aqlperson.name / organization.name / location.nameSee above
categories (IPTC)category.idSame numbers, medtop: prefix
categories (IAB)No IAB taxonomy
industriesindustry.idDifferent id spaces — verify each value
source.domainsource.domainMax 3
source.nameDoes not exist — sending it returns the whole index
source.idsource.idDifferent id spaces; remap through the domain
source.locations.countrysource.country.code
source.scopes.*No editorial-scope filter
source.rankings.alexa.ranksource.rank.oprAlexa is discontinued; different scale
author.nameauthor.nameDesk names return 400 ER0204
sentiment.title.polaritysentiment.title.score.min / .maxLabel → score band
published_at [* TO *]published_at.start / .endRange becomes two parameters
languagelanguage.codeNo ru, no uk
per_pageper_page100 → 250
cursorpageCursor paging → page numbers
sort_by=relevanceReturns 500 ER0183 with a search term
return[]No field selection

The full table is in the migration kit.

Categories are asymmetric — worth knowing before you debug it

Filtering wants the code with a prefix: category.id=medtop:04000000.

The response puts an internal number on id and hides the IPTC code in links.self:

json
{
  "id": 199,
  "name": "economy, business and finance",
  "taxonomy": "iptc_mediatopics",
  "links": { "self": ".../iptc_mediatopics/medtop:04000000" }
}

Child codes are the other catch. APITube holds 1 085 codes, but its children sit almost entirely in the 20000xxx branch, so codes from other branches fail:

bash
# 400 ER0206 "category with ID 'medtop:01005000' not found."
curl "https://api.apitube.io/v1/news/everything?api_key=YOUR_API_KEY&category.id=medtop%3A01005000"

Top-level codes are a mechanical rename; check each child code and fall back to its parent where missing.

Three endpoints need rebuilding

Quantexa v6APITube
/v6/news/stories/v1/news/everything
/v6/news/trends/v1/news/trends — adds growth_rate
/v6/news/histogramsRepeated /v1/news/count, one call per bucket
/v6/news/time_seriesRepeated /v1/news/count
/v6/news/clustersNothing

APITube has no interval aggregation, so a daily series is one count call per day. And clustering has no server-side counterpart at all: every article carries story.id and articles on the same story share it, but there is no cluster endpoint, no story_count, no earliest_story / latest_story, and story.id is not a filter. Grouping moves into your code.

What does not carry over

Body search. No body= parameter, and unknown parameters are ignored silently — a forwarded one returns the whole index with a 200.

Sentiment as a label. Quantexa filtered on positive / neutral / negative; APITube on a signed score. The boundary between them is a judgement call to re-tune, not arithmetic.

Cursor paging. Real Quantexa cursors cannot be translated — they encode sort values from an index that no longer exists.

Russian and Ukrainian. 400 ER0237, no substitute.

What you gain

Sentiment towards each entity — which Quantexa did not offer, and which makes "coverage of Tesla excluding the negative" a single filter (entity.sentiment.score.min). Plus sentiment.overall, topic and industry axes alongside IPTC, publisher political bias and Open Page Rank, readability scores, 250 articles per request, growth_rate on trends, and export to eight formats.

Next steps