Open Badges -merkkien myöntäminen Badges Ninjan REST API:n kautta: pikaopas
Tunnistaudu, luo myöntäjä, suunnittele tai lataa digitaalinen merkki ja myönnä se saajalle — kaikki REST-rajapinnan kautta. Mukana JavaScript- ja Python-esimerkit.
Nacho founded Badges Ninja to make issuing verifiable digital credentials as simple as a single API call — Open Badge v2.0 badges and certificates, minted, hosted, and verifiable without standing up your own issuer infrastructure.
Useimmat todistusohjelmat eivät tarvitse rajapintaa lainkaan. Jos vedät kurssia, jolta valmistuu muutama sata ihmistä vuodessa, hallintapaneeli hoitaa kaiken: suunnittelet merkin visuaalisella suunnittelutyökalulla, lataat CSV-tiedoston, ja jokainen saaja saa varmennussivun ja PDF-todistuksen. Jos tämä on sinun tilanteesi, aloita oppaasta Open Badges -merkkien myöntäminen CSV-tiedostosta ja palaa tähän myöhemmin.
Rajapinta ansaitsee paikkansa, kun todistukset pitää myöntää toisesta järjestelmästä: oppimisalustasi merkitsee kurssin suoritetuksi, ilmoittautumistyökalusi sulkee tapahtuman tai HR-järjestelmäsi kirjaa suoritetun compliance-moduulin. Silloin kukaan ei halua viedä taulukkoa ulos joka viikon päätteeksi. Yksi HTTP-kutsu suorituksen hetkellä on yksinkertaisempi, ja saaja saa merkkinsä, kun saavutus on vielä tuore.
Tämä pikaopas käy koko polun läpi neljällä kutsulla: hanki avain, luo myöntäjä, luo merkki ja myönnä se. Sen jälkeen katsomme, miten varmennuslinkki annetaan saajalle ja miten tuloksen voi tarkistaa. Jokainen alla oleva pyyntömuoto on peräisin käyttöön otetuista käsittelijöistä, joten voit liittää ne sellaisenaan ja ajaa.
Mitä tarvitset ennen aloitusta
- Ilmainen tili osoitteessa badges.ninja. Free-paketti riittää tähän oppaaseen: siihen kuuluu 2 myöntäjää, 5 merkkiä, 2 käyttäjäpaikkaa ja 1 API-avain.
- Yksi API-avain, luotuna hallintapaneelista.
- PNG- tai JPG-kuva merkin kuvaksi tai visuaalisella suunnittelutyökalulla suunnittelemasi merkki.
Kaiken perus-URL on https://api.badges.ninja.
Vaihe 1: Luo API-avain
Kirjaudu sisään, avaa sivupalkista API Keys ja napsauta Create API Key. Anna avaimelle nimi, joka kertoo, missä sitä käytetään, esimerkiksi “LMS integration”, jotta erotat avaimet toisistaan, kun kierrätät niitä myöhemmin.

