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 | 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 |
Επιστρέφει λίστα όλων των δημοσιευμένων διαβουλεύσεων από όλους τους φορείς του δικτύου, ταξινομημένες χρονολογικά (νεότερες πρώτα). Ο συνολικός αριθμός και οι σελίδες επιστρέφονται μέσω 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\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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 εμφανίζει το πλήρες όνομα μόνο αν ο χρήστης το έχει επιτρέψει — διαφορετικά εμφανίζεται «Ανώνυμος χρήστης». Το πεδίο 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
Συνολικός αριθμός σελίδων
[
{
"id": 456,
"post_id": 1234,
"article_unique_id": "abc123-def456-ghi789",
"article_title": "Άρθρο 3 - Πεδίο εφαρμογής",
"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": "",
"comment_url": "https:\/\/www.opengov.gr\/comment-view\/?cid=456&sid=5",
"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). Τα πεδία article_unique_id και article_title δείχνουν σε ποιο άρθρο/ενότητα της διαβούλευσης ανήκει το σχόλιο (null αν είναι γενικό σχόλιο). Το πεδίο comment_url δείχνει στη σελίδα προβολής του σχολίου.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| id | integer | Ναι | — |
Αναγνωριστικό (ID) του σχολίου (στο URL path) |
| site_id | integer | Ναι | — |
ID του φορέα όπου ανήκει το σχόλιο |
{
"id": 456,
"post_id": 1234,
"article_unique_id": "abc123-def456-ghi789",
"article_title": "Άρθρο 3 - Πεδίο εφαρμογής",
"site_id": 5,
"author": "Γιώργος Παπαδόπουλος",
"date": "2024-03-20 14:25:00",
"date_gmt": "2024-03-20 12:25:00",
"content": "<p>Προτείνω να προστεθεί διάταξη για...<\/p>",
"approved": 1,
"comment_url": "https:\/\/www.opengov.gr\/comment-view\/?cid=456&sid=5",
"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": 1035,
"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").GetInt32()}");
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']}');
Επιστρέφει λίστα με όλους τους ενεργούς φορείς (Υπουργεία και άλλες αρχές) του δικτύου, μαζί με το site_id, το όνομα, τον κωδικό, το URL, τον τύπο οντότητας και τον αριθμό δημοσιευμένων διαβουλεύσεων του κάθε φορέα. Χρήσιμο για την εύρεση των site_id που απαιτούνται σε άλλα endpoints.
X-WP-Total
Συνολικός αριθμός φορέων
[
{
"site_id": 5,
"name": "Υπουργείο Εσωτερικών",
"url": "https:\/\/www.opengov.gr\/ypes",
"description": "Ηλεκτρονική Δημόσια Διαβούλευση",
"deliberations_count": 42,
"code": 1035,
"kind": "ministry"
}
]
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']} διαβουλεύσεις")
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
$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";
}
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()})");
}
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']} διαβουλεύσεις');
}
Επιστρέφει αθροιστικά στατιστικά για ένα ή περισσότερα 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']})');
}
Επιστρέφει όλες τις τρέχουσες ανοικτές διαβουλεύσεις σε όλο το δίκτυο, ταξινομημένες κατά ημερομηνία λήξης (η πλησιέστερη προς λήξη πρώτη). Χρήσιμο για να δείτε τι είναι ανοικτό προς σχολιασμό αυτή τη στιγμή, χωρίς να χρειάζεται να τραβήξετε και να φιλτράρετε όλο το /all-posts.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 10 |
Αποτελέσματα ανά σελίδα (μέγιστο 100) |
X-WP-Total
Συνολικός αριθμός ανοικτών διαβουλεύσεων
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 1234,
"title": "Σχέδιο νόμου για τη βελτίωση της δημόσιας διοίκησης",
"permalink": "https:\/\/www.opengov.gr\/ypes\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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}/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}")
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
$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";
}
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()}");
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']}');
}
Επιστρέφει τις ανοικτές διαβουλεύσεις των οποίων η ημερομηνία λήξης πέφτει εντός των επόμενων days ημερών, σε όλο το δίκτυο. Ταξινομημένες κατά ημερομηνία λήξης (η πλησιέστερη πρώτη).
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| days | integer | Όχι | 7 |
Διαβουλεύσεις που κλείνουν εντός τόσων ημερών (1–90) |
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 10 |
Αποτελέσματα ανά σελίδα (μέγιστο 100) |
X-WP-Total
Συνολικός αριθμός διαβουλεύσεων που κλείνουν σύντομα
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 1234,
"title": "Σχέδιο νόμου για...",
"permalink": "https:\/\/www.opengov.gr\/ypes\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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-03-20 23:59:00"
}
}
]
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']}")
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
$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";
}
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()}");
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']}');
}
Αναζητά διαβουλεύσεις με βάση λέξη-κλειδί στον τίτλο και το περιεχόμενο. Από προεπιλογή ψάχνει σε όλο το δίκτυο· με την προαιρετική παράμετρο site_id μπορείτε να περιορίσετε την αναζήτηση σε έναν συγκεκριμένο φορέα. Τα αποτελέσματα ταξινομούνται χρονολογικά (νεότερα πρώτα).
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| q | string | Ναι | — |
Λέξη ή φράση αναζήτησης |
| site_id | integer | Όχι | όλα τα sites |
Περιορισμός αναζήτησης σε συγκεκριμένο φορέα |
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 10 |
Αποτελέσματα ανά σελίδα (μέγιστο 100) |
X-WP-Total
Συνολικός αριθμός αποτελεσμάτων
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 1234,
"title": "Σχέδιο νόμου για τη βελτίωση της δημόσιας διοίκησης",
"permalink": "https:\/\/www.opengov.gr\/ypes\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"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}/search", params={"q": "δημόσια διοίκηση", "page": 1, "per_page": 10})
r.raise_for_status()
data = r.json()
print(f"Αποτελέσματα: {r.headers.get('X-WP-Total')}")
for d in data:
print(f" [{d['id']}] {d['title']} — {d['site_name']}")
const BASE_URL = "%%BASE_URL%%";
const params = new URLSearchParams({ q: "δημόσια διοίκηση", page: 1, per_page: 10 });
const res = await fetch(`${BASE_URL}/search?${params}`);
const data = await res.json();
console.log(`Αποτελέσματα: ${res.headers.get("X-WP-Total")}`);
data.forEach(d => console.log(`[${d.id}] ${d.title} — ${d.site_name}`));
<?php
$base_url = '%%BASE_URL%%';
$url = $base_url . '/search?' . http_build_query([
'q' => 'δημόσια διοίκηση',
'page' => 1,
'per_page' => 10,
]);
$data = json_decode(file_get_contents($url), true);
foreach ($data as $d) {
echo "[{$d['id']}] {$d['title']} — {$d['site_name']}\n";
}
using System.Net.Http;
using System.Text.Json;
using System.Web;
var client = new HttpClient();
var q = HttpUtility.UrlEncode("δημόσια διοίκηση");
var url = $"%%BASE_URL%%/search?q={q}&page=1&per_page=10";
var res = await client.GetAsync(url);
var json = await res.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';
final uri = Uri.parse('%%BASE_URL%%/search').replace(
queryParameters: {'q': 'δημόσια διοίκηση', '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['site_name']}');
}
Επιστρέφει τους διακριτούς τύπους φορέων (π.χ. ministry, independent_authority) που χρησιμοποιούνται στο δίκτυο, μαζί με τον αριθμό φορέων ανά τύπο. Χρήσιμο για την κατασκευή φίλτρων πάνω στο /organizations.
[
{
"kind": "ministry",
"count": 18
},
{
"kind": "independent_authority",
"count": 4
}
]
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']} φορείς")
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
$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";
}
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")} φορείς");
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']} φορείς');
}
Επιστρέφει τα συνημμένα αρχεία (π.χ. PDF) μιας διαβούλευσης. Αν παραλειφθεί το site_id, γίνεται αναζήτηση σε όλους τους φορείς — συνιστάται όμως η χρήση του για ταχύτητα και ακρίβεια, αφού τα post IDs δεν είναι globally unique σε multisite.
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| id | integer | Ναι | — |
Αναγνωριστικό (ID) της διαβούλευσης (στο URL path) |
| site_id | integer | Όχι | — |
ID του φορέα (προαιρετικό, βελτιώνει ταχύτητα/ακρίβεια) |
[
{
"id": 789,
"label": "Σχέδιο νόμου (πλήρες κείμενο)",
"filename": "nomosxedio.pdf",
"url": "https:\/\/www.opengov.gr\/wp-content\/uploads\/sites\/5\/2024\/03\/nomosxedio.pdf",
"mime_type": "application\/pdf"
}
]
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']}")
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
$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";
}
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()}");
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']}');
}
Επιστρέφει τα πιο πρόσφατα εγκεκριμένα σχόλια σε όλο το δίκτυο — ένα feed δραστηριότητας με τίτλο και σύνδεσμο της διαβούλευσης στην οποία ανήκει κάθε σχόλιο. Τα πεδία article_unique_id και article_title δείχνουν σε ποιο άρθρο/ενότητα της διαβούλευσης ανήκει το σχόλιο (null αν είναι γενικό σχόλιο). Το πεδίο comment_url δείχνει στη σελίδα προβολής του ίδιου του σχολίου (όχι της διαβούλευσης).
| Παράμετρος | Τύπος | Υποχρεωτική | Προεπιλογή | Περιγραφή |
|---|---|---|---|---|
| page | integer | Όχι | 1 |
Αριθμός σελίδας |
| per_page | integer | Όχι | 20 |
Σχόλια ανά σελίδα (μέγιστο 100) |
X-WP-Total
Συνολικός αριθμός σχολίων που καλύπτει η σελιδοποίηση
X-WP-TotalPages
Συνολικός αριθμός σελίδων
[
{
"id": 456,
"post_id": 1234,
"article_unique_id": "abc123-def456-ghi789",
"article_title": "Άρθρο 3 - Πεδίο εφαρμογής",
"post_title": "Σχέδιο νόμου για...",
"permalink": "https:\/\/www.opengov.gr\/ypes\/deliberations\/sxedio-nomou-gia-ti-veltiosi-tis-dimosias-dioikisis\/",
"comment_url": "https:\/\/www.opengov.gr\/comment-view\/?cid=456&sid=5",
"site_id": 5,
"site_name": "Υπουργείο Εσωτερικών",
"author": "Ανώνυμος χρήστης",
"date_gmt": "2024-03-20 12:25:00",
"content": "<p>Προτείνω να προστεθεί διάταξη για...<\/p>"
}
]
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']})")
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
$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";
}
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()}»");
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']})');
}