API ndị mmekọ, ụdị 1

Ule n'ime weebụsaịtị nke gị

Gosi ule omume anyị na ibe gị, ma ọ bụ jiri ule i dere n'onwe gị: sava gị na-amalite ule, onye na-ese ule na-eme ya n'ibe gị, nsonaazụ na-alaghachikwa n'aka gị.

Adreesị API
https://www.supergb.com/cbt/partner-api/v1

Otú o si jikọta

  1. Mepụta igodo ma tinye weebụsaịtị gị na console.
  2. Maka ule omume, mado akụkụ koodu ahụ n'ibe gị.
  3. Maka ule nke gị, sava gị na-amalite ule ma nata adreesị mmalite.
  4. Ibe gị na-emepe ya, onye na-ese ule na-eme ule ahụ, nsonaazụ na-erukwa gị site na webhook ma ọ bụ API.

Igodo

pk_test_ pk_live_
Igodo enwere ike ibipụta na-aga n'ibe weebụ gị. Ha na-emepe naanị ule omume na weebụsaịtị ndị i depụtara.
sk_test_ sk_live_
Igodo sava na-arụ ọrụ maka nzukọ gị. Debe ha na sava gị, ezigala ha na nchọgharị.

Igodo ule na-arụ ọrụ ozugbo, anaghị agụkwa ha na atụmatụ gị. Igodo live chọrọ ka a kwado akaụntụ gị.

Ule omume

Tinye script ahụ otu ugboro, mgbe ahụ tinye ule ebe ọ bụla ịchọrọ. Etiti ahụ na-agbanwe onwe ya ka o kwekọọ na ọdịnaya ya.

<div id="gb-test"></div>
<script src="https://www.supergb.com/cbt/js/embed/v1.js"></script>
<script>
  GreenBridge.mount("#gb-test", { key: "pk_live_...", paper: "PAPER_ID" });
</script>

Ule ahụ bụ id e gosiri na onye nrụpụta koodu dị na console gị. Tinye mode: "exam" maka ọnọdụ ule nwere oge.

Ule nke gị

Dee ule na console n'okpuru Ule ma mepee ha. Mgbe onye na-ese ule dị njikere, sava gị na-amalite ule:

curl -X POST https://www.supergb.com/cbt/partner-api/v1/sessions \
  -H "Authorization: Bearer $GREEN_BRIDGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"test_id": "TEST_ID", "language": "fr", "candidate": {"id": "learner-42", "name": "Ada Obi", "email": "ada@example.com"}}'

candidate.id bụ id nke gị maka onye ahụ, ruo mkpụrụedemede 128. Aha na email abụghị iwu; naanị ihe i zitere ka anyị na-edebe.

language abụghị iwu: otu n'ime de, en, es, fr, yo, ig, ha, nl, pt, sw. Bọtịnụ, elekere na ozi nke ule ahụ ga-apụta n'asụsụ ahụ; ajụjụ gị ga-adị ka i si dee ha. Na-enweghị ya, ule ahụ ga-abụ n'asụsụ Bekee.

Azịza ya nwere adreesị mmalite na-arụ ọrụ otu ugboro, n'ime nkeji 10. Mepee ya n'ibe gị:

HTTP/1.1 201 Created

{
  "attempt_id": "att_...",
  "launch_token": "lt_...",
  "launch_url": "https://www.supergb.com/cbt/fr/embed/v1/test?launch=lt_...",
  "launch_expires_at": "2026-10-23T09:10:00Z",
  "live": true,
  "language": "fr"
}
<div id="gb-test"></div>
<script src="https://www.supergb.com/cbt/js/embed/v1.js"></script>
<script>
  GreenBridge.mountTest("#gb-test", {
    launchUrl: "LAUNCH_URL_FROM_YOUR_SERVER",
    onEvent: function (event) {
      if (event.type === "submitted") {
        showThanks(event.detail.attempt_id);
      }
    }
  });
</script>

Ozugbo e meghere ya, ule na-adịru awa 24, imegharị ibe na-aga n'ihu na ya. Onye ọ bụla na-ese ule ọ bụla otu ugboro.

Iji depụta ule gị na id ha:

curl https://www.supergb.com/cbt/partner-api/v1/tests -H "Authorization: Bearer $GREEN_BRIDGE_KEY"

Ozi si n'etiti

onEvent na-anata ndị a, naanị site n'etiti anyị:

