첫 배지 발급

이미지 업로드부터 발급된 배지 확인까지, 배지 한 개를 실제로 발급하는 전 과정을 순서대로 따라 합니다.

01

배지 이미지 업로드

POST

POST /media-files/images로 배지 이미지를 업로드합니다.

터미널
curl -X POST "https://api.certi.world/public/v2/media-files/images" \
  -H "X-API-KEY: $CERTI_API_KEY" \
  -F "image=@badge.png"
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
    "urls": {
      "original": "https://cdn.certi.world/media/badge.png",
      "medium": "https://cdn.certi.world/media/badge-medium.png",
      "small": "https://cdn.certi.world/media/badge-small.png"
    }
  }
}

이 단계가 끝나면: 응답의 data.idimageId로 사용합니다.

02

프로그램 만들기

POST

1단계의 imageId를 사용해 교육, 행사, 공모전처럼 배지를 받을 활동을 만듭니다.

터미널
curl -X POST "https://api.certi.world/public/v2/programs" \
  -H "X-API-KEY: $CERTI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "AI Literacy Program",
  "description": "데이터 리터러시를 배우는 교육 과정입니다.",
  "url": "https://example.com/programs/ai-literacy",
  "categoryCode": "EDUCATION",
  "startsAt": "2026-08-01T09:00:00",
  "endsAt": "2026-08-31T18:00:00",
  "isVisibleAtOrganizationPage": true,
  "imageId": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
  "badgeIds": []
}'
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "0194775c-6402-7b98-baa4-1c8f8af208b8",
    "name": "AI Literacy Program",
    "description": "데이터 리터러시를 배우는 교육 과정입니다.",
    "url": "https://example.com/programs/ai-literacy",
    "categoryCode": "EDUCATION",
    "startsAt": "2026-08-01T09:00:00",
    "endsAt": "2026-08-31T18:00:00",
    "publishStatusCode": "PUBLISHED",
    "isVisibleAtOrganizationPage": true,
    "image": {
      "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
      "urls": {
        "original": "https://cdn.certi.world/media/badge.png",
        "medium": "https://cdn.certi.world/media/badge-medium.png",
        "small": "https://cdn.certi.world/media/badge-small.png"
      }
    },
    "badgeIds": [
      "01947a42-1b58-7cb1-91d7-b386d629db96"
    ],
    "createdAt": "2026-07-23T10:24:31",
    "updatedAt": "2026-07-23T10:24:31"
  }
}

이 단계가 끝나면: 응답의 data.idprogramId로 사용합니다.

03

배지 만들기

POST

imageId와 2단계의 programId를 포함해 이름, 발급 기준, 카테고리와 스킬을 정의합니다.

터미널
curl -X POST "https://api.certi.world/public/v2/badges" \
  -H "X-API-KEY: $CERTI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "AI Literacy Certificate",
  "description": "데이터 리터러시 교육 이수를 인증합니다.",
  "criteria": [
    {
      "category": "COMPLETION",
      "value": "필수 과정 이수"
    }
  ],
  "categoryCode": "CERTIFICATION",
  "expirationPolicy": {
    "relativeExpirationMonths": 12
  },
  "imageId": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
  "skills": [
    {
      "sourceType": "CUSTOM",
      "skillName": "AI literacy"
    }
  ],
  "programIds": [
    "0194775c-6402-7b98-baa4-1c8f8af208b8"
  ]
}'
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "01947a42-1b58-7cb1-91d7-b386d629db96",
    "name": "AI Literacy Certificate",
    "description": "데이터 리터러시 교육 이수를 인증합니다.",
    "criteria": [
      {
        "category": "COMPLETION",
        "value": "필수 과정 이수"
      }
    ],
    "categoryCode": "CERTIFICATION",
    "publishStatusCode": "PUBLISHED",
    "expirationPolicy": {
      "relativeExpirationMonths": 12
    },
    "image": {
      "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
      "urls": {
        "original": "https://cdn.certi.world/media/badge.png",
        "medium": "https://cdn.certi.world/media/badge-medium.png",
        "small": "https://cdn.certi.world/media/badge-small.png"
      }
    },
    "signatureImage": null,
    "skills": [
      {
        "sourceType": "CUSTOM",
        "skillName": "AI literacy"
      }
    ],
    "programIds": [
      "0194775c-6402-7b98-baa4-1c8f8af208b8"
    ],
    "createdAt": "2026-07-23T10:24:31",
    "updatedAt": "2026-07-23T10:24:31"
  }
}

이 단계가 끝나면: 응답의 data.idbadgeId로 사용합니다.

04

배지 발급하기

POST

uuidgen 등으로 요청마다 멱등성 키를 만들고 수신자 목록을 보냅니다.

터미널
curl -X POST "https://api.certi.world/public/v2/badges/01947a42-1b58-7cb1-91d7-b386d629db96/issuances" \
  -H "X-API-KEY: $CERTI_API_KEY" \
  -H "Idempotency-Key: $CERTI_IDEMPOTENCY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "recipients": [
    {
      "name": "Kim Certi",
      "email": "recipient@example.com",
      "receiveType": "EMAIL"
    }
  ],
  "programId": "0194775c-6402-7b98-baa4-1c8f8af208b8"
}'
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "01947b37-9c9d-7e8c-981a-a6f8cdf95a6e",
    "badgeId": "01947a42-1b58-7cb1-91d7-b386d629db96",
    "programId": "0194775c-6402-7b98-baa4-1c8f8af208b8",
    "processingStatus": "PROCESSING",
    "assertionCount": 1,
    "createdAt": "2026-07-23T10:24:31",
    "updatedAt": "2026-07-23T10:24:31"
  }
}

