DI APIdi.se ↗
Fetch Swedish financial news from di.se. List latest headlines, retrieve full article text, authors, sections, and access levels via 3 endpoints.
What is the DI API?
The DI.se API provides structured access to Swedish financial and business news from di.se across 3 endpoints. Use list_latest_articles to pull a feed of the newest headlines with publication times and canonical URLs, get_latest_article to retrieve the full text of the most recent publicly available article, or get_article to fetch any specific di.se article by URL — returning fields like title, lead, paragraphs, authors, section, access, and ISO 8601 timestamps.
curl -X GET 'https://api.parse.bot/scraper/18600680-83c5-4418-86c0-529797431b3a/get_latest_article?free_only=true' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace di-se-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: di.se articles SDK — list headlines, drill into full text."""
from parse_apis.di_se_api import DiSe, ArticleNotFound
client = DiSe()
# List the latest headline summaries from di.se's news feed.
for summary in client.article_summaries.list(limit=5):
print(summary.title, "|", summary.author)
# Drill into the newest summary to read the full article.
summary = client.article_summaries.list(limit=1).first()
if summary is not None:
article = summary.details()
print(article.title, article.section, article.access)
print(article.lead)
for para in article.paragraphs[:3]:
print(para)
# Fetch the latest freely readable article directly.
latest_free = client.articles.latest(free_only=True)
print(latest_free.title, "|", latest_free.published)
# Point-lookup by URL with typed error handling.
try:
article = client.articles.get(url="https://www.di.se/nyheter/example-article/")
except ArticleNotFound:
print("Article not found at that URL")
print("exercised: article_summaries.list / details / articles.latest / articles.get")
Returns the newest article on di.se as one record with its whole text. The newest article is taken from the site's public news feed (newest publication time first, TV programme entries excluded) and its page is fetched to extract the headline, lead, body paragraphs and a joined full_text. Many di.se articles are restricted: access is 'free' (body public), 'login_required' (body needs a free account) or 'subscription' (body needs a paid subscription); for restricted articles paragraphs is empty, body_available is false and full_text contains only the lead. With free_only=true the endpoint walks the feed (up to 20 newest entries, one page fetch each) and returns the newest article whose body is publicly readable; if none of the 20 is free the record comes back with null title/url and articles_skipped=20. articles_skipped counts feed entries passed over before the returned one. Timestamps are ISO 8601 with the site's Europe/Stockholm offset.
| Param | Type | Description |
|---|---|---|
| free_only | boolean | When true, return the newest article whose full body is publicly readable instead of the very newest entry regardless of access level. |
{
"type": "object",
"fields": {
"id": "site article id (UUID string) from the news feed",
"url": "canonical article URL on www.di.se; accepted unchanged by get_article",
"lead": "lead paragraph (ingress), null if absent",
"title": "headline",
"access": "free | login_required | subscription (null when no article was returned)",
"authors": "array of author/byline names",
"section": "site section label (e.g. Ledare, Live, Nyheter)",
"summary": "feed description of the article",
"modified": "ISO 8601 last-modified time",
"full_text": "lead + paragraphs joined with blank lines",
"published": "ISO 8601 publication time",
"paragraphs": "array of body paragraph/heading strings in reading order (empty when the body is restricted)",
"body_available": "boolean, true when body paragraphs were extracted",
"articles_skipped": "integer count of newer feed entries skipped (only >0 with free_only=true)"
},
"sample": {
"data": {
"id": "4531601f-c30b-43c5-bec4-a0f56fd3c97f",
"url": "https://www.di.se/ledare/gretas-smasyskon-drar-hogerut/",
"lead": "Förstagångsväljarna röstade i ännu större grad än hela väljarkåren på att annat sätt än vad prognosmakarna hade väntat sig.",
"title": "Gretas småsyskon drar högerut",
"access": "free",
"authors": [
"Erik Zsiga"
],
"section": "Ledare",
"summary": "Förstagångsväljarna röstade i ännu större grad än hela väljarkåren på att annat sätt än vad prognosmakarna hade väntat sig.",
"modified": "2026-09-30T10:58:25.448+02:00",
"full_text": "Förstagångsväljarna röstade i ännu större grad än hela väljarkåren på att annat sätt än vad prognosmakarna hade väntat sig.\n\nBland förstagångsväljarna blev Moderaterna största parti för tredje valet i rad.\n\nS blev näst största parti, men får bara var femte röst.",
"published": "2026-09-30T10:45:04.297+02:00",
"paragraphs": [
"Bland förstagångsväljarna blev Moderaterna största parti för tredje valet i rad.",
"S blev näst största parti, men får bara var femte röst."
],
"body_available": true,
"articles_skipped": 11
},
"status": "success"
}
}About the DI API
What the API Returns
All three endpoints surface article-level data from Dagens Industri (di.se), Sweden's leading financial and business newspaper. The list_latest_articles endpoint returns an array of up to ~20 feed entries sorted newest first. Each entry includes id, title, description, url, published, and author. TV programme entries are excluded. There is no pagination — one request returns the full current feed.
Fetching Article Content
get_article accepts any url on www.di.se and returns title, lead, paragraphs (an ordered array of body text strings), full_text (lead and paragraphs joined with blank lines), authors, section, published, modified, and access. The access field takes one of three values: free, login_required, or subscription. Full body text (paragraphs, full_text) is populated only when access is free; for restricted articles, those fields return empty and you still receive headline, lead, and metadata.
Getting the Newest Article Directly
get_latest_article combines feed lookup and content fetching in a single call. By default it returns the very newest article regardless of access level. Set the optional free_only parameter to true to skip past paywalled entries and return the newest article whose body is fully readable. The response shape is identical to get_article plus a summary field from the feed and the article's id.
Coverage Notes
All content is in Swedish. Sections vary and are surfaced as-is from the site (e.g. Ledare, Nyheter, Live). Article IDs are UUID strings from the news feed and are stable identifiers for deduplication. The url returned by any endpoint is the canonical www.di.se URL and can be passed directly to get_article.
The DI API is a managed, monitored endpoint for di.se — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when di.se changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official di.se API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor di.se for breaking Swedish financial news by polling
list_latest_articlesand filtering onpublishedtimestamps. - Build a Swedish business news digest by collecting
full_textfromfreearticles viaget_latest_articlewithfree_only: true. - Track which di.se articles require a subscription versus which are openly readable using the
accessfield. - Index di.se article metadata — headline, authors, section, publication time — into a search or analytics database.
- Detect byline frequency and editorial focus by aggregating
authorsandsectionfields acrosslist_latest_articlesresults. - Archive publicly available article bodies with
paragraphsarrays fromget_articlefor NLP or sentiment analysis on Swedish financial content.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does di.se have an official public developer API?+
What does the `access` field tell me, and does the API return full text for paywalled articles?+
access field returns one of three values: free, login_required, or subscription. Full body text — the paragraphs array and full_text string — is only populated when access is free. For login_required and subscription articles, the API returns title, lead, authors, section, and timestamps, but paragraphs is empty.