ReGenerate
תיאור כל ה-Endpoints English

מתחילים כאן — ה-API של ReGenerate לרשתות

ממייל ההזמנה ועד הקודים הראשונים, ב-sandbox, בסדר הזה. הכול כאן רץ כפי שהוא מודפס אחרי שמגדירים שתי שורות; כשזה עובד ב-sandbox, הייצור הוא אותן קריאות עם כתובת ומפתח אחרים.

העמודים האלה שייכים ל-sandbox: כל דוגמה קוראת ל-https://api-sandbox.regenerate.co.il/v1 עם מפתח rg_test_, ללא כסף אמיתי. הייצור הוא אותן קריאות ב-https://api.regenerate.co.il/v1

שתי סביבות

Sandboxייצור
פורטלhttps://sandbox.regenerate.co.ilhttps://app.regenerate.co.il
כתובת הבסיס של ה-APIhttps://api-sandbox.regenerate.co.il/v1https://api.regenerate.co.il/v1
המפתחות מתחילים ב-rg_test_rg_live_
כסףאין: ה-Admin טוען ארנק בדיקההארנק האמיתי שלכם
קודיםממערכות הבדיקה של הספקים, או מסומנים כקודי בדיקהכרטיסים אמיתיים

ב-sandbox אותו קטלוג כמו בייצור: אותם קודים ציבוריים (RG-…), שמות, ערכים והמחירים שלכם. מפתח שייך לסביבה שהנפיקה אותו, ולכל סביבה פורטל, חשבון ורשימת כתובות משלה.

1. כניסה לפורטל

מנהל הלקוח פותח את החשבון ואתם מקבלים הזמנה מ-no-reply@regenerate.co.il. היא בעברית — הנושא הוא “הזמנה לפלטפורמת ReGenerate” — והקישור בה תקף ל-72 שעות ולשימוש אחד.

הקישור מבקש סיסמה: לפחות 8 תווים, עם אות גדולה, אות קטנה, ספרה וסימן. אחר כך מצמדים אפליקציית אימות (Google Authenticator, Microsoft Authenticator, ‏1Password או כל אפליקציית TOTP): סורקים את התמונה, או בטלפון שמחזיק את האפליקציה לוחצים “הוספה לאפליקציית האימות”, או מעתיקים את המפתח ידנית. מזינים את שש הספרות שהיא מציגה.

מאז, כל כניסה מבקשת קוד בן שש ספרות, וכך גם כל פעולה רגישה בפורטל: הנפקה, החלפה או ביטול של מפתח, שינוי רשימת הכתובות או מתג ההפעלה, הצגה או הורדה של קודים. קוד עובד פעם אחת; אם צריך שניים, המתינו לבא.

קישור שפג אפשר לשלוח שוב מהעמוד שהוא פותח. אחרי הכניסה הפורטל נפתח בעמוד הסקירה.

2. רשימת הכתובות

סקירה ← מפתח API ← “מאילו כתובות ההתממשקות שלכם רשאית לקרוא”. רשמו את הכתובות שמהן ההתממשקות קוראת: כתובות בודדות, או בלוקים שאינם רחבים מ-‎/24 (IPv4) או מ-‎/64 (IPv6).

ב-sandbox הרשימה היא רשות: בלעדיה כל כתובת יכולה לקרוא. בייצור היא חובה: עד שנשמרת רשימה, כל בקשת טוקן נדחית ב-forbidden עם הודעה שמפנה לעמוד הזה; רשימת ייצור שנשמרה אפשר להחליף אך לא לרוקן.

רשמו את הכתובת של השרת שקורא, לא של הדפדפן שבו אתם קוראים את זה. מהשרת הזה, curl -s https://checkip.amazonaws.com מדפיס אותה. הפורטל מציג את הכתובת שממנה מגיע הדפדפן, והיא זהה רק כשהדפדפן וההתממשקות יוצאים מאותו חיבור משרדי.

מתג ההפעלה שליד הרשימה עוצר מיד כל קריאה עם מפתחות הסביבה הזו, עד שמפעילים אותו שוב.

3. קבלת מפתח

סקירה ← מפתח API ← “הנפקת מפתח” (או “החלפת מפתח” כשכבר יש), וקוד טרי. המפתח מוצג פעם אחת, בחלון הזה: העתיקו אותו למנגנון הסודות לפני הסגירה. אנחנו שומרים גיבוב ולא את המפתח, ולכן אי אפשר להציג אותו שוב.

החלפה מנפיקה מפתח חדש ומשאירה את הישן עובד 24 שעות, כדי שצי קופות יעבור בלי השבתה. ביטול, ליד כל מפתח, עוצר את המפתח מיד — המקרה של מפתח שהגיע לידיים הלא נכונות — ואיתו נעצרים הטוקנים שהנפיק.

