כניסההרשמה
YHD Proof

YHD Proof API

רישום טביעות אצבע של מסמכים בבלוקצ'יין Base ושליחה רשומה, ישירות מהמערכות שלכם. JSON, אימות עם Bearer. מפרט OpenAPI: /api/v1/openapi.json

1. מפתח API

נכנסים לחשבון ← מפתחות API ← יצירה. המפתח מוצג פעם אחת ונשמר אצלנו רק כטביעה. שולחים אותו בכותרת:

Authorization: Bearer yhd_...

2. מחשבים SHA-256 אצלכם

ברישום הוכחה הקובץ לא נשלח אלינו, רק טביעת האצבע שלו (64 תווים הקסדצימליים).

# shell
sha256sum contract.pdf

# Python
import hashlib
h = hashlib.sha256(open("contract.pdf", "rb").read()).hexdigest()

// JavaScript (browser / Node 18+)
const buf = await file.arrayBuffer();            // Node: await fs.promises.readFile("contract.pdf")
const dig = await crypto.subtle.digest("SHA-256", buf);
const h = [...new Uint8Array(dig)].map(b => b.toString(16).padStart(2, "0")).join("");

3. רישום הוכחה · POST /api/v1/proofs

curl -X POST https://proof.yhdblock.com/api/v1/proofs \
  -H "Authorization: Bearer $YHD_KEY" -H "Content-Type: application/json" \
  -d "{\"hash\":\"$(sha256sum contract.pdf | cut -d' ' -f1)\",\"label\":\"Contract 12/2026\"}"

# Python
import requests
r = requests.post("https://proof.yhdblock.com/api/v1/proofs", headers={"Authorization": f"Bearer {KEY}"},
                  json={"hash": h, "label": "Contract 12/2026"})
print(r.json())   # {"id": "0x...", "status": "confirmed", "tx": "0x...", "certificate_url": ...}

// JavaScript
const r = await fetch("https://proof.yhdblock.com/api/v1/proofs", {method: "POST",
  headers: {"Authorization": `Bearer ${KEY}`, "Content-Type": "application/json"},
  body: JSON.stringify({hash: h})});
console.log(await r.json());

התשובה חוזרת אחרי האישור ברשת (בדרך כלל כמה שניות). אם הטביעה כבר רשומה מוחזר 200 עם already_registered, בלי עסקה חדשה.

4. אימות ציבורי · GET /api/v1/proofs/<hash>

בלי מפתח. ה-id של הוכחה הוא טביעת האצבע עצמה.

curl https://proof.yhdblock.com/api/v1/proofs/0x<64 hex>

5. רשימת ההוכחות שלכם · GET /api/v1/proofs?page=1&per_page=50

curl -H "Authorization: Bearer $YHD_KEY" "https://proof.yhdblock.com/api/v1/proofs?page=1&per_page=50"

6. שליחה רשומה · POST /api/v1/deliveries

כאן הקובץ כן מועלה (עד 10MB) ונשמר באופן פרטי, כדי שהנמען יוכל להוריד אותו. לרשת נכנסות רק טביעות.

curl -X POST https://proof.yhdblock.com/api/v1/deliveries -H "Authorization: Bearer $YHD_KEY" \
  -F file=@letter.pdf -F recipient_email=client@example.com -F recipient_name="Dana" \
  -F subject="התראה לפני נקיטת הליכים" -F message="מצורף מכתב"

# Python
r = requests.post("https://proof.yhdblock.com/api/v1/deliveries", headers={"Authorization": f"Bearer {KEY}"},
    files={"file": open("letter.pdf", "rb")},
    data={"recipient_email": "client@example.com", "subject": "Notice"})
did = r.json()["id"]
status = requests.get(f"https://proof.yhdblock.com/api/v1/deliveries/{did}", headers={"Authorization": f"Bearer {KEY}"}).json()
# status["events"], status["anchors"], status["certificate_url"], status["verify_url"]

7. Webhook

מגדירים כתובת https במסך מפתחות ה-API. על כל הוכחה שנרשמה דרך ה-API נשלח POST עם האירוע proof.confirmed. כך מאמתים את החתימה:

import hmac, hashlib
expected = "sha256=" + hmac.new(SECRET.encode(), f"{ts}.{raw_body}".encode(), hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers["X-YHD-Signature"])   # ts = X-YHD-Timestamp

8. לדג'ר ציבורי

פרסום מסמך לציבור, או רק טביעת אצבע שלו, עם רישום בבלוקצ'יין. צריך להפעיל קודם פרופיל ציבורי במסך "פרסום ציבורי". קובץ שמועלה הופך לציבורי ואי אפשר למחוק אותו. קטגוריות: decision, protocol, tender, budget, contract, report, other. גודל מקסימלי 20MB. גרסה מתוקנת: שולחים prev_id.

# publish a public file
curl -X POST https://proof.yhdblock.com/api/v1/ledger -H "Authorization: Bearer $YHD_KEY" \
  -F title="פרוטוקול ישיבת מועצה 12/2026" -F category=protocol -F doc_date=2026-10-20 -F file=@protocol.pdf

