Developers
Website open data API
The ALISE website publishes its knowledge graph as open data: every component, framework layer, capability, industry and article, and how they relate. Read it as JSON, download it as RDF (Turtle, JSON-LD) or query it with SPARQL.
Base URLhttps://alise.systems
Overview
- Base URL:
https://alise.systems. All endpoints are read only. - No authentication and no API key. Please keep requests reasonable; there is no rate limit yet.
- Format: JSON in UTF-8 unless an endpoint says otherwise. Field names are stable; new fields may be added, so ignore fields you do not know.
- CORS: every
/api/endpoint can be called from any website (Access-Control-Allow-Origin: *). - Caching: graph responses may be cached for 5 minutes (
Cache-Control: max-age=300).
Languages
Labels and descriptions exist in English (en), German (de) and French (fr). Choose one
with the lang query parameter or the standard Accept-Language header. Without either, the
answer is in English. Texts that have no translation fall back to English.
curl -s "https://alise.systems/api/concept/leto?lang=de"
curl -s -H "Accept-Language: fr" "https://alise.systems/api/concept/leto"
Identifiers
Every resource has a short id (leto, layer-integration, blog:json-api-documentation)
and a full IRI (https://w3.alise.systems/id/leto). Ids are used in URLs of this API and
of the website (/concept/leto). In SPARQL these prefixes are predeclared:
| Prefix | Namespace |
|---|---|
alise: |
https://w3.alise.systems/ontology# (types and relations) |
id: |
https://w3.alise.systems/id/ (resources) |
schema: |
https://schema.org/ |
rdf:, rdfs:, owl:, xsd: |
the W3C standard vocabularies |
Errors
Errors use the HTTP status code and a JSON body.
| Status | Meaning |
|---|---|
400 |
The request is invalid, for example a SPARQL syntax error. The body has an error message. |
404 |
There is no resource with this id. |
5xx |
Something failed on our side. Try again later. |
{ "error": "Lexical error at line 1, column 7. Encountered: ' ' (32), after prefix \"SELEKT\"" }
Knowledge graph
Get the graph
Nodes, relations and node types, ready for a graph visualisation.
GET
/api/graph
Returns all resources of the knowledge graph as nodes, the relations between them as
links and the types that occur. With focus, only the neighbourhood of one node is
returned. This is what the graph explorer on this site uses.
Parameters
-
focusstring query Id of a node. Only nodes within
depthrelations of it are returned.-
depthinteger query default2 With
focus: how many relations away from the focus node to include, 1 to 4.-
articlesboolean query defaulttrue Include blog articles as nodes.
-
langstring query defaulten Language of labels and descriptions:
en,deorfr.
Response application/json
nodes[]arrayResources:
id,label,typeandtypeLabel,color,icon,description,url(page on this site) anddegree(number of relations).links[]arrayRelations:
sourceandtarget(node ids),predicate(relation id) andlabel.types[]arrayNode types that occur:
id,label,color,icon,orderandcount.
curl -s -G "https://alise.systems/api/graph" \
--data-urlencode 'focus=charon' \
--data-urlencode 'depth=1' \
--data-urlencode 'articles=false'
const params = new URLSearchParams({
focus: "charon",
depth: "1",
articles: "false",
});
const response = await fetch(`https://alise.systems/api/graph?${params}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
import requests
response = requests.get(
"https://alise.systems/api/graph",
params={
"focus": "charon",
"depth": "1",
"articles": "false",
},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/api/graph?"
+ "focus=" + URLEncoder.encode("charon", UTF_8)
+ "&depth=" + URLEncoder.encode("1", UTF_8)
+ "&articles=" + URLEncoder.encode("false", UTF_8);
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/json")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
{
"nodes": [
{
"id": "charon",
"label": "CHARON",
"type": "Component",
"typeLabel": "Component",
"color": "#4f7bff",
"icon": "sync",
"description": "The Independent Data Synchronizer. It operates autonomously …",
"url": "/concept/charon",
"degree": 4
},
…
],
"links": [
{ "source": "charon", "target": "leto", "predicate": "synchronizes", "label": "synchronizes with" },
…
],
"types": [
{ "id": "Component", "label": "Component", "color": "#4f7bff", "icon": "cpu", "order": 2, "count": 1 },
…
]
}
Get a concept
One resource with all its relations, in both directions.
GET
/api/concept/{id}
Returns one concept of the graph (a component, layer, capability, service, industry, system category or topic) with its outgoing and incoming relations and the articles about it. Articles themselves are not concepts; read them with Get the graph.
Parameters
-
idstring path required Id of the concept, for example
leto,layer-integrationorindustry-biotech.-
langstring query defaulten Language of labels and descriptions:
en,deorfr.
Response application/json
nodeobjectThe concept, with the same fields as a node of the graph.
iristringFull IRI of the concept.
outgoing[]arrayRelations from this concept:
predicate,labeland thenodeon the other side.incoming[]arrayRelations to this concept, in the same form.
includes[]arrayFor services: what the service includes.
articles[]arrayBlog articles about this concept, as nodes.
Errors
404No concept with this id.
curl -s "https://alise.systems/api/concept/charon"
const response = await fetch("https://alise.systems/api/concept/charon");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
import requests
response = requests.get(
"https://alise.systems/api/concept/charon",
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/api/concept/charon";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/json")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
{
"node": { "id": "charon", "label": "CHARON", "type": "Component", … },
"iri": "https://w3.alise.systems/id/charon",
"outgoing": [
{
"predicate": "provides",
"label": "provides",
"node": { "id": "data-sync", "label": "Data synchronization", "type": "Capability", … }
},
…
],
"incoming": [ … ],
"includes": [],
"articles": []
}
Download as Turtle
The complete graph as RDF in Turtle syntax.
GET
/api/graph.ttl
The whole knowledge graph, including all languages and the blog articles, as RDF in Turtle. Load it into any RDF store or library (Apache Jena, rdflib, RDF4J …).
Response text/turtle
curl -s "https://alise.systems/api/graph.ttl"
const response = await fetch("https://alise.systems/api/graph.ttl");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const text = await response.text();
console.log(text);
import requests
response = requests.get(
"https://alise.systems/api/graph.ttl",
timeout=30,
)
response.raise_for_status()
print(response.text)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/api/graph.ttl";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "text/turtle")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
PREFIX alise: <https://w3.alise.systems/ontology#>
PREFIX id: <https://w3.alise.systems/id/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
…
id:charon rdf:type alise:Component;
rdfs:label "CHARON";
alise:synchronizes id:leto;
…
Download as JSON-LD
The complete graph as RDF in JSON-LD.
GET
/api/graph.jsonld
The same RDF graph as JSON-LD, for tools that prefer JSON.
Response application/ld+json
curl -s "https://alise.systems/api/graph.jsonld"
const response = await fetch("https://alise.systems/api/graph.jsonld");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
import requests
response = requests.get(
"https://alise.systems/api/graph.jsonld",
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/api/graph.jsonld";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/ld+json")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
{
"@graph": [
{
"@id": "alise:Topic",
"rdfs:label": [
{ "@language": "fr", "@value": "Sujet" },
…
]
},
…
]
}
Query
Run a SPARQL query
Ask the knowledge graph anything, in the standard query language of RDF.
GET
/api/sparql
Runs a read only SPARQL 1.1 query: SELECT,
ASK, CONSTRUCT or DESCRIBE. The prefixes listed under Identifiers
are predeclared. At most 1000 rows are returned and a query may run for 5 seconds.
Try queries interactively in the SPARQL playground.
Long queries can also be sent as POST, either form encoded (query=…) or as the
request body with Content-Type: application/sparql-query.
Parameters
-
querystring query required The SPARQL query, at most 5000 characters.
Response application/json
kindstringSELECT,ASK,CONSTRUCTorDESCRIBE.vars[]arrayColumn names. For
CONSTRUCTandDESCRIBE:subject,predicate,object.rows[]arrayOne object per result row, keyed by column name. IRIs are shortened with the prefixes (
id:leto); language tagged texts end with@de.askbooleanThe answer of an
ASKquery, otherwisenull.elapsedMsintegerTime the query took.
truncatedbooleantruewhen the result had more than 1000 rows and was cut.
Errors
400Syntax error, unsupported query (updates are not allowed) or query too long.
errorexplains why.
curl -s -G "https://alise.systems/api/sparql" \
--data-urlencode 'query=SELECT ?component ?label WHERE { ?component a alise:Component ; rdfs:label ?label } ORDER BY ?label'
const params = new URLSearchParams({
query: "SELECT ?component ?label WHERE { ?component a alise:Component ; rdfs:label ?label } ORDER BY ?label",
});
const response = await fetch(`https://alise.systems/api/sparql?${params}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
import requests
response = requests.get(
"https://alise.systems/api/sparql",
params={
"query": "SELECT ?component ?label WHERE { ?component a alise:Component ; rdfs:label ?label } ORDER BY ?label",
},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/api/sparql?"
+ "query=" + URLEncoder.encode("SELECT ?component ?label WHERE { ?component a alise:Component ; rdfs:label ?label } ORDER BY ?label", UTF_8);
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/json")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
{
"kind": "SELECT",
"vars": ["component", "label"],
"rows": [
{ "component": "id:aglaia", "label": "AGLAIA" },
{ "component": "id:charon", "label": "CHARON" },
{ "component": "id:hephaistos", "label": "HEPHAISTOS" },
{ "component": "id:leto", "label": "LETO" }
],
"ask": null,
"elapsedMs": 12,
"truncated": false
}
Feeds and status
Blog feed
The latest 30 articles as RSS 2.0.
GET
/blog/feed.xml
Subscribe in a feed reader or poll it to show the latest articles elsewhere.
Response application/rss+xml
curl -s "https://alise.systems/blog/feed.xml"
const response = await fetch("https://alise.systems/blog/feed.xml");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const text = await response.text();
console.log(text);
import requests
response = requests.get(
"https://alise.systems/blog/feed.xml",
timeout=30,
)
response.raise_for_status()
print(response.text)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/blog/feed.xml";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/rss+xml")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
<rss version="2.0">
<channel>
<title>ALISE.Systems Blog</title>
<item><title>Your Organization Is Using AI. Here Are 10 Things to Check …</title>
<link>https://w3.alise.systems/blog/your-organization-is-using-ai-…</link>
<pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate> … </item>
…
Sitemap
Every page of the site, for search engines and crawlers.
GET
/sitemap.xml
Response application/xml
curl -s "https://alise.systems/sitemap.xml"
const response = await fetch("https://alise.systems/sitemap.xml");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const text = await response.text();
console.log(text);
import requests
response = requests.get(
"https://alise.systems/sitemap.xml",
timeout=30,
)
response.raise_for_status()
print(response.text)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/sitemap.xml";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/xml")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://w3.alise.systems/</loc></url>
<url><loc>https://w3.alise.systems/concept/leto</loc></url>
…
Health
Whether the site is up, for monitoring.
GET
/actuator/health
Response application/json
curl -s "https://alise.systems/actuator/health"
const response = await fetch("https://alise.systems/actuator/health");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
import requests
response = requests.get(
"https://alise.systems/actuator/health",
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public static void main(String[] args) throws Exception {
String url = "https://alise.systems/actuator/health";
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.header("Accept", "application/json")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
{ "status": "UP", "groups": ["liveness", "readiness"] }