4. הקריאות, במעטפת אחת

הריצו את הבלוק הראשון — הוא מגדיר את BASE ומבקש את המפתח — ואז את הבלוקים לפי הסדר באותה מעטפת (bash או zsh); כל אחד משתמש במה שהקודמים הגדירו. צריך curl ו-jq. סכומים הם מספרים שלמים ביחידות משנה: אגורות לשקלים, סנטים לדולרים.

לאן קוראים, והמפתח שלכם. הדביקו אותו כשהוא מתבקש ולא בתוך שורת הפקודה, שם הוא היה נשאר בהיסטוריה של המעטפת.

# Once per shell. The sandbox: rg_test_ keys, no real money. For production change these two lines only.
BASE=https://api-sandbox.regenerate.co.il/v1
# Paste the rg_test_ key when asked; read -s keeps it off the screen and out of your history.
printf 'API key: '; read -rs KEY; echo

מחליפים את המפתח בטוקן. הוא תקף שעה; כשקריאה עונה 401 unauthenticated, קבלו טוקן חדש עם המפתח וחזרו על הקריאה.

# A token, valid for one hour. The key goes to this endpoint and no other.
ANSWER=$(curl -s -X POST "$BASE/auth/token" \
  -H 'content-type: application/json' \
  -d "{\"apiKey\":\"$KEY\"}")
TOKEN=$(echo "$ANSWER" | jq -r '.accessToken // empty')
# No token: the refusal says why, and section 7 says what to do about it.
if [ -n "$TOKEN" ]; then echo "token: ${TOKEN:0:12}..."; else echo "$ANSWER"; fi

הארנק שלכם.

# The wallet, in agorot: 200000 is ₪2,000.00.
curl -s "$BASE/balance" -H "authorization: Bearer $TOKEN"

הקטלוג, במחיר שלכם. כל SKU הוא קוד ציבורי: RG- ושישה תווים, ספרות ואותיות גדולות בלי 0, O, 1, I ו-L (‏RG-7KQ4MX). הוא קבוע, זהה ב-sandbox ובייצור, ואינו אומר דבר — אין בו ספק, מוצר או ערך, ולכן לעולם אל תפרקו אותו. כמה SKU יכולים לחלוק productName: מותג עם ערכים רבים הוא מוצר אחד עם SKU לכל ערך, ותמיד מזמינים לפי SKU. לכרטיס בסכום חופשי pricingMode: "range": שולחים requestedAmount בתוך minAmount…maxAmount, בכפולות של stepAmount, במטבע של הכרטיס (faceCurrency). חלק מהכרטיסים בסכום חופשי מוצעים גם בערכים מוכנים — אלה SKU קבועים רגילים, ומזמינים אותם כמו כל אחד אחר. price תמיד באגורות; faceValue במטבע הכרטיס, ו-faceValueInIls נותן אותו באגורות לפי אותו שער. cardNote היא ההערה של המוצר, זהה בכל ה-SKU שלו; valueNote היא הערה ל-SKU הזה בלבד — הציגו את שתיהן במקום שבו הלקוח שלכם בוחר כרטיס. המחירים זזים עם שער החליפין: קראו את הקטלוג כל כמה דקות, לא פעם ביום.

# The catalogue at your price. One entry per SKU.
curl -s "$BASE/catalog" -H "authorization: Bearer $TOKEN" | jq '.items[0]'

# The cheapest fixed-value card you can buy now:
SKU=$(curl -s "$BASE/catalog" -H "authorization: Bearer $TOKEN" \
  | jq -r '[.items[] | select(.available and .pricingMode == "fixed")] | sort_by(.price) | .[0].sku')
echo "sku: $SKU"

לפני הזמנה גדולה: האם ה-SKU נמכר עכשיו, ו-maxQuantityPerOrder. כרטיס ששוויו מעל 200 דולר נמכר אחד בהזמנה, אלא אם מנהל הלקוח הגדיל זאת עבורכם; כאן רואים את המספר.

# Whether it sells now, and how many you may order at once.
curl -s "$BASE/catalog/$SKU/availability" -H "authorization: Bearer $TOKEN"

יוצרים הזמנה. reference שלכם: 8 עד 128 אותיות, ספרות ו-. _ : -, ייחודית לכל הזמנה. התשובה מיידית וההזמנה במצב created, לפני שהספק מסר. הזמינו כל כמות שהחשבון מתיר — גודל המנות של הספקים הוא עניין שלנו.