Ihe omumeIhe ọ pụtara
readyIbe ahụ ebunyela.
resizeOgologo ọdịnaya agbanweela. Etiti ahụ na-eso ya n'onwe ya.
completedE nyela ule omume akara. detail nwere score na max_score.
submittedE zipụla ule. detail nwere attempt_id. Nweta nsonaazụ site na sava gị, ọ bụghị site na nchọgharị.

Nsonaazụ

Ule e zipụrụ, nke kachasị ọhụrụ na mbụ, 50 n'otu ibe. Họrọ site na test_id, candidate_id ma ọ bụ ha abụọ.

curl "https://www.supergb.com/cbt/partner-api/v1/attempts?test_id=TEST_ID&page=0" -H "Authorization: Bearer $GREEN_BRIDGE_KEY"
curl https://www.supergb.com/cbt/partner-api/v1/attempts/ATTEMPT_ID -H "Authorization: Bearer $GREEN_BRIDGE_KEY"

Otu ule dị ka nke a. questions dị na ya site n'atụmatụ Growth gaa n'elu.

{
  "id": "att_...",
  "test_id": "TEST_ID",
  "candidate_id": "learner-42",
  "live": true,
  "language": "fr",
  "started_at": "2026-10-23T09:02:11Z",
  "submitted_at": "2026-10-23T09:41:57Z",
  "integrity_events": 0,
  "score": 34.0,
  "max_score": 40.0,
  "percent": 85.0,
  "grading_status": "fully_graded",
  "questions": [
    {"question_id": "q1", "type": "multiple_choice_question", "score": 1.0, "max_score": 1.0}
  ]
}

grading_status bụ fully_graded mgbe ọ dịghị ihe fọdụrụ a ga-eji aka nye akara, ma ọ bụghị pending_manual_review ma ọ bụ pending_transcription.

Webhook

Tinye ihe ruru adreesị https 5 na console gị. A na-ezipụ ihe omume ọ bụla dị ka POST bịanyere aka, a na-anwaghachikwa ya ruo ụbọchị 3 ruo mgbe sava gị zara na ọnọdụ 2xx.

Ihe omumeIhe ọ pụtara
attempt.startedOnye na-ese ule mepere ule ahụ.
attempt.submittedOnye na-ese ule zipụrụ.
attempt.gradedAkara niile kwụsiri ike. A na-ezipụ ya ọzọ mgbe ọ bụla akara gbanwere.
attempt.integrity_flaggedOnye na-ese ule hapụrụ ule ma ọ bụ nwara idetuo ma ọ bụ mado ugboro 3.
pingIhe omume ule e zipụrụ site na console gị.
POST /hooks/green-bridge
Content-Type: application/json
Green-Bridge-Event: attempt.graded
Green-Bridge-Delivery: whd_...
Green-Bridge-Signature: t=1792834917,v1=5f0c...

{
  "id": "evt_graded_att_..._1",
  "type": "attempt.graded",
  "created_at": "2026-10-23T10:21:57Z",
  "data": { "id": "att_...", "candidate_id": "learner-42", "score": 34.0, "max_score": 40.0, "grading_status": "fully_graded" }
}

Id nke ihe omume anaghị agbanwe, ya mere ị nwere ike ileghara nke i lebara anya anya n'enweghị nsogbu.

Ilele mbinye aka

Gbakọọ HMAC-SHA256 nke t, otu ntụpọ na ahụ arịrịọ dịka ọ dị, site na nzuzo mbinye aka gị, ma tụnyere ya na v1. Jụ oge karịrị nkeji ise.

Node.js

const crypto = require("crypto");

function isFromGreenBridge(header, rawBody, secret) {
  const parts = Object.fromEntries(header.split(",").map(part => part.split("=")));
  if (!parts.t || !parts.v1 || Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) {
    return false;
  }
  const expected = crypto.createHmac("sha256", secret).update(parts.t + "." + rawBody).digest("hex");
  return expected.length === parts.v1.length
    && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Python

import hashlib, hmac, time

def is_from_green_bridge(header, raw_body, secret):
    parts = dict(part.split("=", 1) for part in header.split(","))
    if "t" not in parts or abs(time.time() - int(parts["t"])) > 300:
        return False
    signed = parts["t"].encode() + b"." + raw_body
    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))

Njehie

Njehie na-alaghachi dị ka JSON nwere koodu anaghị agbanwe:

HTTP/1.1 404 Not Found

