ProofKit

Τεκμηρίωση

API και προδιαγραφή απόδειξης

Ένα endpoint, ένα έγγραφο JSON πίσω. Η απάντηση είναι η υπογεγραμμένη απόδειξη.

POST /api/v1/check

Σώμα: {"text": "…"} — UTF-8, 5 έως 20.000 χαρακτήρες. Στο δωρεάν πακέτο δεν χρειάζεται κλειδί.

curl -X POST https://proof.sapir861.com/api/v1/check \
  -H "content-type: application/json" \
  -d '{"text":"See Marbury v. Madison, 5 U.S. 137 (1803)."}'
ΚατάστασηΣημασία
200Απόδειξη: {body, sig, digest, log}
400Λείπει το κείμενο, είναι πολύ σύντομο ή ξεπερνά τους 20.000 χαρακτήρες
429rate_limited (αιχμή) ή monthly_limit — το δωρεάν πακέτο είναι 100 παραπομπές τον μήνα ανά δίκτυο

Η κεφαλίδα απάντησης x-proofkit-remaining δείχνει πόσες δωρεάν παραπομπές απομένουν αυτόν τον μήνα. Τα πακέτα Pro και Team λαμβάνουν κλειδί API με υψηλότερα όρια: στείλτε το ως Authorization: Bearer pk_live_… και η απάντηση θα περιέχει x-proofkit-plan. Ένα μη έγκυρο κλειδί επιστρέφει 401 invalid_api_key· ένα πακέτο που έληξε επιστρέφει στο δωρεάν.

Πεδία απόδειξης

ΠεδίοΠεριγραφή
body.specsapir-receipt/1
body.kindcitation-check
body.tsΏρα του ελέγχου σε UTC, ISO-8601
body.input_sha256SHA-256 του ακριβούς κειμένου εισόδου (αποδεικνύει ποιο κείμενο ελέγχθηκε χωρίς να αποθηκευτεί)
body.checkerΜέθοδος και πηγή
body.results[]jurisdiction (US|UK|EU|ECHR), cite, name, verdict, note, source, opinion, matched_case
verdictverified · mismatch (πραγματική παραπομπή, άλλη υπόθεση) · not_found · ambiguous · exists_name_unchecked · unverifiable · unchecked
body.summarytotal, verified, flagged
body.keyΔημόσιο κλειδί υπογραφής (Ed25519, JWK x)
sigΥπογραφή Ed25519 (base64url) πάνω στο κανονικό JSON του body
digestSHA-256 σε hex του κανονικού JSON του body
logΘέση n και hash αλυσίδας στο δημόσιο αρχείο διαφάνειας

Κανονικό JSON: ταξινομημένα κλειδιά αντικειμένων, χωρίς κενά, τυπική διαφυγή συμβολοσειρών JSON, παραλείπονται τα πεδία undefined.

Επαλήθευση

  1. Σειριοποιήστε το body κανονικά.
  2. Το SHA-256 πρέπει να ισούται με το digest.
  3. Επαληθεύστε το sig με Ed25519 πάνω στα ίδια bytes με το κλειδί από το /.well-known/proofkit-pubkey· πρέπει να ισούται με το body.key.x.
import { readFileSync } from "node:fs";   // node verify.mjs receipt.json  (Node 20+)
const r = JSON.parse(readFileSync(process.argv[2] || "receipt.json", "utf8"));
const canon = o => o === null || typeof o !== "object" ? JSON.stringify(o) : Array.isArray(o) ? "[" + o.map(canon).join(",") + "]"
  : "{" + Object.keys(o).sort().filter(k => o[k] !== undefined).map(k => JSON.stringify(k) + ":" + canon(o[k])).join(",") + "}";
const msg = new TextEncoder().encode(canon(r.body));
const hex = Buffer.from(await crypto.subtle.digest("SHA-256", msg)).toString("hex");
const pub = (await (await fetch("https://proof.sapir861.com/.well-known/proofkit-pubkey")).json()).jwk;
const key = await crypto.subtle.importKey("jwk", pub, { name: "Ed25519" }, false, ["verify"]);
const ok = await crypto.subtle.verify({ name: "Ed25519" }, key, Buffer.from(r.sig, "base64url"), msg);
console.log(ok && hex === r.digest && pub.x === r.body.key.x ? "VALID" : "INVALID");

Όρια. Διαβάστε τα πριν βασιστείτε στο αποτέλεσμα

  • Κάλυψη: ΗΠΑ — CourtListener (σε λειτουργία· ορισμένες πολιτειακές και παλαιότερες συλλογές είναι ελλιπείς). Ηνωμένο Βασίλειο — Find Case Law (beta· αξιόπιστο από το 2022). ΕΕ — EUR-Lex, Δικαστήριο και Γενικό Δικαστήριο (beta). ΕΔΔΑ — HUDOC (beta). Κάθε αποτέλεσμα έχει πεδίο jurisdiction.
  • Οι παραπομπές Westlaw (WL), Lexis και δημόσιου τομέα δεν μπορούν να ελεγχθούν σε ανοιχτή βάση, γι' αυτό σημειώνονται unverifiable.
  • Η αντιστοίχιση ονόματος γίνεται ανά λέξη (≥ 0,5). Πολύ σύντομα ή ασυνήθιστα ονόματα υποθέσεων μπορεί να δώσουν mismatch σε πραγματική υπόθεση. Ανοίγετε πάντα τον σύνδεσμο της πηγής.
  • Επαληθεύουμε την ύπαρξη και την ταυτότητα της υπόθεσης, όχι αν στηρίζει το επιχείρημα.