# hash only (private document, file never leaves your machine)
curl -X POST https://proof.yhdblock.com/api/v1/ledger -H "Authorization: Bearer $YHD_KEY" -H "Content-Type: application/json" \
  -d '{"title":"חוזה ספק","category":"contract","hash":"0x'$(sha256sum contract.pdf | cut -d' ' -f1)'"}'

# public list / search (no auth)
curl "https://proof.yhdblock.com/api/v1/ledger?q=מועצה&cat=protocol&from=2026-01-01&page=1"
import requests
r = requests.post("https://proof.yhdblock.com/api/v1/ledger", headers={"Authorization": f"Bearer {KEY}"},
                  data={"title": "תקציב 2027", "category": "budget"}, files={"file": open("budget.pdf", "rb")})
print(r.json()["url"], r.json()["tx"])
const fd = new FormData();
fd.append("title", "דוח שנתי"); fd.append("category", "report"); fd.append("file", fileInput.files[0]);
const r = await fetch("https://proof.yhdblock.com/api/v1/ledger", {method: "POST", headers: {Authorization: `Bearer ${KEY}`}, body: fd});
console.log(await r.json());

פידים: ledger.yhdblock.com/feed.xml · ledger.yhdblock.com/feed.json (אפשר לסנן עם org, cat, q). אירוע webhook: ledger.published.

9. כספת מסמכים (פרטי)

שמירת קבצים פרטית, מוצפנת ב-AES-256-GCM, עם רישום טביעת אצבע אוטומטי בבלוקצ'יין. עד 20MB לקובץ ו-500MB לארגון. אין קישורים ציבוריים, והורדה אפשרית רק עם מפתח של הארגון.

curl -X POST https://proof.yhdblock.com/api/v1/vault -H "Authorization: Bearer $YHD_KEY" -F file=@contract.pdf -F label="חוזה ספק" -F folder=חוזים -F tags=2026,ספקים
curl -H "Authorization: Bearer $YHD_KEY" "https://proof.yhdblock.com/api/v1/vault?q=חוזה"
curl -H "Authorization: Bearer $YHD_KEY" -OJ https://proof.yhdblock.com/api/v1/vault/<id>/download   # X-Hash-Matches-Proof: true
r = requests.post("https://proof.yhdblock.com/api/v1/vault", headers={"Authorization": f"Bearer {KEY}"}, files={"file": open("contract.pdf", "rb")}, data={"folder": "חוזים"})
vid = r.json()["id"]
pdf = requests.get(f"https://proof.yhdblock.com/api/v1/vault/{vid}/download", headers={"Authorization": f"Bearer {KEY}"}).content
const fd = new FormData(); fd.append("file", fileInput.files[0]); fd.append("label", "דוח");
const doc = await (await fetch("https://proof.yhdblock.com/api/v1/vault", {method: "POST", headers: {Authorization: `Bearer ${KEY}`}, body: fd})).json();

10. תעודות (YHD Credentials)

הנפקת תעודות שאפשר לאמת. כל תעודה היא JSON קנוני עם "מלח" סודי, ממנו מחושב SHA-256. התעודות במנה מתחברות לעץ מרקל (זוגות ממוינים), ורק השורש נרשם ב-Base, בטרנזקציה אחת למנה. מידע אישי לא נרשם ברשת. ביטול רושם את ה-hash של רשימת הביטולים. התבניות נוצרות בדשבורד, ו-GET /api/v1/credentials/templates מחזיר את המזהים שלהן.

curl -X POST https://proof.yhdblock.com/api/v1/credentials -H "Authorization: Bearer $YHD_KEY" -H "Content-Type: application/json" -d '{"template_id":1,"credentials":[{"recipient_name":"דנה כהן","email":"dana@example.com","issue_date":"2026-10-25","fields":{"שעות":"40"}},{"recipient_name":"יוסי לוי"}]}'
curl -H "Authorization: Bearer $YHD_KEY" https://proof.yhdblock.com/api/v1/credentials/<id>
curl -X POST https://proof.yhdblock.com/api/v1/credentials/<id>/revoke -H "Authorization: Bearer $YHD_KEY" -H "Content-Type: application/json" -d '{"reason":"הונפקה בטעות"}'
curl -X POST https://proof.yhdblock.com/api/v1/credentials/verify -H "Content-Type: application/json" -d '{"id":"<id>","secret":"<secret>"}'
r = requests.post("https://proof.yhdblock.com/api/v1/credentials", headers={"Authorization": f"Bearer {KEY}"}, json={"template_id": 1, "credentials": rows})
for c in r.json()["items"]: print(c["recipient_name"], c["verify_url"])   # verify_url = https://credentials.yhdblock.com/c/<id>#<secret>
const v = await (await fetch("https://proof.yhdblock.com/api/v1/credentials/verify", {method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({id, secret})})).json();
console.log(v.status, v.merkle.ok);   // "valid" | "expired" | "revoked"

מגבלות ושגיאות

עד 20 רישומים ו-20 שליחות ביום לארגון, ועד 50 פעולות כתיבה ביום לכל מפתח, כמו בממשק הרגיל. כל פעולת API נרשמת ביומן הפעולות של הארגון. קודי שגיאה: 400 קלט לא תקין · 401 מפתח לא תקין · 403 אין פרופיל ציבורי · 413 קובץ גדול · 429 מגבלה · 502 תקלה ברשת · 503 רישום מושהה. גוף השגיאה: {"error": "..."}