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

Πολλά 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 0
47 ΥΠΟΥΡΓΕΙΟ ΥΠΟΔΟΜΩΝ ΚΑΙ ΜΕΤΑΦΟΡΩΝ 33281 https://opengov.gr/yme 0
42 ΥΠΟΥΡΓΕΙΟ ΠΕΡΙΒΑΛΛΟΝΤΟΣ ΚΑΙ ΕΝΕΡΓΕΙΑΣ 54032 https://opengov.gr/ypen 0
28 ΥΠΟΥΡΓΕΙΟ ΑΝΑΠΤΥΞΗΣ 49073 https://opengov.gr/mindev 0
35 ΥΠΟΥΡΓΕΙΟ ΕΡΓΑΣΙΑΣ ΚΑΙ ΚΟΙΝΩΝΙΚΗΣ ΑΣΦΑΛΙΣΗΣ 80136 https://opengov.gr/ypergasias 0
31 ΥΠΟΥΡΓΕΙΟ ΔΙΚΑΙΟΣΥΝΗΣ 99487 https://opengov.gr/ministryofjustice 0
43 ΥΠΟΥΡΓΕΙΟ ΠΟΛΙΤΙΣΜΟΥ 45100 https://opengov.gr/culture 0
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 0
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 εμφανίζει το πλήρες όνομα μόνο αν ο χρήστης το έχει επιτρέψει — διαφορετικά εμφανίζεται «Ανώνυμος χρήστης».

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
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), όπως το αναγνωριστικό άρθρου στο οποίο αναφέρεται.

Παράμετρος Τύπος Υποχρεωτική Προεπιλογή Περιγραφή
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").GetString()}");
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/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']})');
}