OpenGov Public API
Τεκμηρίωση των δημόσιων REST API endpoints για πρόσβαση σε διαβουλεύσεις, σχόλια και πληροφορίες φορέων.
Τι είναι το OpenGov API;
Το OpenGov Public API παρέχει δωρεάν, ανοικτή πρόσβαση στα δεδομένα των δημόσιων διαβουλεύσεων της Ελληνικής Κυβέρνησης. Μέσα από απλές HTTP κλήσεις μπορείτε να ανακτήσετε διαβουλεύσεις, σχόλια πολιτών και πληροφορίες φορέων σε μορφή JSON, χωρίς εγγραφή ή κλειδί αυθεντικοποίησης.
Το API ακολουθεί τις αρχές του REST και είναι συμβατό με οποιαδήποτε γλώσσα προγραμματισμού ή πλατφόρμα υποστηρίζει HTTP. Παρακάτω θα βρείτε αναλυτική τεκμηρίωση για κάθε διαθέσιμο endpoint, με παραδείγματα κλήσεων σε Python, JavaScript, PHP, .NET και Flutter.
site_id. Χρησιμοποιήστε τον πίνακα παρακάτω.
page & per_page.
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 |
Επιστρέφει λίστα όλων των δημοσιευμένων διαβουλεύσεων από όλους τους φορείς του δικτύου, ταξινομημένες χρονολογικά (νεότερες πρώτα). Ο συνολικός αριθμός και οι σελίδες επιστρέφονται μέσω HTTP headers.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 10 |
Αποτελέσματα ανά σελίδα (μέγιστο 100) |
X-WP-Total
Συνολικός αριθμός διαβουλεύσεων στο δίκτυο
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 1234,
"title": "Σχέδιο νόμου για τη βελτίωση της δημόσιας διοίκησης",
"permalink": "https:\/\/www.opengov.gr\/ypes\/archives\/1234",
"excerpt": "Σύντομη περιγραφή...",
"content": "<p>Πλήρες κείμενο...<\/p>",
"date_gmt": "2024-03-15 10:30:00",
"site_id": 5,
"site_name": "Υπουργείο Εσωτερικών",
"acf_fields": {
"publish_date": "2024-03-15 10:30:00",
"expiry_date": "2024-04-15 23:59:00"
}
}
]
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']}")
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
$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";
}
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()}");
}
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']}');
}
Επιστρέφει τις δημοσιευμένες διαβουλεύσεις ενός συγκεκριμένου φορέα (Υπουργείου ή άλλης αρχής). Απαιτείται η παράμετρος 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
Συνολικός αριθμός σελίδων
[
{
"id": 1234,
"title": "Σχέδιο νόμου για...",
"permalink": "https:\/\/www.opengov.gr\/ypes\/archives\/1234",
"excerpt": "Σύντομη περιγραφή...",
"content": "<p>Πλήρες κείμενο...<\/p>",
"date_gmt": "2024-03-15 10:30:00",
"site_id": 5,
"site_name": "Υπουργείο Εσωτερικών",
"acf_fields": {
"publish_date": "2024-03-15 10:30:00",
"expiry_date": "2024-04-15 23:59:00"
}
}
]
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']}")
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
$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";
}
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()}");
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']}');
}
Επιστρέφει όλα τα στοιχεία μιας συγκεκριμένης διαβούλευσης βάσει του αναγνωριστικού της (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 |
{
"id": 1234,
"title": "Σχέδιο νόμου για...",
"permalink": "https:\/\/www.opengov.gr\/ypes\/archives\/1234",
"excerpt": "Σύντομη περιγραφή...",
"content": "<p>Πλήρες κείμενο...<\/p>",
"date_gmt": "2024-03-15 10:30:00",
"site_id": 5,
"site_name": "Υπουργείο Εσωτερικών",
"acf_fields": {
"publish_date": "2024-03-15 10:30:00",
"expiry_date": "2024-04-15 23:59:00"
}
}
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']}")
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
$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";
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()}");
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']}');
Επιστρέφει πλούσιο αντικείμενο με όλα τα πεδία ACF, την κατάσταση (ανοικτή/κλειστή), τον συνολικό αριθμό σχολίων και το endpoint για την ανάκτησή τους. Ιδανικό για εφαρμογές που χρειάζονται πλήρη μεταδεδομένα της διαβούλευσης.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| id | integer | Ναι | — |
Αναγνωριστικό (ID) της διαβούλευσης (στο URL path) |
| site_id | integer | Ναι | — |
ID του φορέα |
{
"id": 1234,
"site_id": 5,
"title": "Σχέδιο νόμου για...",
"status": [
"open"
],
"publish_date": "2024-03-15 12:30:00",
"acf": {
"publish_date": "2024-03-15 10:30:00",
"expiry_date": "2024-04-15 23:59:00",
"type": "nomosxedia"
},
"comments": {
"total": 47,
"endpoint": "https:\/\/www.opengov.gr\/wp-json\/opengov\/v1\/post\/1234\/comments?site_id=5"
},
"raw_post": {
"ID": 1234,
"post_title": "Σχέδιο νόμου για...",
"post_status": "publish",
"post_type": "deliberations",
"post_date": "2024-03-15 12:30:00"
}
}
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'])}")
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
$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";
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")}");
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']}');
Επιστρέφει τα εγκεκριμένα σχόλια μιας διαβούλευσης σε σελιδοποιημένη μορφή. Τα σχόλια ταξινομούνται χρονολογικά (παλαιότερα πρώτα). Το πεδίο author εμφανίζει το πλήρες όνομα μόνο αν ο χρήστης το έχει επιτρέψει — διαφορετικά εμφανίζεται «Ανώνυμος χρήστης».
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| id | integer | Ναι | — |
ID της διαβούλευσης (στο URL path) |
| site_id | integer | Ναι | — |
ID του φορέα |
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 20 |
Σχόλια ανά σελίδα (μέγιστο 200) |
X-WP-Total
Συνολικός αριθμός σχολίων της διαβούλευσης
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 456,
"post_id": 1234,
"author": "Ανώνυμος χρήστης",
"author_url": "",
"user_id": 0,
"date": "2024-03-20 14:25:00",
"date_gmt": "2024-03-20 12:25:00",
"content": "<p>Προτείνω να προστεθεί διάταξη για...<\/p>",
"approved": 1,
"parent": 0,
"type": "",
"meta": {
"show_full_name": "0"
}
}
]
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]}...")
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
$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";
}
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]}...");
}
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)}...');
}
Επιστρέφει τα πλήρη στοιχεία ενός μεμονωμένου σχολίου, συμπεριλαμβανομένων όλων των μεταδεδομένων (meta), όπως το αναγνωριστικό άρθρου στο οποίο αναφέρεται.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| id | integer | Ναι | — |
Αναγνωριστικό (ID) του σχολίου (στο URL path) |
| site_id | integer | Ναι | — |
ID του φορέα όπου ανήκει το σχόλιο |
{
"id": 456,
"post_id": 1234,
"site_id": 5,
"author": "Γιώργος Παπαδόπουλος",
"date": "2024-03-20 14:25:00",
"date_gmt": "2024-03-20 12:25:00",
"content": "<p>Προτείνω να προστεθεί διάταξη για...<\/p>",
"approved": 1,
"meta": {
"show_full_name": "1",
"article_unique_id": "abc123-def456-ghi789"
}
}
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 'Όχι'}")
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
$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";
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()}");
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 ? 'Ναι' : 'Όχι'}');
Επιστρέφει βασικές πληροφορίες για έναν φορέα του δικτύου: όνομα, URL, περιγραφή, αριθμό δημοσιευμένων διαβουλεύσεων, κωδικό φορέα και τύπο οντότητας.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| site_id | integer | Ναι | — |
Αναγνωριστικό (ID) του φορέα |
{
"site_id": 5,
"name": "Υπουργείο Εσωτερικών",
"url": "https:\/\/www.opengov.gr\/ypes",
"description": "Ηλεκτρονική Δημόσια Διαβούλευση",
"deliberations_count": 42,
"code": "ypes",
"kind": "ministry"
}
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']}")
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
$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";
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")}");
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']}');
Επιστρέφει αθροιστικά στατιστικά για ένα ή περισσότερα 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 αν υπολογίστηκε εκ νέου
{
"meta": {
"site_ids": [
2,
5
],
"start_date": "2024-01-01",
"end_date": "2024-12-31",
"generated_at": "2024-12-31T23:00:00Z",
"cache_ttl_seconds": 300
},
"comments": {
"approved": 12540,
"rejected": 430,
"submitted": 12970,
"length_distribution": {
"0-50": 3200,
"51-100": 4800,
"101-200": 3500,
"201+": 1040
},
"per_site": [
{
"site_id": 2,
"site_name": "Υπουργείο Εσωτερικών",
"approved_comments": 7200,
"rejected_comments": 210,
"submitted_comments": 7410,
"open_deliberations": 3,
"closed_deliberations": 18,
"unique_commenters": 1840,
"engagement_ratio_percent": 11.93
}
]
},
"users": {
"total_registered": 15420,
"unique_commenters": 3240,
"engagement_ratio_percent": 21.01
},
"deliberations": {
"total": 156,
"open": 12,
"closed": 144,
"without_comments": 8,
"without_comments_percent": 5.13,
"per_site": [
{
"site_id": 2,
"site_name": "Υπουργείο Εσωτερικών",
"open": 3,
"closed": 18
}
]
},
"top_by_comments": [
{
"post_id": 1234,
"title": "Σχέδιο νόμου για...",
"comments": 842,
"site_name": "Υπουργείο Εσωτερικών",
"site_id": 2,
"duration_days": 30
}
],
"top_by_engagement": [
{
"post_id": 1234,
"title": "Σχέδιο νόμου για...",
"comments": 842,
"site_name": "Υπουργείο Εσωτερικών",
"site_id": 2,
"duration_days": 30,
"comments_per_day": 28.07
}
],
"averages": {
"comments_per_deliberation": 80.38,
"comments_per_registered_user": 0.8132,
"avg_deliberation_duration_days": 27.4
}
}
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']})")
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
$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";
}
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()}");
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']})');
}