Как выпустить Open Badges из CSV менее чем за 5 минут
Пошагово: загрузите CSV с получателями, выберите значок, нажмите «Выпустить». Ставьте на паузу и возобновляйте посреди партии, повторяйте неудачные строки, экспортируйте результаты. Работает для групп из 10 или 10 000 человек.
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.
Если вы когда-либо выпускали credential для группы по одному получателю за раз, вы уже знаете эту проблему: этот способ перестаёт масштабироваться примерно после десяти человек и превращается в целый вечер копирования-вставки имён и адресов электронной почты. Группе буткемпа из 40 человек, списку из 500 участников конференции или корпоративному обучению для 5000 сотрудников нужно одно и то же — загрузить список, выбрать значок, нажать «Выпустить» и уйти.
Именно это и делает функция Bulk Credentials на https://badges.ninja. Это руководство охватывает весь процесс: подготовку CSV, настройку партии, наблюдение за её выполнением и обработку неаккуратных случаев из реальной жизни — строка получателя с опечаткой, партия, прерванная на полпути, или программа, которая хочет выпускать значки так же, но из собственных систем, а не из панели управления.
Прежде чем начать: что вам понадобится
Две вещи, обе из которых у вас, скорее всего, уже есть:
- Значок — созданный один раз в визуальном редакторе и переиспользуемый для каждого получателя в партии. Если вы ещё не создали ни одного, посмотрите наше руководство по созданию вашего первого проверяемого сертификата.
- CSV с получателями — имя, электронная почта и (по желанию) дата выпуска. Вот и вся схема.
Вам не нужен отдельный аккаунт издателя для каждого получателя, почтовый сервер или какой-либо код. Всё в этом разделе происходит в панели управления.
Шаг 1: подготовьте CSV
Формат списка получателей намеренно минималистичен:
name,email,issued_on
Maria Gonzalez,maria@example.com,2026-07-01
David Kim,david@example.com,2026-07-01
Priya Patel,priya@example.com,
- name — обязательно. Заполняет поле получателя в assertion и на сертификате.
- email — обязательно. Он становится идентификатором получателя в assertion Open Badge v2.0 — хешируется с индивидуальной для каждого credential солью перед сохранением и никогда не хранится в открытом виде.
- issued_on — необязательно. Оставьте поле пустым, и партия использует момент обработки каждой строки; укажите его явно, если вы задним числом оформляете группу, которая на самом деле завершила обучение в прошлом месяце.
Большинство владельцев программ экспортируют это прямо оттуда, где они и так отслеживают завершения — Airtable, Google Sheets, таблица, переданная преподавателем, или CSV, выгруженный из журнала оценок LMS. Никакого специального инструмента экспорта не требуется; подойдёт любой CSV с этими тремя столбцами.
Частые подводные камни CSV (и как их ловит предпросмотр)
Несколько проблем постоянно всплывают в реальных списках получателей, обычно потому, что CSV был собран слиянием двух или трёх исходных таблиц:
- Лишние пробелы в адресах электронной почты — копирование-вставка из PDF-списка или экспорта Google Form часто тянет за собой невидимый пробел. В ячейке таблицы всё выглядит нормально, но при загрузке проваливается проверка электронной почты.
- Дублирующиеся строки — один и тот же получатель появляется дважды, потому что список группы и список опоздавших были склеены без удаления дубликатов.
- Несогласованные форматы дат — столбец с
2026-07-01, смешанный с07/01/2026из другого экспорта. Придерживайтесь ISO 8601 (YYYY-MM-DD), и это исчезнет полностью. - Несовпадение регистра заголовков —
EmailпротивemailпротивE-mail. Парсер снисходителен к распространённым вариантам, но полностью произвольное имя заголовка не сопоставится автоматически.
Ни одна из этих проблем не фатальна — шаг предпросмотра (ниже) выявляет каждую из них до того, как что-либо будет выпущено, так что исправление сводится к «отредактируйте таблицу, загрузите заново», а не к «выясните, кто из 3000 получателей получил сломанный значок».
Шаг 2: настройте партию
В панели управления откройте Credentials → Bulk Credentials и выберите значок, который вы выпускаете. Это тот шаг, где вы задаёте всё, что применяется ко всей партии: сам значок, общую дату выпуска, если вы не указываете даты по строкам в CSV, и (если у вашего профиля издателя он есть) идентификатор организации LinkedIn, который позволит каждому получателю добавить credential в свой профиль в один клик.