Avain näytetään täsmälleen kerran. Kopioi se heti salaisuuksien hallintaan tai ympäristömuuttujaan. Avaimet näyttävät tältä: bws_ ja sen perässä 32 heksamerkkiä, ja ne lähetetään X-Api-Key-otsakkeessa jokaisen pyynnön mukana. Avaimen mitätöinti samasta näkymästä tulee voimaan välittömästi.
Muutama tapa, jotka säästävät vaivaa myöhemmin:
- Älä koskaan laita avainta frontend-koodiin tai julkiseen repositorioon. Kutsu rajapintaa palvelimelta, serverless-funktiosta tai automaatiotyökalusta.
- Käytä yhtä avainta yhtä integraatiota kohti. Jos yksi vuotaa, mitätöit yhden integraation etkä kaikkia.
- Hallintapaneeli hyväksyy myös kirjautuneen istuntosi (Cognito JWT, joka lähetetään muodossa
Authorization: Bearer), mutta skripteihin ja integraatioihin oikea työkalu on API-avain.
Kaikki alla olevat esimerkit lukevat avaimen ympäristömuuttujasta nimeltä BADGES_API_KEY.
Vaihe 2: Luo myöntäjä
Myöntäjä on organisaatio, joka seisoo merkin takana. Se näkyy jokaisella varmennussivulla ja Open Badge v2.0 -datassa, joten käytä nimeä, jonka ihmiset oikeasti tuntevat.
curl -X POST https://api.badges.ninja/issuers \
-H "X-Api-Key: $BADGES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme Academy","url":"https://acme.example.com","email":"badges@acme.example.com"}'
Pakolliset kentät ovat name (vähintään 3 merkkiä), url (kelvollinen http- tai https-osoite) ja email. Valinnaisia kenttiä ovat logo (base64-koodattu kuva) ja linkedinOrganizationId, joka ottaa käyttöön Add to LinkedIn Profile -painikkeen julkisilla todistussivuillasi.
Vastaus sisältää myöntäjän tunnisteen:
{
"issuerId": "https://api.badges.ninja/certify-badge/issuer/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
Säilytä arvo täsmälleen sellaisena kuin se palautettiin. Se on seuraavan vaiheen syöte.
Myöntäjän varmennus
Merkkejä voi luoda vain varmennetun myöntäjän alle. Varmennus toimii näin:
- Jos myöntäjän sähköposti vastaa tilisi sähköpostia, myöntäjä varmennetaan automaattisesti. Tämä on nopein tapa ensimmäiseen testiin.
- Jos sähköposti on eri, osoitteeseen lähetetään varmennusviesti ja koodi. Vahvistat koodin hallintapaneelissa (tai myöntäjärajapinnan kautta) ennen merkkien luomista.
Käytä siis tässä oppaassa samaa sähköpostia, jolla rekisteröidyit.
Vaihe 3: Luo merkki
Merkki on uudelleenkäytettävä pohja: nimi, kuvaus, kriteerit ja kuva. Jokainen myöhemmin myöntämäsi myöntö viittaa siihen.
Pyyntö on pelkkää JSONia. Kuva annetaan base64-merkkijonona, joten multipart-latauksen kanssa ei tarvitse painia. Data URL -etuliite, kuten data:image/png;base64,, hyväksytään ja poistetaan.
JavaScript (Node 18 tai uudempi):
import { readFileSync } from "node:fs";
const API_KEY = process.env.BADGES_API_KEY;
const image = readFileSync("./badge.png").toString("base64");
const res = await fetch("https://api.badges.ninja/badges", {
method: "POST",
headers: { "X-Api-Key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
name: "JavaScript Fundamentals",
description: "Demonstrates proficiency in core JavaScript concepts",
criteria: "Completed the JavaScript Fundamentals course with a score of 80% or higher",
image,
issuerId: "https://api.badges.ninja/certify-badge/issuer/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
}),
});
const { badgeId } = await res.json();
console.log(badgeId);
Python:
import base64, os, requests
API_KEY = os.environ["BADGES_API_KEY"]
with open("badge.png", "rb") as f:
image = base64.b64encode(f.read()).decode()
res = requests.post(
"https://api.badges.ninja/badges",
headers={"X-Api-Key": API_KEY},
json={
"name": "JavaScript Fundamentals",
"description": "Demonstrates proficiency in core JavaScript concepts",
"criteria": "Completed the JavaScript Fundamentals course with a score of 80% or higher",
"image": image,
"issuerId": "https://api.badges.ninja/certify-badge/issuer/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
},
)
badge_id = res.json()["badgeId"]
print(badge_id)
Kaikki viisi kenttää (name, description, criteria, image, issuerId) ovat pakollisia. Kaksi valinnaista kannattaa tuntea: shareText, oletusteksti, jonka saajat näkevät jakaessaan sosiaalisessa mediassa (tukee paikkamerkkejä {{badge_name}}, {{issuer_name}} ja {{award_url}}), sekä designJson, joka tallentaa visuaalisen suunnittelutyökalun dokumentin, jotta merkkiä voi myöhemmin muokata kerros kerrokselta.
Onnistunut kutsu palauttaa HTTP 200 ja { "badgeId": "<id>" }. Kuva tallennetaan pysyvästi, ja merkki on nyt Open Badge v2.0 -BadgeClass, jonka kuka tahansa voi hakea.
Pitäisikö merkkejä luoda koodilla lainkaan?
Yleensä ei. Merkin suunnittelu on luova tehtävä, ja visuaalinen suunnittelutyökalu (yli 80 pohjaa, muodot, kuvakkeet, 11 fonttia ja omat lataukset) on siihen paljon parempi paikka kuin skripti. Yleinen malli on suunnitella jokainen merkki kerran hallintapaneelissa ja antaa integraation vain myöntää niitä. Voit listata merkkisi komennolla GET /badges ja kopioida haluamasi merkin id:n.
Luo merkkejä rajapinnan kautta, kun tuotat niitä ohjelmallisesti, esimerkiksi yhden jokaista kurssia kohti sadoista kursseista koostuvassa katalogissa, tai kun täytät testiympäristöä.
Vaihe 4: Myönnä merkki
Tämän kutsun integraatiosi tekee tuhansia kertoja. Lähetä merkki, saaja ja päivämäärä.
curl:
curl -X POST https://api.badges.ninja/awards \
-H "X-Api-Key: $BADGES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"badgeId":"<badge-id>","recipient":{"name":"Jane Smith","email":"jane@example.com"},"issuedOn":"2026-09-28"}'
JavaScript:
const res = await fetch("https://api.badges.ninja/awards", {
method: "POST",
headers: { "X-Api-Key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
badgeId,
recipient: { name: "Jane Smith", email: "jane@example.com" },
issuedOn: Date.now(),
}),
});
const { awardId } = await res.json();
Python:
import time, requests
res = requests.post(
"https://api.badges.ninja/awards",
headers={"X-Api-Key": API_KEY},
json={
"badgeId": badge_id,
"recipient": {"name": "Jane Smith", "email": "jane@example.com"},
"issuedOn": int(time.time() * 1000),
},
)
award_id = res.json()["awardId"]
Säännöt, joihin ihmiset yleensä kompastuvat:
recipienton sisäkkäinen objekti, jossa onnamejaemail. Litteät kentät, kutenrecipientEmail, hylätään.recipient.nameon oltava vähintään 5 merkkiä.issuedOnon pakollinen. Lähetä epoch-millisekunteja tai ISO-päivämäärä, kuten2026-09-28.expireson valinnainen ja hyväksyy samat muodot.
Onnistunut kutsu palauttaa HTTP 200 ja vastauksen, joka sisältää awardId:n. Saajan sähköposti tallennetaan SHA-256-tiivisteenä Open Badge -dataan, joten julkinen JSON ei koskaan paljasta sitä.
Vaihe 5: Etsi varmennussivu ja Open Badge -JSON
Myöntövastaus antaa tunnisteen, ei valmista linkkiä. Tunniste päättyy GUID-arvoon, ja julkiset sivut rakennetaan tuosta GUID:stä:
- Ihmisen luettava varmennussivu:
https://badges.ninja/awards/<awardId> - Open Badge v2.0 JSON-LD:
https://api.badges.ninja/certify-badge/award/<awardId>
Jos awardId palautuu täytenä URL-osoitteena, käytä GUID:nä polun viimeistä osaa.
Molemmat ovat julkisia. Kuka tahansa, jolla on linkki, voi varmentaa todistuksen luomatta tiliä, ja juuri se on tarkoitus: työnantajan tai opiskelijavalinnasta vastaavan pitää pystyä tarkistamaan merkki kymmenessä sekunnissa.
Hae JSON nähdäksesi, mitä maailma näkee:
curl https://api.badges.ninja/certify-badge/award/<awardId>
Saat Open Badge v2.0 -Assertionin: merkin, johon se viittaa, tiivistetyn saajan identiteetin, myöntöpäivän ja varmennuslohkon, joka osoittaa takaisin isännöityyn assertioniin. Koska kyse on tavallisesta Open Badges -datasta, kaikki formaattia ymmärtävät työkalut osaavat lukea sen. Tämä siirrettävyys on syy valita Open Badges suljetun PDF:n sijaan; Open Badges vs PDF certificates käy vaihtokauppaa läpi tarkemmin.
Miten saajat saavat todistuksen
Myönnön luominen on eri asia kuin saajalle kertominen siitä. Saajat voivat avata todistuksensa saajaportaalissa osoitteessa badges.ninja/me, joka käyttää salasanatonta magic link -kirjautumista, ja he voivat julkaista julkisen profiilin osoitteessa badges.ninja/u/<handle>. Varmennussivulta he voivat lisätä merkin LinkedIniin, ladata PDF-todistuksen tai jakaa linkin.
Lähetä ensimmäisissä testeissä myöntö itsellesi omalla sähköpostiosoitteellasi ja käy läpi saajan kokemus. Se on nopein tapa huomata esimerkiksi kömpelösti kuulostava merkin kuvaus.
Virheenkäsittely, joka ei sattuisi
Rajapinta käyttää tavallisia HTTP-tilakoodeja. Näitä kohtaat:
| Tila | Merkitys | Mitä tehdä |
|---|---|---|
| 200 | Onnistui | Lue JSON-vastaus |
| 400 | Kenttä puuttuu tai on virheellinen, myös alle 5 merkin saajan nimi | Korjaa data; saman pyynnön toistaminen epäonnistuu uudelleen |
| 401 | API-avain puuttuu tai on väärä | Tarkista X-Api-Key-otsake ja ettei avainta ole mitätöity |
| 402 | Krediitit tai paketin kiintiö loppu | Päivitä paketti tai odota seuraavaa kiintiökautta |
| 404 | Merkkiä ei löytynyt | Tarkista antamasi badgeId |
Kaksi käytännön vinkkiä. Ensiksi: käsittele 400 dataongelmana ja kirjaa vastauksen runko lokiin, sillä se nimeää virheellisen kentän. Toiseksi: tee integraatiostasi idempotentti omalla puolellasi. Tallenna awardId suorituskirjauksen viereen omaan tietokantaasi ja tarkista se ennen kuin kutsut rajapintaa uudelleen. Näin uudelleen lähetetty webhook tai uudelleen ajettu työ ei koskaan myönnä samalle henkilölle kahta todistusta.
Kokonaisuuden kokoaminen oikeaksi integraatioksi
Tyypillinen kytkentä näyttää tältä:
- Suunnittele merkit hallintapaneelissa, yksi kutakin kurssia tai virstanpylvästä kohti, ja kirjaa jokaisen merkin ID ylös.
- Tallenna järjestelmääsi kuvaus kurssista merkin ID:hen.
- Kun oppija suorittaa kurssin, palvelimesi kutsuu
POST /awardsoppijan nimellä, sähköpostilla ja suorituspäivällä. - Tallenna palautettu
awardIdsuorituskirjauksen yhteyteen. - Näytä varmennuslinkki omassa tuotteessasi, jotta oppija näkee sen poistumatta sieltä.
Jos haluat välttää koodin kirjoittamisen, sama kutsu toimii mistä tahansa automaatiotyökalusta, joka osaa lähettää HTTP-pyynnön JSON-rungolla ja mukautetulla otsakkeella. Osoita se osoitteeseen https://api.badges.ninja/awards ja yhdistä lomakkeesi tai taulukkosi kentät kenttiin badgeId, recipient.name, recipient.email ja issuedOn.
Paketit ja rajat, jotka kannattaa tuntea
Rajapinta on käytettävissä kaikissa paketeissa; sen käyttöönotosta ei makseta erikseen. Free-paketti ($0) kattaa 2 myöntäjää, 5 merkkiä, 2 käyttäjäpaikkaa, 1 API-avaimen ja 1 200 todistusta vuodessa. Starter maksaa $9 kuukaudessa ja Pro $29 kuukaudessa, ja niissä rajat ovat korkeammat. Tarkista ajantasaiset luvut hinnoittelusivulta ennen kuin mitoitat käyttöönoton. Jos vertailet, mitä muut alustat veloittavat API-käytöstä, Credly alternative asettaa kustannukset rinnakkain.
Mihin siirtyä seuraavaksi
- Täydellinen päätepisteiden viite löytyy API-dokumentaatiosta, joka on saatavilla 40 kielellä.
- Tunnistautumisesta ja avainten käsittelystä kerrotaan tunnistautumisoppaassa.
- Virhekoodeista tarkemmin virheviitteessä.
- Kun yksi kutsu kerrallaan ei enää riitä, käytä hallintapaneelin massamyöntöä: lataa CSV ja keskeytä tai jatka ajoa tarvittaessa.
Ensimmäinen onnistunut myöntö on vaikein. Sen jälkeen jäljellä on vain saman kutsun kytkeminen niihin paikkoihin, joissa saavutukset jo kirjataan.
Valmiina myöntämään ensimmäisen varmennettavan todistuksesi? Aloita ilmaiseksi badges.ninjassa — visuaalinen suunnittelutyökalu, julkinen varmennussivu, PDF-todistus, Open Badge v2.0 -tuloste. Luottokorttia ei tarvita.
Miten tämä artikkeli tehtiin
Osa tämän blogin artikkeleista laaditaan tekoälyavustajan avulla, minkä jälkeen Badges Ninja -tiimi tarkistaa, faktantarkistaa ja muokkaa ne ennen julkaisua. Jokainen koodiesimerkki ja hinta tarkistetaan live-tuotteesta. Lue lisää toimituksellisesta ja tekoälyprosessistamme toimitusprosessin sivulla .

Kirjoittajasta
Nacho Coll
Founder & Engineer at Badges Ninja
Nacho founded Badges Ninja to make issuing verifiable digital credentials as simple as a single API call — Open Badge v2.0 badges and certificates, minted, hosted, and verifiable without standing up your own issuer infrastructure. Writes about the Open Badges spec, credential verification, and running a credentialing platform serverless on AWS, from the operator side of the wire.