# Your reference is the idempotency key: unique per order, the same on every retry.
REF="TILL-0001-$(date -u +%Y%m%d%H%M%S)"
curl -s -X POST "$BASE/orders" \
  -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d "{\"sku\":\"$SKU\",\"quantity\":1,\"reference\":\"$REF\"}"

שלחו את אותה אסמכתא שוב — אחרי timeout, למשל — ותקבלו את ההזמנה הראשונה עם 200, אף פעם לא חיוב שני. האסמכתא קובעת: בקשה שנייה עם אותה אסמכתא וגוף אחר עדיין מחזירה את ההזמנה הראשונה, ולכן השוו את sku ואת quantity בתשובה אם הקוד שלכם עלול לשלוח הזמנות שונות תחת אסמכתא אחת.

# The same request again is the same order, not a second one: 200 instead of 201.
curl -s -o /dev/null -w '%{http_code}\n' -X POST "$BASE/orders" \
  -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d "{\"sku\":\"$SKU\",\"quantity\":1,\"reference\":\"$REF\"}"

ממתינים כל עוד המצב created או processing. ‏delivered אומר שהקודים מוכנים. ‏failed ו-refunded סופיים, והארנק כבר זוכה. Webhook ‏(POST /webhooks, בתיאור ה-Endpoints) מודיע במקום שתשאלו.

# Poll until the order is final (or register a webhook and be told).
until curl -s "$BASE/orders/$REF" -H "authorization: Bearer $TOKEN" \
  | jq -e '.status == "delivered" or .status == "failed" or .status == "refunded"' > /dev/null
do sleep 3; done
curl -s "$BASE/orders/$REF" -H "authorization: Bearer $TOKEN" | jq '{status, codesAvailable}'

קוראים את הקודים של הזמנה שנמסרה: מספר כרטיס, PIN כשיש לכרטיס, קישור למימוש כשהספק נותן, תוקף. כל שליפה נספרת ונרשמת.

# The codes. Store them: this is a retrieval endpoint, not a vault.
curl -s "$BASE/orders/$REF/codes" -H "authorization: Bearer $TOKEN" | jq '.codes'

ההזמנות של יום, החדשות קודם, לכל היותר 50 בעמוד; total סופר את כל ההזמנות המתאימות.

# A day of orders, for reconciliation (dates are calendar days in Israel time).
curl -s "$BASE/orders?from=$(date -u +%Y-%m-%d)&to=$(date -u +%Y-%m-%d)&pageSize=50" \
  -H "authorization: Bearer $TOKEN" | jq '{total, first: .items[0].reference}'

5. אותן הזמנות בפורטל

כל הזמנה שההתממשקות יוצרת מופיעה בפורטל בדוחות ההזמנות, עם האסמכתא שלכם לידה; חפשו לפי אסמכתא או מזהה הזמנה, וסננו לפי תאריכים ומוצר. “ייצוא לאקסל” נותן את רשימת ההזמנות — בלי קודים, ובלי צורך בקוד חד-פעמי.

גם הקודים של הזמנה נמצאים שם, אחרי קוד טרי. הזמנה של כרטיס אחד מציעה “הצגת הקוד”: הקוד על המסך עם כפתור העתקה למשך 60 שניות, ואז מוסתר. הזמנה של כמה כרטיסים מציעה “הורדת Excel”: הקודים נכנסים לקובץ, שורה לכל קוד, ולעולם לא למסך.

6. החזרים וכשלים

הזמנה עוברת created ← processing ← delivered. אם הספק דוחה אותה, היא עוברת ל-failed ואז ל-refunded, והמחיר חוזר לארנק — בדקו ב-GET /balance. תקלה קצרה אצל ספק נוסית שוב עד רבע שעה בזמן שההזמנה נשארת processing; רק אז היא נכשלת ומזוכה.

הזמנה שנמסרה יכולה להפוך ל-refunded גם מאוחר יותר, כשה-Admin מזכה אותה לבקשתכם.

אחרי failed או refunded, צרו הזמנה חדשה עם אסמכתא חדשה אם עדיין רוצים את הכרטיס. לעולם אל תנסו שוב הזמנה שנדחתה או זוכתה תחת האסמכתא הישנה: זה מחזיר את ההזמנה הישנה.

7. כל שגיאה, ומה לעשות

לכל דחייה אותו גוף: {"error":{"code","message","requestId"}}. הסתעפו לפי code; ההודעה נועדה לאנשים ועשויה להשתנות. נסו שוב רק מה שהטבלה אומרת שבטוח, ותמיד עם אותה אסמכתא.