Это хороший момент, чтобы ещё раз убедиться, что выбранный значок — финальная версия: получатели увидят то изображение и критерии, которые прикреплены к нему в момент выпуска, а не то, что вы обновите позже.
Шаг 3: загрузка и предпросмотр
Перетащите CSV, и платформа разберёт его, покажет вам таблицу предпросмотра и отметит всё, что не может обработать — отсутствующую электронную почту, некорректную дату, дублирующуюся строку. Ничего не выпускается, пока вы не подтвердите предпросмотр.

Этот шаг предпросмотра важнее, чем кажется. Опечатку в одной строке CSV из 2000 строк легко пропустить на глаз, и куда дешевле поймать её до того, как 1999 правильных строк уже выпущены, чем пытаться всё откатить потом. Исправьте отмеченные строки в таблице, загрузите заново — и предпросмотр обновится.
Шаг 4: запустите партию
Нажмите «Выпустить», и партия начнёт обрабатываться. Индикатор прогресса отслеживает завершённые строки относительно оставшихся, а партия выполняется на стороне сервера — вам не нужно держать вкладку открытой, и закрытие ноутбука посреди партии не теряет ваше место.
Последнюю часть стоит проговорить, потому что именно эта деталь действительно важна для больших групп: состояние партии живёт на сервере, а не в вашем браузере. Если соединение оборвётся, ноутбук уснёт или вы просто закроете вкладку, потому что началась встреча, партия продолжит выполняться (или возобновится ровно с того места, где остановилась, если вы её приостановили), а не начнётся заново с нуля. Для группы буткемпа из 40 человек это приятный бонус. Для корпоративного развёртывания на 5000 строк это разница между «просто работает» и «кому-то придётся нянчить вкладку браузера двадцать минут».
Вы также можете намеренно поставить выполняющуюся партию на паузу — скажем, кто-то сообщает, что текст критериев значка нужно подправить на полпути выполнения на 3000 строк — исправить проблему и возобновить, не выпуская заново уже завершённые строки.
Шаг 5: обработайте неудачи
В реальных списках получателей есть плохие строки: домен электронной почты с опечаткой, поле имени, которое на самом деле пустое, дублирующаяся запись из слияния двух экспортированных таблиц. Когда строка проваливается, партия не останавливается — она продолжает обрабатывать остальное и отмечает неудачу для последующей проверки. Вы получаете экспорт результатов, показывающий, какие именно строки прошли успешно, а какие нет, так что вы можете исправить только неудачные строки и повторно запустить небольшую последующую партию вместо перепроверки всего списка.
Это важно для привычки к экспорту CSV, которая уже распространена в панели управления credential — вы можете в любой момент выгрузить CSV того, что было фактически выпущено, сверить его с исходным списком и точно знать, кому ещё нужен значок.
Путь через API: тот же процесс, без панели управления
Всё вышеописанное предполагает, что кто-то сидит за панелью управления и кликает по шагам мастера. Если ваши завершения уже живут в какой-то системе — LMS, CRM, автоматизации таблиц — вы можете управлять тем же массовым процессом выдачи credential напрямую через Awards API.
Минимальный вызов выпуска для одного получателя выглядит так:
curl -X POST https://api.badges.ninja/awards \
-H "X-Api-Key: bws_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d" \
-H "Content-Type: application/json" \
-d '{
"badgeId": "badge_9f8e7d6c5b4a",
"recipient": {
"name": "Maria Gonzalez",
"email": "maria@example.com"
},
"issuedOn": "2026-07-01T00:00:00Z"
}'
Или на Python, перебирая строки, прочитанные из того же CSV, который вы иначе загружали бы вручную:
import csv
import requests
API_KEY = "bws_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d"
BADGE_ID = "badge_9f8e7d6c5b4a"
with open("recipients.csv") as f:
for row in csv.DictReader(f):
requests.post(
"https://api.badges.ninja/awards",
headers={"X-Api-Key": API_KEY},
json={
"badgeId": BADGE_ID,
"recipient": {"name": row["name"], "email": row["email"]},
"issuedOn": row.get("issued_on") or None,
},
)
К этому стоит прибегнуть, когда выдача credential запускается чем-то совершенно другим — вебхуком о завершении курса, сменой стадии в CRM, отправкой формы — а не человеком, вручную экспортирующим CSV. Аутентификацию и полную форму запроса/ответа мы разбираем в быстром старте по API. Каждый созданный таким образом credential идентичен созданному через мастер панели управления: та же assertion Open Badge v2.0, тот же URL верификации, тот же PDF-сертификат.
Мастер панели управления против API: что вам на самом деле нужно?
| Dashboard Bulk Credentials | Awards API | |
|---|---|---|
| Лучше всего для | Разовой или эпизодической партии (выпуск группы, участие в конференции) | Повторяющегося триггера (каждое завершение курса, каждая покупка) |
| Усилия на настройку | Никаких — экспортируйте CSV, загрузите его | Разовая работа по интеграции (вебхук или скрипт) |
| Кто это запускает | Владелец программы, без кода | Тот, кто владеет системой-триггером |
| Обработка ошибок | Предпросмотр + построчный экспорт результатов | HTTP-статус на каждый запрос, обрабатываемый в вашей собственной логике повторов |
Большинство команд начинают с мастера панели управления, потому что ему не нужно ничего, кроме CSV, и переходят на API лишь после того, как одна и та же партия была запущена вручную три-четыре раза и паттерн явно стоит автоматизации.
Конфиденциальность: что на самом деле хранится
CSV с именами и адресами электронной почты — это персональные данные, и стоит знать, что с ними происходит после загрузки. Адрес электронной почты получателя никогда не хранится в открытом виде в самом credential — он хешируется с индивидуальной для каждого credential солью как часть assertion Open Badge v2.0, следуя формату идентификатора получателя hashed из спецификации. Именно этот хеш проверяет верификатор, а не сам адрес. Поле имени хранится в том виде, в каком оно введено, поскольку оно должно быть видимо на сертификате и странице верификации. Если строку нужно исправить после выпуска — чаще всего это имя с ошибкой — вы можете отредактировать или отозвать отдельный credential из панели управления credential, не трогая остальную часть партии.
После партии: уведомите получателей
Выпустить значок и сообщить о нём получателю — два разных шага. Если ваш CSV не запускает письмо через вашу собственную систему, процесс массовой отправки в панели управления позволяет выбрать сразу несколько только что созданных credential и отправить всем персонализированное письмо о выдаче за один проход — см. массовую отправку писем о выдаче для полного руководства, включая то, как персонализация по получателю (имя, изображение значка, ссылка верификации) подставляется автоматически.
Когда Bulk Credentials — правильный инструмент
Массовый выпуск — верный выбор всякий раз, когда рамка «партия» соответствует реальности: группа, завершившая обучение в один день, только что закончившаяся конференция, обучение, подходящее к сроку соответствия требованиям. Если же вы выпускаете разовые credential по мере достижения отдельных вех — одно повышение, завершение одного проекта — форма единичного credential быстрее, чем собирать CSV из одной строки.
Для всего повторяющегося — один и тот же курс, идущий каждый месяц, непрерывный конвейер онбординга — путь через API выше стоит настроить один раз. Он превращает «запускать массовый выпуск вручную для каждой группы» в «завершения уже выдают credential автоматически», а это и есть та версия рабочего процесса, которую большинство владельцев программ на самом деле хотят после второй или третьей ручной партии.
Готовы выпустить свой первый проверяемый credential? Начните бесплатно на badges.ninja — визуальный редактор, публичная страница верификации, PDF-сертификат, вывод Open Badge v2.0. Банковская карта не требуется.
Как создана эта статья
Некоторые статьи в этом блоге готовятся с помощью ИИ-ассистента, а затем проверяются, сверяются с фактами и редактируются командой Badges Ninja перед публикацией. Каждый пример кода и цена проверены на актуальном продукте. Подробнее о нашем редакционном процессе и работе с ИИ читайте на странице редакционного процесса .

Об авторе
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.


