Webhooks
Events and payloads
Every event a webhook can receive, with an example of its data.
Each request body is a JSON object with id, event, created_at and data, as described in How webhooks work. This page describes the data of each event.
Team events
These two events are for team webhooks. They are only sent to the webhooks of the team the member is on, and only while the team has an active plan and is not suspended. A member who is not on a team triggers nothing.
Both share these fields in data:
| Field | Meaning |
|---|---|
team.name |
The team's name. |
team.slug |
The team's address name. |
team.url |
The team's public page. |
member.id |
The member's id on IT Bible. It never changes. |
member.username |
The member's user name. |
member.name |
The member's display name. |
member.url |
The member's public profile. |
member.role |
owner, admin or member. |
No email address is ever included.
member.lab_completed
A team member finished a lab in IT Bible Labs.
{
"id": "6f1c1d1e-2b7a-4a0e-9a53-0a4f0f5d6c11",
"event": "member.lab_completed",
"created_at": "2026-10-30T14:03:11+00:00",
"data": {
"team": { "name": "Northwind Traders", "slug": "northwind-traders", "url": "https://itbible.org/teams/northwind-traders" },
"member": { "id": 42, "username": "sam", "name": "Sam Rivera", "url": "https://itbible.org/u/sam", "role": "member" },
"lab": { "slug": "cisco-vlans", "name": "Switch VLANs", "url": "https://labs.itbible.org/completions/7", "private": false },
"points": 50
}
}
| Field | Meaning |
|---|---|
lab.slug |
The lab's address name. |
lab.name |
The lab's title, as shown on its badge. |
lab.url |
A link to the completion on Labs. It can be null. |
lab.private |
true for a lab your team uploaded, which gives no badge or points. false for a lab from the IT Bible catalog. |
points |
The points the lab gave. It is always 0 for a private lab, and can be 0 for others. |
lab.version |
The version of the lab that was finished. Only sent for a private lab, and null if Labs did not say. |
completed_at |
When the lab was finished, as an ISO 8601 time. Only sent for a private lab. |
duration_minutes |
Whole minutes from the start of the attempt to the finish. Only sent for a private lab. In a lab for two, both people get the same number. |
To track training in your own systems, use the member's id, lab.slug, lab.version and completed_at. A member finishes a version of a lab once, so that combination is unique. Use the request's id to ignore a repeat of the same delivery.
For a private lab the data looks like this:
{
"team": { "name": "Northwind Traders", "slug": "northwind-traders", "url": "https://itbible.org/teams/northwind-traders" },
"member": { "id": 42, "username": "sam", "name": "Sam Rivera", "url": "https://itbible.org/u/sam", "role": "member" },
"lab": { "slug": "name-a-vlan", "name": "Name a VLAN", "version": "1.0.0", "url": "https://labs.itbible.org/labs/team-7-name-a-vlan", "private": true },
"points": 0,
"completed_at": "2026-10-30T15:20:00+00:00",
"duration_minutes": 23
}
member.badge_earned
A team member earned a badge. This covers badges earned by taking part (for example posting, answering or a visit streak), badges a staff member or an automatic rule gave them, and the badge for finishing a lab.
A lab completion therefore sends both member.lab_completed and member.badge_earned. If you subscribe to both, expect two requests. Subscribe to only the one you want.
{
"id": "0b8e5a8c-4f77-4c1a-8d0b-5c1c8f8f2f90",
"event": "member.badge_earned",
"created_at": "2026-10-30T14:03:11+00:00",
"data": {
"team": { "name": "Northwind Traders", "slug": "northwind-traders", "url": "https://itbible.org/teams/northwind-traders" },
"member": { "id": 42, "username": "sam", "name": "Sam Rivera", "url": "https://itbible.org/u/sam", "role": "member" },
"badge": { "key": "first_reply", "name": "First Reply", "description": "Reply to someone else", "kind": "achievement" }
}
}
| Field | Meaning |
|---|---|
badge.key |
A stable name for the badge. Use it, not the display name, to recognize a badge. |
badge.name |
The badge's display name. |
badge.description |
What the badge is for. It can be null for a special badge. |
badge.kind |
achievement for a badge earned by taking part, or special for a badge that was given or that comes from a lab. |
Badges that members earned before their team had a webhook are not sent. Only new awards are.
The test event
ping
Sent when you press Send a test event. It is always delivered, even if the webhook is not subscribed to it or is turned off.
{
"id": "9d2d3c0e-8c1a-47f1-9b0e-3a2f6e9a7a10",
"event": "ping",
"created_at": "2026-10-30T14:00:00+00:00",
"data": { "message": "This is a test from IT Bible." }
}
Forum events (administrators)
An administrator of the site can add webhooks that report public forum activity. These are not available to teams. They only ever carry what a visitor who is not signed in could read, so they never include private categories, held or hidden posts or email addresses.
| Event | When |
|---|---|
topic.created |
A topic is created. |
post.created |
A post is created, including the first post of a topic. |
post.flagged |
A post is flagged. data.reason says why. |
answer.accepted |
A reply is accepted as the answer. |
user.created |
A member joins. data.user has id, username, name and url. |
The post events share this shape in data:
{
"post": {
"id": 1201,
"number": 3,
"url": "https://itbible.org/t/example/55#post-3",
"excerpt": "The first 300 characters of the post as plain text...",
"author": { "id": 42, "username": "sam", "name": "Sam Rivera", "url": "https://itbible.org/u/sam" }
},
"topic": {
"id": 55,
"title": "How do I trunk a VLAN?",
"url": "https://itbible.org/t/example/55",
"category": { "name": "Networking", "slug": "networking" }
}
}