OpenGov Public API

Τεκμηρίωση των δημόσιων REST API endpoints για πρόσβαση σε διαβουλεύσεις, σχόλια και πληροφορίες φορέων.

Τι είναι το OpenGov API;

Το OpenGov Public API παρέχει δωρεάν, ανοικτή πρόσβαση στα δεδομένα των δημόσιων διαβουλεύσεων της Ελληνικής Κυβέρνησης. Μέσα από απλές HTTP κλήσεις μπορείτε να ανακτήσετε διαβουλεύσεις, σχόλια πολιτών και πληροφορίες φορέων σε μορφή JSON, χωρίς εγγραφή ή κλειδί αυθεντικοποίησης.

Το API ακολουθεί τις αρχές του REST και είναι συμβατό με οποιαδήποτε γλώσσα προγραμματισμού ή πλατφόρμα υποστηρίζει HTTP. Παρακάτω θα βρείτε αναλυτική τεκμηρίωση για κάθε διαθέσιμο endpoint, με παραδείγματα κλήσεων σε Python, JavaScript, PHP, .NET και Flutter.

Ανοικτή πρόσβαση — Δεν απαιτείται εγγραφή ή API key για τα public endpoints.
Multisite — Κάθε φορέας έχει μοναδικό site_id. Χρησιμοποιήστε τον πίνακα παρακάτω.
Σελιδοποίηση — Τα αποτελέσματα επιστρέφονται σελιδοποιημένα μέσω page & per_page.
Base URL
https://opengov.gr/wp-json/opengov/v1
Λήψη Postman Collection

Πολλά endpoints απαιτούν παράμετρο site_id. Παρακάτω βρίσκεται η λίστα όλων των ενεργών φορέων του δικτύου με τα αντίστοιχα IDs τους.

site_id Φορέας Κωδικός URL Διαβουλεύσεις
33 ΥΠΟΥΡΓΕΙΟ ΕΘΝΙΚΗΣ ΟΙΚΟΝΟΜΙΑΣ ΚΑΙ ΟΙΚΟΝΟΜΙΚΩΝ 83842 https://opengov.gr/minfin 0
36 ΥΠΟΥΡΓΕΙΟ ΕΞΩΤΕΡΙΚΩΝ 21705 https://opengov.gr/mfa 0
32 ΥΠΟΥΡΓΕΙΟ ΕΘΝΙΚΗΣ ΑΜΥΝΑΣ 43269 https://opengov.gr/modmil 0
29 ΥΠΟΥΡΓΕΙΟ ΕΣΩΤΕΡΙΚΩΝ 46278 https://opengov.gr/ypes 0
41 ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΘΡΗΣΚΕΥΜΑΤΩΝ ΚΑΙ ΑΘΛΗΤΙΣΜΟΥ 40151 https://opengov.gr/minedu 0
46 ΥΠΟΥΡΓΕΙΟ ΥΓΕΙΑΣ 19476 https://opengov.gr/moh 0
51 ΥΠΟΥΡΓΕΙΟ ΠΡΟΣΤΑΣΙΑΣ ΤΟΥ ΠΟΛΙΤΗ 23371 https://opengov.gr/minocp 1
47 ΥΠΟΥΡΓΕΙΟ ΥΠΟΔΟΜΩΝ ΚΑΙ ΜΕΤΑΦΟΡΩΝ 33281 https://opengov.gr/yme 0
42 ΥΠΟΥΡΓΕΙΟ ΠΕΡΙΒΑΛΛΟΝΤΟΣ ΚΑΙ ΕΝΕΡΓΕΙΑΣ 54032 https://opengov.gr/ypen 2
28 ΥΠΟΥΡΓΕΙΟ ΑΝΑΠΤΥΞΗΣ 49073 https://opengov.gr/mindev 0
35 ΥΠΟΥΡΓΕΙΟ ΕΡΓΑΣΙΑΣ ΚΑΙ ΚΟΙΝΩΝΙΚΗΣ ΑΣΦΑΛΙΣΗΣ 80136 https://opengov.gr/ypergasias 1
31 ΥΠΟΥΡΓΕΙΟ ΔΙΚΑΙΟΣΥΝΗΣ 99487 https://opengov.gr/ministryofjustice 1
43 ΥΠΟΥΡΓΕΙΟ ΠΟΛΙΤΙΣΜΟΥ 45100 https://opengov.gr/culture 1
39 ΥΠΟΥΡΓΕΙΟ ΜΕΤΑΝΑΣΤΕΥΣΗΣ ΚΑΙ ΑΣΥΛΟΥ 56992 https://opengov.gr/migration 0
52 ΥΠΟΥΡΓΕΙΟ ΚΟΙΝΩΝΙΚΗΣ ΣΥΝΟΧΗΣ ΚΑΙ ΟΙΚΟΓΕΝΕΙΑΣ 96352 https://opengov.gr/minscfa 0
30 ΥΠΟΥΡΓΕΙΟ ΑΓΡΟΤΙΚΗΣ ΑΝΑΠΤΥΞΗΣ ΚΑΙ ΤΡΟΦΙΜΩΝ 85324 https://opengov.gr/minagric 0
40 ΥΠΟΥΡΓΕΙΟ ΝΑΥΤΙΛΙΑΣ ΚΑΙ ΝΗΣΙΩΤΙΚΗΣ ΠΟΛΙΤΙΚΗΣ 29883 https://opengov.gr/ynanp 0
45 ΥΠΟΥΡΓΕΙΟ ΤΟΥΡΙΣΜΟΥ 95496 https://opengov.gr/mintour 0
48 ΥΠΟΥΡΓΕΙΟ ΨΗΦΙΑΚΗΣ ΔΙΑΚΥΒΕΡΝΗΣΗΣ 66797 https://opengov.gr/mindigital 0
37 ΥΠΟΥΡΓΕΙΟ ΚΛΙΜΑΤΙΚΗΣ ΚΡΙΣΗΣ ΚΑΙ ΠΟΛΙΤΙΚΗΣ ΠΡΟΣΤΑΣΙΑΣ 12403 https://opengov.gr/civilprotection 1
72 Αντιπρόεδρος της Κυβέρνησης και Υπουργός Επικρατείας https://opengov.gr/vicepresident 0
73 Υπουργός Επικρατείας https://opengov.gr/ypep 0
97 Υφυπουργός στον Πρωθυπουργό και Κυβερνητικός Εκπρόσωπος https://opengov.gr/ke 0
96 Υφυπουργός στον Πρωθυπουργό https://opengov.gr/dmttpm 0
62 Γενική Γραμματεία Νομικών και Κοινοβουλευτικών Θεμάτων https://opengov.gr/gengk 0
86 Γενική Γραμματεία Επικοινωνίας και Ενημέρωσης https://opengov.gr/ggee 0
61 ΠΕΡΙΦΕΡΕΙΑ ΚΡΗΤΗΣ 88709 https://opengov.gr/pcrete 0
74 ΠΕΡΙΦΕΡΕΙΑ ΑΝΑΤΟΛΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΚΑΙ ΘΡΑΚΗΣ 70051 https://opengov.gr/pamth 0
75 ΠΕΡΙΦΕΡΕΙΑ ΑΤΤΙΚΗΣ 70772 https://opengov.gr/patt 0
76 ΠΕΡΙΦΕΡΕΙΑ ΒΟΡΕΙΟΥ ΑΙΓΑΙΟΥ 87974 https://opengov.gr/pvaigaiou 0
77 ΠΕΡΙΦΕΡΕΙΑ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ 86197 https://opengov.gr/pde 0
78 ΠΕΡΙΦΕΡΕΙΑ ΔΥΤΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ 70606 https://opengov.gr/pdm 0
79 ΠΕΡΙΦΕΡΕΙΑ ΗΠΕΙΡΟΥ 18025 https://opengov.gr/php 0
80 ΠΕΡΙΦΕΡΕΙΑ ΘΕΣΣΑΛΙΑΣ 17108 https://opengov.gr/pthess 0
81 ΠΕΡΙΦΕΡΕΙΑ ΙΟΝΙΩΝ ΝΗΣΩΝ 50280 https://opengov.gr/pin 0
82 ΠΕΡΙΦΕΡΕΙΑ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ 65262 https://opengov.gr/pkm 0
83 ΠΕΡΙΦΕΡΕΙΑ ΝΟΤΙΟΥ ΑΙΓΑΙΟΥ 42622 https://opengov.gr/pnai 0
84 ΠΕΡΙΦΕΡΕΙΑ ΠΕΛΟΠΟΝΝΗΣΟΥ 93213 https://opengov.gr/ppel 0
85 ΠΕΡΙΦΕΡΕΙΑ ΣΤΕΡΕΑΣ ΕΛΛΑΔΑΣ 64326 https://opengov.gr/pste 0
87 ΑΝΕΞΑΡΤΗΤΗ ΑΡΧΗ ΔΗΜΟΣΙΩΝ ΕΣΟΔΩΝ 73401 https://opengov.gr/aade 0
88 ΕΝΙΑΙΑ ΑΡΧΗ ΔΗΜΟΣΙΩΝ ΣΥΜΒΑΣΕΩΝ (ΕΑΔΗΣΥ) 56981 https://opengov.gr/aads 0
89 ΕΛΛΗΝΙΚΗ ΡΑΔΙΟΦΩΝΙΑ ΤΗΛΕΟΡΑΣΗ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ (Ε.Ρ.Τ. Α.Ε.) 72297 https://opengov.gr/ert 0
90 Open Government Partnership https://opengov.gr/ogp 0
91 ΕΠΙΤΡΟΠΗ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ https://opengov.gr/ictc 0
92 ΕΠΙΤΡΟΠΗ ΕΠΟΠΤΕΙΑΣ ΚΑΙ ΕΛΕΓΧΟΥ ΠΑΙΓΝΙΩΝ 20379 https://opengov.gr/eeep 0
93 ΕΠΙΤΡΟΠΗ ΠΡΟΜΗΘΕΙΩΝ ΚΑΙ ΥΓΕΙΑΣ https://opengov.gr/epy 0
94 Πρώην Διοικητικής Ανασυγκρότησης https://opengov.gr/minreform 0
95 Πρώην Υπουργείο Μακεδονίας Θράκης https://opengov.gr/ymakthr 0
Γλώσσα:
GET
/opengov/v1/all-posts
Λίστα όλων των διαβουλεύσεων

