List notifications
The notification center (the bell) of the signed-in user in this workspace, newest first: notifications (id, event = postSent, postFailed, scheduledFail, weeklySummary or newComment, data with the facts of the event, link to where it leads, read, readAt and createdAt), unreadCount and next. A notification only exists if the panel preference for that event was on when it happened. Filters: unread (true), limit (1 to 50, default 20) and cursor (the next of the previous page). Kept for 30 days. An API key has no user and reads an empty list.
Authorization: Bearer praeko_… and X-Praeko-Contract: en. Always send both.Parameters
| Name | In | Description |
|---|---|---|
unread |
query | true returns only unread notifications. |
limit |
query | Items per page (1 to 50). Default: 20. |
cursor |
query | The next value of the previous page. |
Example
curl "https://praeko.app/v1/notifications" \
-H "Authorization: Bearer $PRAEKO_KEY" \
-H "X-Praeko-Contract: en"const res = await fetch("https://praeko.app/v1/notifications", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.PRAEKO_KEY}`,
"X-Praeko-Contract": "en",
},
});
console.log(res.status, await res.json());import { Praeko } from "@praeko/sdk";
const praeko = new Praeko({ url: "https://praeko.app", key: process.env.PRAEKO_KEY });
const resultado = await praeko.notifications.list();
console.log(resultado);import os
import requests
resp = requests.get(
"https://praeko.app/v1/notifications",
headers={
"Authorization": f"Bearer {os.environ['PRAEKO_KEY']}",
"X-Praeko-Contract": "en",
},
)
print(resp.status_code, resp.json())<?php
$ch = curl_init('https://praeko.app/v1/notifications');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("PRAEKO_KEY"),
'X-Praeko-Contract: en',
],
]);
$resposta = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $resposta, PHP_EOL;
curl_close($ch);package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://praeko.app/v1/notifications", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PRAEKO_KEY"))
req.Header.Set("X-Praeko-Contract", "en")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}require "net/http"
require "uri"
uri = URI("https://praeko.app/v1/notifications")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV['PRAEKO_KEY']}"
request["X-Praeko-Contract"] = "en"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }
puts response.code, response.bodyusing System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, "https://praeko.app/v1/notifications");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("PRAEKO_KEY"));
request.Headers.Add("X-Praeko-Contract", "en");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://praeko.app/v1/notifications"))
.header("Authorization", "Bearer " + System.getenv("PRAEKO_KEY"))
.header("X-Praeko-Contract", "en")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}http GET "https://praeko.app/v1/notifications" \
"Authorization: Bearer $PRAEKO_KEY" \
"X-Praeko-Contract: en"npm install @praeko/sdk (see SDK and CLI).Response
| Success status | When |
|---|---|
200 |
Success. |
{
"notifications": [
{
"id": "01KA3ZB6T8N2QW5XH0D7MV4CRE",
"event": "postFailed",
"data": {
"event": "post.failed",
"title": "The test that only failed on Mondays",
"network": "youtube",
"error": "YouTube rejected the video (daily quota exceeded)",
"postId": "01KA3W2Y6H1RC5ZQ8M0T4VXE7N"
},
"link": {
"type": "post",
"id": "01KA3W2Y6H1RC5ZQ8M0T4VXE7N"
},
"read": false,
"createdAt": "2026-11-07T14:02:11.482Z"
},
{
"id": "01KA3Z5H2C9JR7TQ0M4XB8VNDF",
"event": "newComment",
"data": {
"count": 3,
"author": "Ana",
"text": "Great video, which editor do you use?",
"videoId": "dQw4w9WgXcQ",
"network": "youtube"
},
"link": {
"type": "comments"
},
"read": true,
"createdAt": "2026-11-07T14:02:11.482Z",
"readAt": "2026-11-07T14:30:00.000Z"
}
],
"unreadCount": 1
}data.error is free text the server writes in Portuguese; the example shows it in English.
Errors
| Status | code | When |
|---|---|---|
| 422 | invalid_field |
limit outside 1 to 50, unread that is not true/false, or an invalid cursor. |
Errors on any route
| Status | code | When |
|---|---|---|
| 401 | unauthorized |
The Authorization: Bearer … header is missing. |
| 401 | invalid_api_key |
The key does not exist. |
| 401 | revoked_api_key |
The key has been revoked. |
| 401 | expired_api_key |
The key has expired. |
| 403 | forbidden |
The key's scope is not enough for this route (see the scope badge). |
| 429 | rate_limited |
The per-minute request limit was exceeded. |
The body of every error is { "error": { "code", "message", "details"? } }. See all error codes.
Try it
The live test uses your key and your account. It stays off when you are not signed in.