קודHTTPמה לעשות
validation_failed400הבקשה אינה תקינה; error.details מציין את השדה. תקנו את הבקשה; אל תשלחו אותה שוב כמו שהיא.
unauthenticated401אין טוקן, הטוקן פג (הוא תקף שעה), או שהמפתח בוטל או הוחלף. קבלו טוקן חדש עם המפתח; אם המפתח עצמו נדחה, הנפיקו מפתח חדש בפורטל.
forbidden403ההודעה אומרת מה: הסביבה כבויה בפורטל, בייצור עדיין אין רשימת כתובות, הקריאה הגיעה מכתובת שאינה ברשימה, או שהחשבון חסום. תקנו בפורטל, או פנו למנהל הלקוח אם החשבון חסום.
not_found404אין SKU או הזמנה כאלה בחשבון. בדקו את ה-SKU מול הקטלוג; הזמנה נמצאת לפי המזהה שלה או לפי האסמכתא שלכם.
conflict409ההזמנה עוד לא מוכנה לפעולה הזו — בדרך כלל בקשת קודים לפני המסירה. המתינו ל-delivered ובקשו שוב.
insufficient_balance422בארנק פחות ממחיר ההזמנה. לא חויב דבר. טענו דרך מנהל הלקוח (ב-sandbox ה-Admin טוען), והזמינו שוב.
quantity_limit_exceeded422יותר ממה שהזמנה אחת יכולה לשאת. שתי מגבלות: הכמות להזמנה שנקבעה לחשבון, וכרטיס אחד בהזמנה לכרטיס ששוויו מעל 200 דולר, אלא אם מנהל הלקוח הגדיל אותה. GET /catalog/{sku}/availability מחזיר את maxQuantityPerOrder; פצלו את ההזמנה.
amount_out_of_range422סכום חופשי מחוץ ל-minAmount…maxAmount, שאינו כפולה של stepAmount, או מעל התקרה להזמנה של החשבון. שלחו סכום בתוך הטווח.
product_unavailable422ה-SKU אינו נמכר כרגע. קראו את הקטלוג שוב; אל תחזרו על אותו SKU בלולאה.
pricing_rule_incompatible422הגדרת תמחור אצלנו אינה מתאימה לכרטיס. זה לא בידיים שלכם: מסרו למנהל הלקוח את ה-SKU.
rate_limited429יותר מ-60 בקשות בדקה במפתח הזה. המתינו Retry-After שניות והמשיכו.
internal_error500תקלה אצלנו. בטוח לנסות שוב עם אותה אסמכתא; אם זה חוזר, מסרו את error.requestId.
supplier_unavailable502לא הייתה גישה לספק של הכרטיס. בטוח לנסות שוב עם אותה אסמכתא.
supplier_rejected502הספק דחה את ההזמנה. היא failed ואחר כך refunded, והארנק זוכה. אל תנסו שוב תחת אותה אסמכתא — זה מחזיר את ההזמנה שנדחתה; הזמינו שוב עם אסמכתא חדשה, או SKU אחר.
service_unavailable503חלק מהמערכת אינו זמין כרגע. נסו שוב מאוחר יותר עם אותה אסמכתא.

8. הגבלת קצב

60 בקשות בדקה לכל מפתח. כל תשובה נושאת X-RateLimit-Limit, X-RateLimit-Remaining ו-X-RateLimit-Reset; דחייה היא 429 עם Retry-After בשניות. תהליך התאמה על מפתח משלו לא יכול לנצל את המכסה של הקופות. מכסה גבוהה יותר היא הגדרה בחשבון: פנו למנהל הלקוח.

9. מעבר לייצור

מחליפים את כתובת הבסיס ואת המפתח, ולא שום דבר אחר. הקודים הציבוריים, השמות, הערכים והמחירים שלכם זהים בשני הצדדים, ולכן הקוד שעובד ב-sandbox עובד בייצור בלי שינוי.

לפני הקריאה הראשונה: היכנסו לפורטל הייצור (הזמנה נפרדת), שמרו שם את רשימת הכתובות — הייצור דוחה כל קריאה בלעדיה — והנפיקו מפתח rg_live_. הייצור מחייב את הארנק האמיתי שלכם ומוסר כרטיסים אמיתיים.

אוסף בקשות

אותן קריאות כאוסף Postman, עם סביבה לכל צד. ייבאו את האוסף ואת הסביבה שמסומנת כסביבה של העמודים האלה, הדביקו את המפתח ב-apiKey והריצו את הבקשות לפי הסדר: בקשת הטוקן שומרת את הטוקן, בקשת הקטלוג בוחרת SKU, ובקשת ההזמנה יוצרת אסמכתא משלה. בלי סביבה, האוסף קורא ל-API שהעמודים האלה שייכים לו.