{"error": {"code": "test_not_found"}}
Koodu HTTP Ihe ọ pụtara
invalid_key 401 Igodo ahụ adịghị, amaghị ya, ma ọ bụ a kagburu ya.
partner_suspended 403 A kwụsịtụrụ akaụntụ gị. Kpọtụrụ anyị.
live_keys_need_approval 403 Igodo live na-arụ ọrụ ozugbo a kwadoro akaụntụ gị.
not_on_plan 403 Atụmatụ gị enweghị nke a.
test_not_found 404 Ọ dịghị ule gị nwere id ahụ.
attempt_not_found 404 Ọ dịghị ule e mere nke gị nwere id ahụ.
candidate_not_found 404 Ị nweghị onye na-ese ule nwere id ahụ.
test_not_open 409 Ule ahụ emepebeghị ma ọ bụ e mechiela ya.
already_submitted 409 Onye a ezipụlarị ule a.
invalid_request 400 Otu ubi adịghị ma ọ bụ o nweghị ụdị a tụrụ anya.
monthly_limit_reached 429 Oke ọnwa a agwụla. Igodo ule ka na-arụ ọrụ.
internal_error 500 Ihe mebiri n'akụkụ anyị. Nwaa ọzọ.

Oke na data

  • Ihe ruru arịrịọ 300 kwa nkeji maka igodo sava ọ bụla. Karịa nke ahụ, azịza bụ 429 na-enweghị ọdịnaya; chere otu nkeji ma nwaa ọzọ.
  • Ule live na akara AI na-agụ na oke kwa ọnwa nke atụmatụ gị. Anaghị agụ ule e ji igodo ule malite.

Data gị

Ihe anyị na-edebe gbasara ule gị na ndị na-ese ule, ruo ogologo oge ole, na otú ị ga-esi nwetaghachi ya.

Ule na ajụjụ gị
A na-edebe ha ruo mgbe i hichapụrụ ha ma ọ bụ mechie akaụntụ gị.
Ndị na-ese ule
Id i zitere, yana aha na email naanị ma ọ bụrụ na i zitere ha. A na-edebe ha otu afọ mgbe a hụrụ onye na-ese ule ahụ ikpeazụ.
Ule e sere na nsonaazụ
Azịza, ndekọ, akara na ihe omume iguzosi ike n'eziokwu. A na-edebe ha otu afọ mgbe ule ahụ malitere, e mesịa hichapụ ha.
Ule omume
A na-edebe ha otu afọ, naanị iji gụọ ojiji gị. Akara ahụ na-erute ibe gị n'ihe omume completed.
Nziputa webhook
A na-edebe ha ụbọchị 30, n'akwụkwọ ndekọ nziputa nke console gị.
Ojiji API
Ọnụ ọgụgụ kwa ụbọchị maka igodo ọ bụla, a na-edebe ha ụbọchị 400, na ihuenyo Ojiji nke console gị.

Nweta nsonaazụ mgbe ọ bụla site na GET /attempts. N'atụmatụ Growth na Institution, ị nwekwara ike ibudata nsonaazụ ule ọ bụla dị ka CSV site na menu ule ahụ na console gị: otu ahịrị maka ule ọ bụla e sere yana akara ajụjụ ọ bụla, na azịza onye na-ese ule n'ajụjụ ndị i dere. Ajụjụ si n'ọba ajụjụ Green Bridge na-egosi naanị akara ha.

Iji hichapụ otu onye na-ese ule ngwa ngwa:

curl -X POST https://www.supergb.com/cbt/partner-api/v1/candidates/erase \
  -H "Authorization: Bearer $GREEN_BRIDGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"candidate_id": "learner-42"}'

Nsonaazụ onye na-ese ule chekwara n'akaụntụ Green Bridge nke ya bụ nke ya site n'oge ahụ gaa n'ihu. Ihichapụ onye ahụ ma ọ bụ imechi akaụntụ gị anaghị ewepụ ya.

Onye nwe akaụntụ gị nwere ike imechi ya n'okpuru Weebụsaịtị na igodo. Igodo na webhook na-akwụsị ozugbo, a na-ehichapụkwa ihe niile dị n'elu n'ime otu ụbọchị, ya mere budata ihe ị chọrọ tupu mgbe ahụ.

Nkwa ndị dị n'azụ nke a dị na Ndị Mmekọ na Nhazi Data n'ime Usoro na Ọnọdụ anyị.

Ị chọrọ ihe atụmatụ ndị a anaghị ekpuchi? Jiri Kpọtụrụ anyị na ihuenyo Atụmatụ na console gị.