이 단계가 끝나면: 응답의 data.idissuanceId로 사용합니다.

05

처리 상태 확인하기

GET

GET /issuances/{issuanceId}로 처리 상태를 조회합니다. PROCESSING이면 같은 ID로 다시 확인하고, COMPLETED가 되면 다음 단계로 이동합니다.

터미널
curl -X GET "https://api.certi.world/public/v2/issuances/01947b37-9c9d-7e8c-981a-a6f8cdf95a6e" \
  -H "X-API-KEY: $CERTI_API_KEY"
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "01947b37-9c9d-7e8c-981a-a6f8cdf95a6e",
    "badgeId": "01947a42-1b58-7cb1-91d7-b386d629db96",
    "programId": "0194775c-6402-7b98-baa4-1c8f8af208b8",
    "processingStatus": "PROCESSING",
    "assertionCount": 1,
    "createdAt": "2026-07-23T10:24:31",
    "updatedAt": "2026-07-23T10:24:31"
  }
}

이 단계가 끝나면: processingStatusCOMPLETED인지 확인했습니다.

06

발급된 배지 확인하기

GET

발급 작업 ID로 발급된 배지 목록을 좁혀 조회하고, 수신자별 idstateCode를 확인합니다.

터미널
curl -X GET "https://api.certi.world/public/v2/assertions?page=1&size=20&sort=createdAt,desc" \
  -H "X-API-KEY: $CERTI_API_KEY"
응답 · JSON
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "01947b8e-54d7-79a7-835d-7ea2376bc4d2",
        "serialNumber": "CERTI-2026-000042",
        "badge": {
          "id": "01947a42-1b58-7cb1-91d7-b386d629db96",
          "name": "AI Literacy Certificate",
          "image": {
            "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
            "urls": {
              "original": "https://cdn.certi.world/media/badge.png",
              "medium": "https://cdn.certi.world/media/badge-medium.png",
              "small": "https://cdn.certi.world/media/badge-small.png"
            }
          }
        },
        "program": {
          "id": "0194775c-6402-7b98-baa4-1c8f8af208b8",
          "name": "AI Literacy Program",
          "image": {
            "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
            "urls": {
              "original": "https://cdn.certi.world/media/badge.png",
              "medium": "https://cdn.certi.world/media/badge-medium.png",
              "small": "https://cdn.certi.world/media/badge-small.png"
            }
          }
        },
        "issuanceId": "01947b37-9c9d-7e8c-981a-a6f8cdf95a6e",
        "recipient": {
          "name": "Kim Certi",
          "email": "recipient@example.com",
          "phoneNumber": null,
          "receiveType": "EMAIL"
        },
        "stateCode": "ISSUED",
        "errorCode": null,
        "expiredAt": "2027-07-23T10:24:31",
        "createdAt": "2026-07-23T10:24:31"
      }
    ],
    "pagination": {
      "page": 1,
      "size": 20,
      "totalElement": 1,
      "totalPages": 1,
      "first": true,
      "last": true,
      "empty": false
    }
  }
}

이 단계가 끝나면: data.items[0].idassertionId로 사용합니다.

07

화면에 쓸 URL 가져오기

GET

발급된 배지 상세 응답에서 OpenBadge 이미지 URL인 openbadgeImageUrl과 배지 검증 URL인 credentialUrl을 가져옵니다.

터미널
curl -X GET "https://api.certi.world/public/v2/assertions/01947b8e-54d7-79a7-835d-7ea2376bc4d2" \
  -H "X-API-KEY: $CERTI_API_KEY"
응답 · JSON
{
  "success": true,
  "message": null,
  "data": {
    "id": "01947b8e-54d7-79a7-835d-7ea2376bc4d2",
    "serialNumber": "CERTI-2026-000042",
    "badge": {
      "id": "01947a42-1b58-7cb1-91d7-b386d629db96",
      "name": "AI Literacy Certificate",
      "image": {
        "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
        "urls": {
          "original": "https://cdn.certi.world/media/badge.png",
          "medium": "https://cdn.certi.world/media/badge-medium.png",
          "small": "https://cdn.certi.world/media/badge-small.png"
        }
      }
    },
    "program": {
      "id": "0194775c-6402-7b98-baa4-1c8f8af208b8",
      "name": "AI Literacy Program",
      "image": {
        "id": "01947a1b-66d1-7a51-8d7c-67b80b4162db",
        "urls": {
          "original": "https://cdn.certi.world/media/badge.png",
          "medium": "https://cdn.certi.world/media/badge-medium.png",
          "small": "https://cdn.certi.world/media/badge-small.png"
        }
      }
    },
    "issuanceId": "01947b37-9c9d-7e8c-981a-a6f8cdf95a6e",
    "recipient": {
      "name": "Kim Certi",
      "email": "recipient@example.com",
      "phoneNumber": null,
      "receiveType": "EMAIL"
    },
    "stateCode": "ISSUED",
    "errorCode": null,
    "expiredAt": "2027-07-23T10:24:31",
    "createdAt": "2026-07-23T10:24:31",
    "credentialUrl": "https://certs.certi.world/assertions/01947b8e-54d7-79a7-835d-7ea2376bc4d2",
    "openbadgeImageUrl": "https://certs.certi.world/assertions/01947b8e-54d7-79a7-835d-7ea2376bc4d2/image"
  }
}

이 단계가 끝나면: OpenBadge 이미지 URL(openbadgeImageUrl)과 배지 검증 URL(credentialUrl)을 사용할 수 있습니다.