Kudos
Give and read kudos, including organization-wide stats and the wall-of-fame leaderboard. The `by_dailybot` field is stripped for CLI-token callers.
On this page
List kudos
Paginated list of kudos the caller can access. Returns the standard envelope ({count, next, previous, results}). Supports sender/receiver filters, date range, and message search.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| filter | string | Optional | Filter type: kudos_received or kudos_given (case-insensitive). Invalid values return 400 invalid_kudos_filter. |
| sender_uuid | string (uuid) | Optional | Filter to kudos sent by a specific user. |
| receiver_uuid | string (uuid) | Optional | Filter to kudos received by a specific user. |
| start_date | string (YYYY-MM-DD) | Optional | Inclusive start date (caller's timezone). Also accepted: date_start, date_from. |
| end_date | string (YYYY-MM-DD) | Optional | Inclusive end date, 23:59:59 in caller's timezone. Also accepted: date_end, date_to. |
| search | string | Optional | Case-insensitive substring search on the kudos message. Max 256 chars. |
| page | integer | Optional | Page number (1-indexed). Default: 1. |
| page_size | integer | Optional | Items per page. Default: 50, max: 200. Alias: limit. |
Response
{
"count": "integer",
"next": "string|null",
"previous": "string|null",
"results": "array<{ id, sender, receiver, message, created_at, ... }>"
}Errors
| Status | When |
|---|---|
| 400 | Validation error (invalid_kudos_filter, search_query_too_long, invalid_date_range) |
| 401 | Missing/invalid/expired credential |
| 403 | Authenticated but not permitted |
| 429 | Throttled - Retry-After header set |
curl -sS -X GET 'https://api.dailybot.com/v1/kudos/' -H 'X-API-KEY: $DAILYBOT_API_KEY'Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
Give kudos
Body: receivers (array), message; optional kudo_type_uuid, is_public, team_uuid, by_dailybot. Note: by_dailybot is stripped when the caller uses a CLI token.
Errors
| Status | When |
|---|---|
| 401 | Missing/invalid/expired credential |
| 403 | Authenticated but not permitted |
| 429 | Throttled - Retry-After header set |
| 400 | Validation error |
curl -sS -X POST 'https://api.dailybot.com/v1/kudos/' -H 'X-API-KEY: $DAILYBOT_API_KEY'Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- by_dailybot is stripped for CLI tokens.
List all kudos in the organization (admin only)
Returns all top-level kudos across the entire organization. Requires organization admin role. Accepts either an organization API key (X-API-KEY) or a CLI Bearer token (Authorization: Bearer <token>). Supports sender/receiver filters, both legacy naive and timezone-aware date ranges, and a filter type (kudos_received / kudos_given). Only top-level kudos are returned (replies excluded).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| filter | string | Optional | Filter type: 'kudos_received' or 'kudos_given' (case-insensitive). Invalid values return 400 invalid_kudos_filter. |
| sender_uuid | string (uuid) | Optional | Filter by sender (user who gave the kudo). Must be a valid UUID v4 or the request returns 400 invalid_sender_uuid. |
| receiver_uuid | string (uuid) | Optional | Filter by receiver (user who received the kudo). Must be a valid UUID v4 or the request returns 400 invalid_receiver_uuid. |
| start_date | string (YYYY-MM-DD) | Optional | Timezone-aware inclusive start date (caller's timezone). Preferred over the legacy date_start. |
| end_date | string (YYYY-MM-DD) | Optional | Timezone-aware inclusive end date, 23:59:59 in caller's timezone. Preferred over the legacy date_end. |
| date_start | string (YYYY-MM-DD) | Optional | Legacy naive-day start filter (always available). Stacks with start_date if both are provided. |
| date_end | string (YYYY-MM-DD) | Optional | Legacy naive-day end filter (always available). Stacks with end_date if both are provided. |
| search | string | Optional | Case-insensitive substring match on kudos content. Max 256 chars. |
| page | integer | Optional | Page number (1-indexed). Default: 1. |
| page_size | integer | Optional | Items per page. Default: 25, max: 100. Alias: limit. |
| offset | integer | Optional | Offset-based pagination (accepted for backward compatibility). |
Response
{
"count": "integer",
"next": "string|null",
"previous": "string|null",
"results": "array<{ id, user: { uuid, full_name, image }, receivers: array<{ uuid, full_name, image }>, company_value: { id, value, description, emoji, i18n_meta } | null, content, is_anonymous, created_at }>"
}Errors
| Status | When |
|---|---|
| 400 | Validation error (invalid_date_range, invalid_kudos_filter, invalid_sender_uuid, invalid_receiver_uuid, search_query_too_long) |
| 401 | Missing/invalid/expired credential |
| 403 | Authenticated but not an organization admin (`org_admin_required`) |
| 429 | Throttled - Retry-After header set |
curl -sS -X GET 'https://api.dailybot.com/v1/kudos/organization/?start_date=2026-06-01&end_date=2026-06-30' -H 'X-API-KEY: $DAILYBOT_API_KEY'Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Only top-level kudos are returned (replies excluded via parent__isnull=True).
- If the organization has anonymous kudos disabled (allow_anonymous_messages=false), anonymous kudos are excluded from results.
- Ordered by created_at DESC with id as tiebreaker for deterministic pagination.
Wall of fame leaderboard
Wall of fame leaderboard
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| period | enum (week,month,quarter,year,all_time) | Optional | Default: month. |
| team_uuid | string (uuid) | Optional | — |
| page | integer | Optional | Page number (1-indexed). Default: 1. |
| page_size | integer | Optional | Items per page. Default: 50, max: 200. Alias: limit. |
Errors
| Status | When |
|---|---|
| 401 | Missing/invalid/expired credential |
| 403 | Authenticated but not permitted |
| 429 | Throttled - Retry-After header set |
curl -sS -X GET 'https://api.dailybot.com/v1/kudos/wall-of-fame/' -H 'X-API-KEY: $DAILYBOT_API_KEY'Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
Kudos
List, send, and manage kudos for team recognition.
Endpoints summary
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/kudos/ |
List kudos for the authenticated user |
| GET | /v1/kudos/organization/ |
List all kudos in the organization (admin only) |
| GET | /v1/kudos/wall-of-fame/ |
Top kudos contributors |
| POST | /v1/kudos/ |
Send kudos |
| POST | /v1/kudos/{id}/boost/ |
Boost a kudo |
GET /v1/kudos/
Returns kudos for the authenticated user. Paginated (default ordering: -id).
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Page number (1-indexed). offset accepted as alias. |
page_size |
integer | 25 | Items per page (max 100). limit accepted as alias. |
type |
string | kudos_received |
Deprecated alias — use filter instead. |
filter |
string | kudos_received |
kudos_received or kudos_given (case-insensitive). Invalid values return 400 invalid_kudos_filter. |
user_uuid |
string (UUID) | — | Filter by user. |
start_date |
string | — | Inclusive start date (YYYY-MM-DD, caller’s timezone). Also accepted: date_start, date_from. |
end_date |
string | — | Inclusive end date (YYYY-MM-DD, caller’s timezone). Also accepted: date_end, date_to. |
search |
string | — | Case-insensitive substring match on the kudos message field. Max 256 chars. Over-length returns 400 search_query_too_long. |
Legacy aliases:
date_start/date_endandlimit/offsetcontinue to work and echo innext/previousURLs.
Validation errors: Inverted date ranges (
start_date > end_date) or malformed dates return400 invalid_date_range.
curl "https://api.dailybot.com/v1/kudos/?type=kudos_received&start_date=2026-07-01&end_date=2026-07-31&page_size=50" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Response (200 OK):
{
"count": 15,
"next": null,
"previous": null,
"results": [
{
"id": "kudos-uuid",
"from_user": { "uuid": "usr_001", "name": "Alice" },
"to_user": { "uuid": "usr_002", "name": "Bob" },
"message": "Great work on the release!",
"points": 1,
"created_at": "2026-07-05T14:00:00Z"
}
]
}
GET /v1/kudos/organization/
Returns all top-level kudos across the entire organization. Requires organization admin role. Always paginated (standard envelope). Ordered by created_at DESC with id as a deterministic tiebreaker.
Authentication: Accepts both X-API-KEY (organization API key) and Authorization: Bearer <token> (CLI Bearer token or session token). The admin permission requirement applies to whichever credential is used — non-admins receive 403 with code: "org_admin_required".
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Page number (1-based). |
page_size |
integer | 25 | Items per page (max 100). limit accepted as alias. |
filter |
string | — | kudos_received or kudos_given (case-insensitive). Invalid values return 400 invalid_kudos_filter. |
search |
string | — | Case-insensitive substring match on kudos content. Max 256 chars. Over-length returns 400 search_query_too_long. |
start_date |
string (YYYY-MM-DD) |
— | Timezone-aware inclusive start (caller’s timezone). Preferred over the legacy date_start. |
end_date |
string (YYYY-MM-DD) |
— | Timezone-aware inclusive end (23:59:59 in caller’s timezone). Preferred over the legacy date_end. |
date_start |
string (YYYY-MM-DD) |
— | Legacy naive-day start filter (still available). Stacks with start_date if both are provided. |
date_end |
string (YYYY-MM-DD) |
— | Legacy naive-day end filter (still available). Stacks with end_date if both are provided. |
sender_uuid |
string (UUID) | — | Filter by the user who sent the kudo. Must be a valid UUID v4 or the API returns 400 invalid_sender_uuid. |
receiver_uuid |
string (UUID) | — | Filter by the user who received the kudo. Must be a valid UUID v4 or the API returns 400 invalid_receiver_uuid. |
Date filter guidance: Prefer
start_date/end_datefor new integrations — they respect the authenticated user’s timezone.date_start/date_endremain available as the naive-day legacy filter and can be combined with the timezone-aware pair (filters stack). Ifstart_dateis afterend_date, the API returns400 invalid_date_range.
Examples
# List all organization kudos (default pagination)
curl -sS "https://api.dailybot.com/v1/kudos/organization/" \
-H "Authorization: Bearer $DAILYBOT_CLI_TOKEN"
# Filter by date range (timezone-aware)
curl -sS "https://api.dailybot.com/v1/kudos/organization/?start_date=2026-06-01&end_date=2026-06-30" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
# Filter by sender
curl -sS "https://api.dailybot.com/v1/kudos/organization/?sender_uuid=f47ac10b-58cc-4372-a567-0e02b2c3d479" \
-H "Authorization: Bearer $DAILYBOT_CLI_TOKEN"
# Filter by receiver with pagination
curl -sS "https://api.dailybot.com/v1/kudos/organization/?receiver_uuid=7c9e6679-7425-40de-944b-e07fc1f90ae7&page=2&page_size=10" \
-H "Authorization: Bearer $DAILYBOT_CLI_TOKEN"
# Filter by type (only kudos received across the org)
curl -sS "https://api.dailybot.com/v1/kudos/organization/?filter=kudos_received" \
-H "Authorization: Bearer $DAILYBOT_CLI_TOKEN"
Response (200 OK)
{
"count": 156,
"next": "https://api.dailybot.com/v1/kudos/organization/?page=2",
"previous": null,
"results": [
{
"id": "a8283c36-8e5f-40cb-92ca-9e483eb6bde2",
"user": {
"uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"full_name": "Jane Smith",
"image": "https://avatars.slack-edge.com/..."
},
"receivers": [
{
"uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"full_name": "John Doe",
"image": "https://avatars.slack-edge.com/..."
}
],
"company_value": {
"id": "d4735e3a-265e-16d7-3dca-60b8831c8295",
"value": "Teamwork",
"description": "Collaboration and support",
"emoji": "🤝",
"i18n_meta": {}
},
"content": "Thanks for the incredible help with the product launch!",
"is_anonymous": false,
"created_at": "2026-07-08T14:30:00.123456Z"
}
]
}
Response fields
| Field | Type | Description |
|---|---|---|
count |
integer | Total kudos matching the query (across all pages). |
next |
string | null | URL to the next page, or null on the last page. |
previous |
string | null | URL to the previous page, or null on the first page. |
results |
array | Kudo objects for the current page. |
Kudo object
| Field | Type | Description |
|---|---|---|
id |
string (UUID) | Unique identifier for the kudo. |
user |
object | Sender: { uuid, full_name, image }. When is_anonymous is true, this is anonymized (random display name, no real identity). |
receivers |
array | Recipients: [{ uuid, full_name, image }]. |
company_value |
object | null | Attached company value: { id, value, description, emoji, i18n_meta }. null when no value is attached. |
content |
string | The kudo message (HTML-sanitized). |
is_anonymous |
boolean | Whether the kudo was sent anonymously. |
created_at |
string (ISO 8601) | Creation timestamp. |
Error responses
400 invalid_date_range — start_date > end_date or a malformed date.
{
"detail": "Invalid 'start_date' value. Expected YYYY-MM-DD.",
"code": "invalid_date_range"
}
400 invalid_kudos_filter — filter is not one of the accepted values (case-insensitive).
{
"detail": "Not valid kudos filter. Accepted values: kudos_received, kudos_given.",
"code": "invalid_kudos_filter"
}
403 org_admin_required — caller is not an organization admin.
{
"detail": "This endpoint requires organization admin privileges.",
"code": "org_admin_required"
}
400 invalid_sender_uuid — sender_uuid is not a valid UUID.
{
"detail": "Invalid UUID format for 'sender_uuid'.",
"code": "invalid_sender_uuid"
}
400 invalid_receiver_uuid — receiver_uuid is not a valid UUID.
{
"detail": "Invalid UUID format for 'receiver_uuid'.",
"code": "invalid_receiver_uuid"
}
401 Unauthorized — Missing or invalid credential.
403 Forbidden — Authenticated user is not an organization admin.
Notes
- Only top-level kudos are returned — replies are excluded (
parent__isnull=True). - If the organization has anonymous kudos disabled (
allow_anonymous_messages = false), anonymous kudos are excluded from results. limit/offsetare accepted as backward-compatible aliases for page-size and offset-based pagination.
GET /v1/kudos/wall-of-fame/
Returns top kudos contributors in the organization. Paginated (default ordering: -count).
Accepts the same page, page_size, start_date, and end_date parameters.
POST /v1/kudos/
Sends kudos to a team member.
Body parameters
| Name | Type | Required | Description |
|---|---|---|---|
receivers |
array of strings | Conditional | User identifiers (UUIDs, emails, or external IDs). Required if users_receivers and teams_receivers are not provided. |
users_receivers |
array of UUIDs | Conditional | Explicit user UUIDs to receive the kudo. |
teams_receivers |
array of UUIDs | No | Team UUIDs. All active members receive the kudo. |
content |
string | No | Kudo message text (HTML-safe). |
is_anonymous |
boolean | No | When true, the sender is anonymized. Default: false. |
company_value |
string (UUID) | No | Company value ID to attach (if organization uses values). |
curl -X POST "https://api.dailybot.com/v1/kudos/" \
-H "X-API-KEY: $DAILYBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receivers": ["usr_002"],
"content": "Excellent work on the API redesign!",
"company_value": "value-uuid"
}'
Response (201 Created):
{
"id": "kudos-uuid",
"user": { "uuid": "usr_001", "full_name": "Alice" },
"receivers": [{ "uuid": "usr_002", "full_name": "Bob" }],
"content": "Excellent work on the API redesign!",
"company_value": { "id": "value-uuid", "name": "Teamwork" },
"is_anonymous": false,
"by_dailybot": false,
"created_at": "2026-07-09T10:00:00Z"
}
POST /v1/kudos/{id}/boost/
Boosts an existing kudo by adding your endorsement.
curl -X POST "https://api.dailybot.com/v1/kudos/kudos-uuid/boost/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Response (200 OK):
{
"id": "kudos-uuid",
"boosts": 1,
"boosted_by": [{ "uuid": "usr_003", "name": "Carol" }]
}