Skip to content

Migrating from Quantexa (Aylien) News API ​

Replace /v6/news/stories with /v1/news/everything. Use an API key instead of an OAuth token. Rewrite Aylien Query Language filters and cursor pagination using the mappings below.

Before you start: the API is not reachable ​

docs.aylien.com and api.aylien.com no longer resolve — NXDOMAIN 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 ​

Convert entity conditions in aql entities:{{ ... }} blocks to separate API parameters:

AQL conditionAPITube
surface_forms.text + type:Personperson.name
surface_forms.text + type:Organizationorganization.name
surface_forms.text + type:Locationlocation.name
stock_ticker— no 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
body—No 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.name—Does 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 (10 on Free, 50 on Starter, 200 on Basic)
cursorpageCursor paging → page numbers
sort_by=relevance—Returns 500 ER0183 with a search term
return[]—No field selection

The full table is in the migration kit.

Category IDs differ between filters and responses ​

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

Response IDs differ. The category id is numeric; the IPTC code appears in links.self:

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

APITube lists 1,085 category codes. Most child categories use codes in the 20000xxx range. Check each child code before using it; codes from other branches may be unavailable:

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 interval
/v6/news/time_seriesRepeated /v1/news/count
/v6/news/clustersNothing

To build a daily series, call /v1/news/count once for each day. APITube does not return counts by time interval from a single request.

APITube also has no endpoint for article clusters. Articles about the same story share story.id, so group them in your code. There is no story_count, earliest_story or latest_story field, and story.id cannot be used as a filter.

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 filters on positive, neutral or negative; APITube uses a numeric score. Choose score thresholds for each label, check the returned articles and adjust them. There is no exact conversion.

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 ​

APITube includes sentiment about each entity, using filters such as entity.sentiment.score.min, as well as overall sentiment. It also provides topics and industries alongside IPTC categories, publisher bias and rank, readability, growth_rate for trends and eight export formats. Page sizes depend on your plan: 10 on Free, 50 on Starter, 200 on Basic and up to 250 on higher plans.

Next steps ​