Επιστρέφει λίστα όλων των δημοσιευμένων διαβουλεύσεων από όλους τους φορείς του δικτύου, ταξινομημένες χρονολογικά (νεότερες πρώτα). Ο συνολικός αριθμός και οι σελίδες επιστρέφονται μέσω HTTP headers.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 10 Αποτελέσματα ανά σελίδα (μέγιστο 100)
X-WP-Total Συνολικός αριθμός διαβουλεύσεων στο δίκτυο
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/all-posts", params={"page": 1, "per_page": 10})
r.raise_for_status()

total = r.headers.get("X-WP-Total")
pages = r.headers.get("X-WP-TotalPages")
data  = r.json()

print(f"Σύνολο: {total} διαβουλεύσεις ({pages} σελίδες)")
for d in data:
    print(f"  [{d['id']}] {d['title']}  —  {d['site_name']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res   = await fetch(`${BASE_URL}/all-posts?page=1&per_page=10`);
const total = res.headers.get("X-WP-Total");
const pages = res.headers.get("X-WP-TotalPages");
const data  = await res.json();

console.log(`Σύνολο: ${total} διαβουλεύσεις (${pages} σελίδες)`);
data.forEach(d => console.log(`[${d.id}] ${d.title}  —  ${d.site_name}`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$url      = $base_url . '/all-posts?' . http_build_query(['page' => 1, 'per_page' => 10]);

$body = file_get_contents($url); // populates $http_response_header
$data = json_decode($body, true);

// Ανάκτηση X-WP-Total από τα response headers
$total = '';
foreach ($http_response_header as $h) {
    if (stripos($h, 'X-WP-Total:') === 0) {
        $total = trim(substr($h, strlen('X-WP-Total:')));
    }
}

echo "Σύνολο: {$total} διαβουλεύσεις\n";
foreach ($data as $d) {
    echo "[{$d['id']}] {$d['title']}  —  {$d['site_name']}\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var url      = "%%BASE_URL%%/all-posts?page=1&per_page=10";
var response = await client.GetAsync(url);

response.EnsureSuccessStatusCode();

var total = response.Headers.GetValues("X-WP-Total").First();
var pages = response.Headers.GetValues("X-WP-TotalPages").First();
var json  = await response.Content.ReadAsStringAsync();
var data  = JsonSerializer.Deserialize<JsonElement[]>(json);

Console.WriteLine($"Σύνολο: {total} διαβουλεύσεις ({pages} σελίδες)");
foreach (var d in data!)
{
    Console.WriteLine($"  [{d.GetProperty("id")}] " +
                      $"{d.GetProperty("title").GetString()}  —  " +
                      $"{d.GetProperty("site_name").GetString()}");
}
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri = Uri.parse('%%BASE_URL%%/all-posts').replace(
  queryParameters: {'page': '1', 'per_page': '10'},
);

final response = await http.get(uri);
final total    = response.headers['x-wp-total'];
final pages    = response.headers['x-wp-totalpages'];
final data     = jsonDecode(response.body) as List<dynamic>;

print('Σύνολο: $total διαβουλεύσεις ($pages σελίδες)');
for (final d in data) {
  print('[${d['id']}] ${d['title']}  —  ${d['site_name']}');
}
GET
/opengov/v1/subsite-posts
Διαβουλεύσεις ανά φορέα

Επιστρέφει τις δημοσιευμένες διαβουλεύσεις ενός συγκεκριμένου φορέα (Υπουργείου ή άλλης αρχής). Απαιτείται η παράμετρος site_id — χρησιμοποιήστε τον πίνακα Site IDs για να βρείτε το ID του φορέα που σας ενδιαφέρει.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
site_id integer Ναι ID του φορέα (βλ. πίνακα Site IDs)
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 10 Αποτελέσματα ανά σελίδα (μέγιστο 100)
X-WP-Total Συνολικός αριθμός διαβουλεύσεων του φορέα
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

# Αντικαταστήστε το 5 με το πραγματικό site_id του φορέα
r = requests.get(f"{BASE_URL}/subsite-posts", params={
    "site_id":  5,
    "page":     1,
    "per_page": 10,
})
r.raise_for_status()

total = r.headers.get("X-WP-Total")
data  = r.json()

print(f"Διαβουλεύσεις φορέα: {total}")
for d in data:
    print(f"  [{d['id']}] {d['title']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";

// Αντικαταστήστε το 5 με το πραγματικό site_id του φορέα
const res   = await fetch(`${BASE_URL}/subsite-posts?site_id=5&page=1&per_page=10`);
const total = res.headers.get("X-WP-Total");
const data  = await res.json();

console.log(`Διαβουλεύσεις φορέα: ${total}`);
data.forEach(d => console.log(`[${d.id}] ${d.title}`));
PHP
<?php
$base_url = '%%BASE_URL%%';
// Αντικαταστήστε το 5 με το πραγματικό site_id του φορέα
$url = $base_url . '/subsite-posts?' . http_build_query([
    'site_id'  => 5,
    'page'     => 1,
    'per_page' => 10,
]);

$body = file_get_contents($url);
$data = json_decode($body, true);

foreach ($data as $d) {
    echo "[{$d['id']}] {$d['title']}\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
// Αντικαταστήστε το 5 με το πραγματικό site_id του φορέα
var url      = "%%BASE_URL%%/subsite-posts?site_id=5&page=1&per_page=10";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var data     = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var d in data!)
    Console.WriteLine($"[{d.GetProperty("id")}] {d.GetProperty("title").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

// Αντικαταστήστε το '5' με το πραγματικό site_id του φορέα
final uri = Uri.parse('%%BASE_URL%%/subsite-posts').replace(
  queryParameters: {'site_id': '5', 'page': '1', 'per_page': '10'},
);

final response = await http.get(uri);
final data     = jsonDecode(response.body) as List<dynamic>;

for (final d in data) {
  print('[${d['id']}] ${d['title']}');
}
GET
/opengov/v1/post/{id}
Λεπτομέρειες μιας διαβούλευσης

Επιστρέφει όλα τα στοιχεία μιας συγκεκριμένης διαβούλευσης βάσει του αναγνωριστικού της (id). Σε multisite περιβάλλον συνιστάται ανεπιφύλακτα η χρήση site_id: τα post IDs δεν είναι globally unique στο WordPress multisite, οπότε χωρίς site_id το σύστημα επιστρέφει την πρώτη διαβούλευση που βρίσκει με αυτό το ID σε οποιονδήποτε φορέα.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
id integer Ναι Αναγνωριστικό (ID) της διαβούλευσης (στο URL path)
site_id integer Ναι ID του φορέα (βλ. πίνακα Site IDs παρακάτω) — τα post IDs δεν είναι globally unique σε multisite
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"
post_id   = 1234   # αντικαταστήστε με το ID που θέλετε
site_id   = 5      # προαιρετικό — βελτιώνει ταχύτητα

r = requests.get(f"{BASE_URL}/post/{post_id}", params={"site_id": site_id})
r.raise_for_status()

d = r.json()
print(f"[{d['id']}] {d['title']}")
print(f"Φορέας: {d['site_name']}  |  Δημοσίευση: {d['date_gmt']}")
print(f"URL: {d['permalink']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";
const postId   = 1234;  // αντικαταστήστε με το ID που θέλετε
const siteId   = 5;     // προαιρετικό

const res  = await fetch(`${BASE_URL}/post/${postId}?site_id=${siteId}`);
const d    = await res.json();

console.log(`[${d.id}] ${d.title}`);
console.log(`Φορέας: ${d.site_name}  |  URL: ${d.permalink}`);
PHP
<?php
$base_url = '%%BASE_URL%%';
$post_id  = 1234; // αντικαταστήστε με το ID που θέλετε
$site_id  = 5;    // προαιρετικό

$url  = $base_url . '/post/' . $post_id . '?site_id=' . $site_id;
$data = json_decode(file_get_contents($url), true);

echo "[{$data['id']}] {$data['title']}\n";
echo "Φορέας: {$data['site_name']}  |  URL: {$data['permalink']}\n";
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client  = new HttpClient();
var postId  = 1234; // αντικαταστήστε με το ID που θέλετε
var siteId  = 5;    // προαιρετικό
var url     = $"%%BASE_URL%%/post/{postId}?site_id={siteId}";
var response = await client.GetAsync(url);
var json    = await response.Content.ReadAsStringAsync();
var d       = JsonSerializer.Deserialize<JsonElement>(json);

Console.WriteLine($"[{d.GetProperty("id")}] {d.GetProperty("title").GetString()}");
Console.WriteLine($"Φορέας: {d.GetProperty("site_name").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const postId = 1234; // αντικαταστήστε με το ID που θέλετε
const siteId = 5;    // προαιρετικό

final uri      = Uri.parse('%%BASE_URL%%/post/$postId?site_id=$siteId');
final response = await http.get(uri);
final d        = jsonDecode(response.body) as Map<String, dynamic>;

print('[${d['id']}] ${d['title']}');
print('Φορέας: ${d['site_name']}  |  URL: ${d['permalink']}');
GET
/opengov/v1/deliberation/{id}
Εκτεταμένες λεπτομέρειες διαβούλευσης

Επιστρέφει πλούσιο αντικείμενο με όλα τα πεδία ACF, την κατάσταση (ανοικτή/κλειστή), τον συνολικό αριθμό σχολίων και το endpoint για την ανάκτησή τους. Ιδανικό για εφαρμογές που χρειάζονται πλήρη μεταδεδομένα της διαβούλευσης.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
id integer Ναι Αναγνωριστικό (ID) της διαβούλευσης (στο URL path)
site_id integer Ναι ID του φορέα
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"
post_id   = 1234  # ID διαβούλευσης
site_id   = 5     # ID φορέα

r = requests.get(f"{BASE_URL}/deliberation/{post_id}", params={"site_id": site_id})
r.raise_for_status()

d = r.json()
print(f"Τίτλος:    {d['title']}")
print(f"Κατάσταση: {', '.join(d['status'])}")
print(f"Σχόλια:    {d['comments']['total']}")
print(f"Κατάσταση: {', '.join(d['status'])}")
JavaScript
const BASE_URL = "%%BASE_URL%%";
const postId   = 1234;  // ID διαβούλευσης
const siteId   = 5;     // ID φορέα

const res = await fetch(`${BASE_URL}/deliberation/${postId}?site_id=${siteId}`);
const d   = await res.json();

console.log(`Τίτλος:    ${d.title}`);
console.log(`Κατάσταση: ${d.status.join(', ')}`);
console.log(`Σχόλια:    ${d.comments.total}`);
console.log(`Endpoint σχολίων: ${d.comments.endpoint}`);
PHP
<?php
$base_url = '%%BASE_URL%%';
$post_id  = 1234; // ID διαβούλευσης
$site_id  = 5;    // ID φορέα

$url  = $base_url . '/deliberation/' . $post_id . '?site_id=' . $site_id;
$data = json_decode(file_get_contents($url), true);

echo "Τίτλος:  {$data['title']}\n";
echo "Κατάσταση: " . implode(', ', $data['status']) . "\n";
echo "Σχόλια:  {$data['comments']['total']}\n";
echo "Κατάσταση: " . implode(', ', $data['status']) . "\n";
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var postId   = 1234;
var siteId   = 5;
var url      = $"%%BASE_URL%%/deliberation/{postId}?site_id={siteId}";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var d        = JsonSerializer.Deserialize<JsonElement>(json);

Console.WriteLine($"Τίτλος:    {d.GetProperty("title").GetString()}");
Console.WriteLine($"Σχόλια:    {d.GetProperty("comments").GetProperty("total")}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const postId = 1234;
const siteId = 5;

final uri      = Uri.parse('%%BASE_URL%%/deliberation/$postId?site_id=$siteId');
final response = await http.get(uri);
final d        = jsonDecode(response.body) as Map<String, dynamic>;

print('Τίτλος:    ${d['title']}');
print('Κατάσταση: ${(d['status'] as List).join(', ')}');
print('Σχόλια:    ${d['comments']['total']}');
GET
/opengov/v1/post/{id}/comments
Σχόλια διαβούλευσης

Επιστρέφει τα εγκεκριμένα σχόλια μιας διαβούλευσης σε σελιδοποιημένη μορφή. Τα σχόλια ταξινομούνται χρονολογικά (παλαιότερα πρώτα). Το πεδίο author εμφανίζει το πλήρες όνομα μόνο αν ο χρήστης το έχει επιτρέψει — διαφορετικά εμφανίζεται «Ανώνυμος χρήστης». Το πεδίο comment_url δείχνει στη σελίδα προβολής του συγκεκριμένου σχολίου. Τα πεδία article_unique_id και article_title δείχνουν σε ποιο άρθρο/ενότητα της διαβούλευσης ανήκει το σχόλιο (θα είναι null για γενικά σχόλια χωρίς σύνδεση με συγκεκριμένο άρθρο).

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
id integer Ναι ID της διαβούλευσης (στο URL path)
site_id integer Ναι ID του φορέα
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 20 Σχόλια ανά σελίδα (μέγιστο 200)
X-WP-Total Συνολικός αριθμός σχολίων της διαβούλευσης
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"
post_id   = 1234  # ID διαβούλευσης
site_id   = 5     # ID φορέα

page = 1
all_comments = []

while True:
    r = requests.get(f"{BASE_URL}/post/{post_id}/comments", params={
        "site_id":  site_id,
        "page":     page,
        "per_page": 50,
    })
    r.raise_for_status()

    data        = r.json()
    total_pages = int(r.headers.get("X-WP-TotalPages", 1))
    all_comments.extend(data)

    if page >= total_pages:
        break
    page += 1

print(f"Σύνολο σχολίων: {len(all_comments)}")
for c in all_comments[:5]:
    print(f"  [{c['id']}] {c['author']}: {c['content'][:60]}...")
JavaScript
const BASE_URL = "%%BASE_URL%%";
const postId   = 1234;  // ID διαβούλευσης
const siteId   = 5;     // ID φορέα

const res      = await fetch(`${BASE_URL}/post/${postId}/comments?site_id=${siteId}&page=1&per_page=20`);
const total    = res.headers.get("X-WP-Total");
const pages    = res.headers.get("X-WP-TotalPages");
const comments = await res.json();

console.log(`Σύνολο: ${total} σχόλια (${pages} σελίδες)`);
comments.forEach(c => {
    console.log(`  [${c.id}] ${c.author}: ${c.content.substring(0, 60)}...`);
});
PHP
<?php
$base_url = '%%BASE_URL%%';
$post_id  = 1234; // ID διαβούλευσης
$site_id  = 5;    // ID φορέα
$page     = 1;
$all      = [];

do {
    $url      = $base_url . '/post/' . $post_id . '/comments?' . http_build_query([
        'site_id'  => $site_id,
        'page'     => $page,
        'per_page' => 50,
    ]);
    $body      = file_get_contents($url);
    $data      = json_decode($body, true);
    $all       = array_merge($all, $data);

    // Διαβάζουμε τον αριθμό σελίδων από headers
    $total_pages = 1;
    foreach ($http_response_header as $h) {
        if (stripos($h, 'X-WP-TotalPages:') === 0) {
            $total_pages = (int) trim(substr($h, strlen('X-WP-TotalPages:')));
        }
    }
    $page++;
} while ($page <= $total_pages);

echo "Σύνολο σχολίων: " . count($all) . "\n";
foreach (array_slice($all, 0, 5) as $c) {
    echo "[{$c['id']}] {$c['author']}: " . substr(strip_tags($c['content']), 0, 60) . "...\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client  = new HttpClient();
var postId  = 1234;
var siteId  = 5;
var url     = $"%%BASE_URL%%/post/{postId}/comments?site_id={siteId}&page=1&per_page=20";
var response = await client.GetAsync(url);

var total   = response.Headers.GetValues("X-WP-Total").First();
var json    = await response.Content.ReadAsStringAsync();
var comments = JsonSerializer.Deserialize<JsonElement[]>(json);

Console.WriteLine($"Σύνολο: {total} σχόλια");
foreach (var c in comments!)
{
    Console.WriteLine($"  [{c.GetProperty("id")}] " +
                      $"{c.GetProperty("author").GetString()}: " +
                      $"{c.GetProperty("content").GetString()?[..60]}...");
}
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const postId = 1234;
const siteId = 5;

final uri = Uri.parse('%%BASE_URL%%/post/$postId/comments').replace(
  queryParameters: {'site_id': '$siteId', 'page': '1', 'per_page': '20'},
);

final response = await http.get(uri);
final total    = response.headers['x-wp-total'];
final comments = jsonDecode(response.body) as List<dynamic>;

print('Σύνολο: $total σχόλια');
for (final c in comments) {
  final content = (c['content'] as String).replaceAll(RegExp(r'<[^>]*>'), '');
  print('[${c['id']}] ${c['author']}: ${content.substring(0, 60)}...');
}
GET
/opengov/v1/comment/{id}
Λεπτομέρειες σχολίου

Επιστρέφει τα πλήρη στοιχεία ενός μεμονωμένου σχολίου, συμπεριλαμβανομένων όλων των μεταδεδομένων (meta). Τα πεδία article_unique_id και article_title δείχνουν σε ποιο άρθρο/ενότητα της διαβούλευσης ανήκει το σχόλιο (null αν είναι γενικό σχόλιο). Το πεδίο comment_url δείχνει στη σελίδα προβολής του σχολίου.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
id integer Ναι Αναγνωριστικό (ID) του σχολίου (στο URL path)
site_id integer Ναι ID του φορέα όπου ανήκει το σχόλιο
200 OK
Python
import requests

BASE_URL  = "%%BASE_URL%%"
comment_id = 456  # ID σχολίου
site_id    = 5    # ID φορέα

r = requests.get(f"{BASE_URL}/comment/{comment_id}", params={"site_id": site_id})
r.raise_for_status()

c = r.json()
print(f"Σχόλιο #{c['id']} από: {c['author']}")
print(f"Ημερομηνία: {c['date']}")
print(f"Εγκεκριμένο: {'Ναι' if c['approved'] else 'Όχι'}")
JavaScript
const BASE_URL  = "%%BASE_URL%%";
const commentId = 456;  // ID σχολίου
const siteId    = 5;    // ID φορέα

const res = await fetch(`${BASE_URL}/comment/${commentId}?site_id=${siteId}`);
const c   = await res.json();

console.log(`Σχόλιο #${c.id} από: ${c.author}`);
console.log(`Ημερομηνία: ${c.date}`);
console.log(`Εγκεκριμένο: ${c.approved ? 'Ναι' : 'Όχι'}`);
PHP
<?php
$base_url   = '%%BASE_URL%%';
$comment_id = 456; // ID σχολίου
$site_id    = 5;   // ID φορέα

$url  = $base_url . '/comment/' . $comment_id . '?site_id=' . $site_id;
$data = json_decode(file_get_contents($url), true);

echo "Σχόλιο #{$data['id']} από: {$data['author']}\n";
echo "Ημερομηνία: {$data['date']}\n";
echo "Εγκεκριμένο: " . ($data['approved'] ? 'Ναι' : 'Όχι') . "\n";
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client    = new HttpClient();
var commentId = 456;
var siteId    = 5;
var url       = $"%%BASE_URL%%/comment/{commentId}?site_id={siteId}";
var response  = await client.GetAsync(url);
var json      = await response.Content.ReadAsStringAsync();
var c         = JsonSerializer.Deserialize<JsonElement>(json);

Console.WriteLine($"Σχόλιο #{c.GetProperty("id")} από: {c.GetProperty("author").GetString()}");
Console.WriteLine($"Ημερομηνία: {c.GetProperty("date").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const commentId = 456;
const siteId    = 5;

final uri      = Uri.parse('%%BASE_URL%%/comment/$commentId?site_id=$siteId');
final response = await http.get(uri);
final c        = jsonDecode(response.body) as Map<String, dynamic>;

print('Σχόλιο #${c['id']} από: ${c['author']}');
print('Ημερομηνία: ${c['date']}');
print('Εγκεκριμένο: ${c['approved'] == 1 ? 'Ναι' : 'Όχι'}');
GET
/opengov/v1/site-info
Πληροφορίες φορέα

Επιστρέφει βασικές πληροφορίες για έναν φορέα του δικτύου: όνομα, URL, περιγραφή, αριθμό δημοσιευμένων διαβουλεύσεων, κωδικό φορέα και τύπο οντότητας.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
site_id integer Ναι Αναγνωριστικό (ID) του φορέα
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"
site_id   = 5  # αντικαταστήστε με το ID που θέλετε

r = requests.get(f"{BASE_URL}/site-info", params={"site_id": site_id})
r.raise_for_status()

info = r.json()
print(f"Φορέας:         {info['name']}")
print(f"URL:            {info['url']}")
print(f"Κωδικός:        {info['code']}")
print(f"Τύπος:          {info['kind']}")
print(f"Διαβουλεύσεις: {info['deliberations_count']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";
const siteId   = 5; // αντικαταστήστε με το ID που θέλετε

const res  = await fetch(`${BASE_URL}/site-info?site_id=${siteId}`);
const info = await res.json();

console.log(`Φορέας:         ${info.name}`);
console.log(`URL:            ${info.url}`);
console.log(`Κωδικός:        ${info.code}`);
console.log(`Τύπος:          ${info.kind}`);
console.log(`Διαβουλεύσεις: ${info.deliberations_count}`);
PHP
<?php
$base_url = '%%BASE_URL%%';
$site_id  = 5; // αντικαταστήστε με το ID που θέλετε

$url  = $base_url . '/site-info?site_id=' . $site_id;
$info = json_decode(file_get_contents($url), true);

echo "Φορέας:         {$info['name']}\n";
echo "URL:            {$info['url']}\n";
echo "Κωδικός:        {$info['code']}\n";
echo "Τύπος:          {$info['kind']}\n";
echo "Διαβουλεύσεις: {$info['deliberations_count']}\n";
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var siteId   = 5; // αντικαταστήστε με το ID που θέλετε
var url      = $"%%BASE_URL%%/site-info?site_id={siteId}";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var info     = JsonSerializer.Deserialize<JsonElement>(json);

Console.WriteLine($"Φορέας:         {info.GetProperty("name").GetString()}");
Console.WriteLine($"URL:            {info.GetProperty("url").GetString()}");
Console.WriteLine($"Κωδικός:        {info.GetProperty("code").GetInt32()}");
Console.WriteLine($"Τύπος:          {info.GetProperty("kind").GetString()}");
Console.WriteLine($"Διαβουλεύσεις: {info.GetProperty("deliberations_count")}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const siteId = 5; // αντικαταστήστε με το ID που θέλετε

final uri      = Uri.parse('%%BASE_URL%%/site-info?site_id=$siteId');
final response = await http.get(uri);
final info     = jsonDecode(response.body) as Map<String, dynamic>;

print('Φορέας:         ${info['name']}');
print('URL:            ${info['url']}');
print('Κωδικός:        ${info['code']}');
print('Τύπος:          ${info['kind']}');
print('Διαβουλεύσεις: ${info['deliberations_count']}');
GET
/opengov/v1/organizations
Λίστα φορέων

Επιστρέφει λίστα με όλους τους ενεργούς φορείς (Υπουργεία και άλλες αρχές) του δικτύου, μαζί με το site_id, το όνομα, τον κωδικό, το URL, τον τύπο οντότητας και τον αριθμό δημοσιευμένων διαβουλεύσεων του κάθε φορέα. Χρήσιμο για την εύρεση των site_id που απαιτούνται σε άλλα endpoints.

X-WP-Total Συνολικός αριθμός φορέων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/organizations")
r.raise_for_status()

orgs = r.json()
print(f"Σύνολο φορέων: {r.headers.get('X-WP-Total')}")
for o in orgs:
    print(f"  [{o['site_id']}] {o['name']}  ({o['code']})  —  {o['deliberations_count']} διαβουλεύσεις")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res   = await fetch(`${BASE_URL}/organizations`);
const total = res.headers.get("X-WP-Total");
const orgs  = await res.json();

console.log(`Σύνολο φορέων: ${total}`);
orgs.forEach(o => console.log(`[${o.site_id}] ${o.name}  (${o.code})  —  ${o.deliberations_count} διαβουλεύσεις`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$url      = $base_url . '/organizations';

$body = file_get_contents($url);
$orgs = json_decode($body, true);

foreach ($orgs as $o) {
    echo "[{$o['site_id']}] {$o['name']}  ({$o['code']})  —  {$o['deliberations_count']} διαβουλεύσεις\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var url      = "%%BASE_URL%%/organizations";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var orgs     = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var o in orgs!)
{
    Console.WriteLine($"[{o.GetProperty("site_id")}] " +
                      $"{o.GetProperty("name").GetString()}  " +
                      $"({o.GetProperty("code").GetInt32()})");
}
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri      = Uri.parse('%%BASE_URL%%/organizations');
final response = await http.get(uri);
final orgs     = jsonDecode(response.body) as List<dynamic>;

for (final o in orgs) {
  print('[${o['site_id']}] ${o['name']}  (${o['code']})  —  ${o['deliberations_count']} διαβουλεύσεις');
}
GET
/opengov/v1/analytics
Στατιστικά & Αναλυτικά

Επιστρέφει αθροιστικά στατιστικά για ένα ή περισσότερα sites του δικτύου. Περιλαμβάνει σύνολα σχολίων (εγκεκριμένα/απορριφθέντα/υποβληθέντα), κατανομή μήκους σχολίων, χρήστες, κατάσταση διαβουλεύσεων, top-10 διαβουλεύσεις και μέσους όρους. Τα αποτελέσματα ανανεώνονται κάθε 5 λεπτά (cache). Η κεφαλίδα X-Cache: HIT/MISS δείχνει αν η απόκριση ήρθε από cache.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
site_id[] integer Όχι όλα τα sites ID φορέα — μπορεί να επαναληφθεί για πολλούς φορείς (π.χ. site_id[]=2&site_id[]=5)
start_date string Όχι Αρχή φίλτρου ημερομηνίας (Y-m-d). Εφαρμόζεται σε σχόλια και ημερομηνία δημοσίευσης διαβούλευσης
end_date string Όχι Τέλος φίλτρου ημερομηνίας (Y-m-d), συμπεριλαμβανόμενο
X-Cache HIT αν η απόκριση προήλθε από cache, MISS αν υπολογίστηκε εκ νέου
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

# Φίλτρο: site_id 2 & 5, έτος 2024
r = requests.get(f"{BASE_URL}/analytics", params={
    "site_id[]": [2, 5],
    "start_date": "2024-01-01",
    "end_date":   "2024-12-31",
})
r.raise_for_status()

data = r.json()
print(f"Cache: {r.headers.get('X-Cache')}")
print(f"Εγκεκριμένα σχόλια:  {data['comments']['approved']}")
print(f"Απορριφθέντα:        {data['comments']['rejected']}")
print(f"Μοναδικοί σχολιαστές: {data['users']['unique_commenters']}")
print(f"Engagement ratio:    {data['users']['engagement_ratio_percent']}%")
print()
print("Top 10 διαβουλεύσεις:")
for d in data["top_by_comments"]:
    print(f"  [{d['comments']} σχόλια] {d['title']}  ({d['site_name']})")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const params = new URLSearchParams({
    start_date: "2024-01-01",
    end_date:   "2024-12-31",
});
// Πολλαπλά site_id
[2, 5].forEach(id => params.append("site_id[]", id));

const res  = await fetch(`${BASE_URL}/analytics?${params}`);
const data = await res.json();

console.log(`Cache: ${res.headers.get("X-Cache")}`);
console.log(`Εγκεκριμένα: ${data.comments.approved}`);
console.log(`Engagement:  ${data.users.engagement_ratio_percent}%`);
console.log("\nTop 10:");
data.top_by_comments.forEach(d =>
    console.log(`  [${d.comments}] ${d.title}  (${d.site_name})`)
);
PHP
<?php
$base_url = '%%BASE_URL%%';
$url = $base_url . '/analytics?' . http_build_query([
    'site_id'    => [2, 5],
    'start_date' => '2024-01-01',
    'end_date'   => '2024-12-31',
]);

$body = file_get_contents($url);
$data = json_decode($body, true);

echo "Εγκεκριμένα:  {$data['comments']['approved']}\n";
echo "Απορριφθέντα: {$data['comments']['rejected']}\n";
echo "Engagement:   {$data['users']['engagement_ratio_percent']}%\n";
echo "\nTop 10:\n";
foreach ($data['top_by_comments'] as $d) {
    echo "  [{$d['comments']}] {$d['title']}  ({$d['site_name']})\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client = new HttpClient();
var url    = "%%BASE_URL%%/analytics?site_id[]=2&site_id[]=5&start_date=2024-01-01&end_date=2024-12-31";
var res    = await client.GetAsync(url);
var json   = await res.Content.ReadAsStringAsync();
var data   = JsonSerializer.Deserialize<JsonElement>(json);

Console.WriteLine($"Cache:       {res.Headers.GetValues("X-Cache").FirstOrDefault()}");
Console.WriteLine($"Εγκεκριμένα: {data.GetProperty("comments").GetProperty("approved")}");
Console.WriteLine($"Engagement:  {data.GetProperty("users").GetProperty("engagement_ratio_percent")}%");

foreach (var d in data.GetProperty("top_by_comments").EnumerateArray())
    Console.WriteLine($"  [{d.GetProperty("comments")}] {d.GetProperty("title").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri = Uri.parse('%%BASE_URL%%/analytics').replace(queryParameters: {
  'site_id[]': ['2', '5'],
  'start_date': '2024-01-01',
  'end_date':   '2024-12-31',
});

final response = await http.get(uri);
final data     = jsonDecode(response.body) as Map<String, dynamic>;

print('Cache:       ${response.headers['x-cache']}');
print('Εγκεκριμένα: ${data['comments']['approved']}');
print('Engagement:  ${data['users']['engagement_ratio_percent']}%');
for (final d in data['top_by_comments'] as List) {
  print('[${d['comments']}] ${d['title']}  (${d['site_name']})');
}
GET
/opengov/v1/open-deliberations
Ανοικτές διαβουλεύσεις δικτύου

Επιστρέφει όλες τις τρέχουσες ανοικτές διαβουλεύσεις σε όλο το δίκτυο, ταξινομημένες κατά ημερομηνία λήξης (η πλησιέστερη προς λήξη πρώτη). Χρήσιμο για να δείτε τι είναι ανοικτό προς σχολιασμό αυτή τη στιγμή, χωρίς να χρειάζεται να τραβήξετε και να φιλτράρετε όλο το /all-posts.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 10 Αποτελέσματα ανά σελίδα (μέγιστο 100)
X-WP-Total Συνολικός αριθμός ανοικτών διαβουλεύσεων
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/open-deliberations", params={"page": 1, "per_page": 10})
r.raise_for_status()

data = r.json()
print(f"Ανοικτές διαβουλεύσεις: {r.headers.get('X-WP-Total')}")
for d in data:
    expiry = d['acf_fields'].get('expiry_date')
    print(f"  [{d['id']}] {d['title']}  —  λήξη: {expiry}")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res   = await fetch(`${BASE_URL}/open-deliberations?page=1&per_page=10`);
const total = res.headers.get("X-WP-Total");
const data  = await res.json();

console.log(`Ανοικτές διαβουλεύσεις: ${total}`);
data.forEach(d => console.log(`[${d.id}] ${d.title}  —  λήξη: ${d.acf_fields.expiry_date}`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$url      = $base_url . '/open-deliberations?' . http_build_query(['page' => 1, 'per_page' => 10]);

$data = json_decode(file_get_contents($url), true);

foreach ($data as $d) {
    echo "[{$d['id']}] {$d['title']}  —  λήξη: {$d['acf_fields']['expiry_date']}\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var url      = "%%BASE_URL%%/open-deliberations?page=1&per_page=10";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var data     = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var d in data!)
    Console.WriteLine($"[{d.GetProperty("id")}] {d.GetProperty("title").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri = Uri.parse('%%BASE_URL%%/open-deliberations').replace(
  queryParameters: {'page': '1', 'per_page': '10'},
);

final response = await http.get(uri);
final data     = jsonDecode(response.body) as List<dynamic>;

for (final d in data) {
  print('[${d['id']}] ${d['title']}  —  λήξη: ${d['acf_fields']['expiry_date']}');
}
GET
/opengov/v1/closing-soon
Διαβουλεύσεις που κλείνουν σύντομα

Επιστρέφει τις ανοικτές διαβουλεύσεις των οποίων η ημερομηνία λήξης πέφτει εντός των επόμενων days ημερών, σε όλο το δίκτυο. Ταξινομημένες κατά ημερομηνία λήξης (η πλησιέστερη πρώτη).

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
days integer Όχι 7 Διαβουλεύσεις που κλείνουν εντός τόσων ημερών (1–90)
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 10 Αποτελέσματα ανά σελίδα (μέγιστο 100)
X-WP-Total Συνολικός αριθμός διαβουλεύσεων που κλείνουν σύντομα
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/closing-soon", params={"days": 7})
r.raise_for_status()

data = r.json()
print(f"Κλείνουν εντός 7 ημερών: {r.headers.get('X-WP-Total')}")
for d in data:
    print(f"  [{d['id']}] {d['title']}  —  λήξη: {d['acf_fields']['expiry_date']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res  = await fetch(`${BASE_URL}/closing-soon?days=7`);
const data = await res.json();

console.log(`Κλείνουν εντός 7 ημερών: ${res.headers.get("X-WP-Total")}`);
data.forEach(d => console.log(`[${d.id}] ${d.title}  —  λήξη: ${d.acf_fields.expiry_date}`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$url      = $base_url . '/closing-soon?days=7';

$data = json_decode(file_get_contents($url), true);

foreach ($data as $d) {
    echo "[{$d['id']}] {$d['title']}  —  λήξη: {$d['acf_fields']['expiry_date']}\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client   = new HttpClient();
var url      = "%%BASE_URL%%/closing-soon?days=7";
var response = await client.GetAsync(url);
var json     = await response.Content.ReadAsStringAsync();
var data     = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var d in data!)
    Console.WriteLine($"[{d.GetProperty("id")}] {d.GetProperty("title").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri = Uri.parse('%%BASE_URL%%/closing-soon').replace(
  queryParameters: {'days': '7'},
);

final response = await http.get(uri);
final data     = jsonDecode(response.body) as List<dynamic>;

for (final d in data) {
  print('[${d['id']}] ${d['title']}  —  λήξη: ${d['acf_fields']['expiry_date']}');
}
GET
/opengov/v1/organization-kinds
Τύποι φορέων

Επιστρέφει τους διακριτούς τύπους φορέων (π.χ. ministry, independent_authority) που χρησιμοποιούνται στο δίκτυο, μαζί με τον αριθμό φορέων ανά τύπο. Χρήσιμο για την κατασκευή φίλτρων πάνω στο /organizations.

200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/organization-kinds")
r.raise_for_status()

for k in r.json():
    print(f"  {k['kind']}: {k['count']} φορείς")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res   = await fetch(`${BASE_URL}/organization-kinds`);
const kinds = await res.json();

kinds.forEach(k => console.log(`${k.kind}: ${k.count} φορείς`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$kinds    = json_decode(file_get_contents($base_url . '/organization-kinds'), true);

foreach ($kinds as $k) {
    echo "{$k['kind']}: {$k['count']} φορείς\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client = new HttpClient();
var json   = await client.GetStringAsync("%%BASE_URL%%/organization-kinds");
var kinds  = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var k in kinds!)
    Console.WriteLine($"{k.GetProperty("kind").GetString()}: {k.GetProperty("count")} φορείς");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final response = await http.get(Uri.parse('%%BASE_URL%%/organization-kinds'));
final kinds    = jsonDecode(response.body) as List<dynamic>;

for (final k in kinds) {
  print('${k['kind']}: ${k['count']} φορείς');
}
GET
/opengov/v1/post/{id}/attachments
Συνημμένα διαβούλευσης

Επιστρέφει τα συνημμένα αρχεία (π.χ. PDF) μιας διαβούλευσης. Αν παραλειφθεί το site_id, γίνεται αναζήτηση σε όλους τους φορείς — συνιστάται όμως η χρήση του για ταχύτητα και ακρίβεια, αφού τα post IDs δεν είναι globally unique σε multisite.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
id integer Ναι Αναγνωριστικό (ID) της διαβούλευσης (στο URL path)
site_id integer Όχι ID του φορέα (προαιρετικό, βελτιώνει ταχύτητα/ακρίβεια)
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"
post_id   = 1234  # ID διαβούλευσης
site_id   = 5     # προαιρετικό

r = requests.get(f"{BASE_URL}/post/{post_id}/attachments", params={"site_id": site_id})
r.raise_for_status()

for f in r.json():
    print(f"  {f['label'] or f['filename']}  —  {f['url']}")
JavaScript
const BASE_URL = "%%BASE_URL%%";
const postId   = 1234;
const siteId   = 5;

const res   = await fetch(`${BASE_URL}/post/${postId}/attachments?site_id=${siteId}`);
const files = await res.json();

files.forEach(f => console.log(`${f.label || f.filename}  —  ${f.url}`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$post_id  = 1234;
$site_id  = 5;

$url   = $base_url . '/post/' . $post_id . '/attachments?site_id=' . $site_id;
$files = json_decode(file_get_contents($url), true);

foreach ($files as $f) {
    echo ($f['label'] ?: $f['filename']) . "  —  {$f['url']}\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client = new HttpClient();
var url    = "%%BASE_URL%%/post/1234/attachments?site_id=5";
var json   = await client.GetStringAsync(url);
var files  = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var f in files!)
    Console.WriteLine($"{f.GetProperty("filename").GetString()}  —  {f.GetProperty("url").GetString()}");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

const postId = 1234;
const siteId = 5;

final uri      = Uri.parse('%%BASE_URL%%/post/$postId/attachments?site_id=$siteId');
final response = await http.get(uri);
final files    = jsonDecode(response.body) as List<dynamic>;

for (final f in files) {
  print('${f['label'] ?? f['filename']}  —  ${f['url']}');
}
GET
/opengov/v1/recent-comments
Πρόσφατα σχόλια δικτύου

Επιστρέφει τα πιο πρόσφατα εγκεκριμένα σχόλια σε όλο το δίκτυο — ένα feed δραστηριότητας με τίτλο και σύνδεσμο της διαβούλευσης στην οποία ανήκει κάθε σχόλιο. Τα πεδία article_unique_id και article_title δείχνουν σε ποιο άρθρο/ενότητα της διαβούλευσης ανήκει το σχόλιο (null αν είναι γενικό σχόλιο). Το πεδίο comment_url δείχνει στη σελίδα προβολής του ίδιου του σχολίου (όχι της διαβούλευσης).

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
page integer Όχι 1 Αριθμός σελίδας
per_page integer Όχι 20 Σχόλια ανά σελίδα (μέγιστο 100)
X-WP-Total Συνολικός αριθμός σχολίων που καλύπτει η σελιδοποίηση
X-WP-TotalPages Συνολικός αριθμός σελίδων
200 OK
Python
import requests

BASE_URL = "%%BASE_URL%%"

r = requests.get(f"{BASE_URL}/recent-comments", params={"page": 1, "per_page": 20})
r.raise_for_status()

data = r.json()
print(f"Σύνολο: {r.headers.get('X-WP-Total')}")
for c in data:
    print(f"  {c['author']} στο «{c['post_title']}» ({c['site_name']})")
JavaScript
const BASE_URL = "%%BASE_URL%%";

const res  = await fetch(`${BASE_URL}/recent-comments?page=1&per_page=20`);
const data = await res.json();

data.forEach(c => console.log(`${c.author} στο «${c.post_title}» (${c.site_name})`));
PHP
<?php
$base_url = '%%BASE_URL%%';
$url      = $base_url . '/recent-comments?' . http_build_query(['page' => 1, 'per_page' => 20]);

$data = json_decode(file_get_contents($url), true);

foreach ($data as $c) {
    echo "{$c['author']} στο «{$c['post_title']}» ({$c['site_name']})\n";
}
.NET (C#)
using System.Net.Http;
using System.Text.Json;

var client = new HttpClient();
var url    = "%%BASE_URL%%/recent-comments?page=1&per_page=20";
var json   = await client.GetStringAsync(url);
var data   = JsonSerializer.Deserialize<JsonElement[]>(json);

foreach (var c in data!)
    Console.WriteLine($"{c.GetProperty("author").GetString()} στο «{c.GetProperty("post_title").GetString()}»");
Flutter / Dart
import 'package:http/http.dart' as http;
import 'dart:convert';

final uri = Uri.parse('%%BASE_URL%%/recent-comments').replace(
  queryParameters: {'page': '1', 'per_page': '20'},
);

final response = await http.get(uri);
final data     = jsonDecode(response.body) as List<dynamic>;

for (final c in data) {
  print('${c['author']} στο «${c['post_title']}» (${c['site_name']})');
}