API documentation (Beta)
Use the RandomCoffee API to create attributes, upload users and read user participation data.
Our API is currently in beta, and we’re continuously working to improve it. If you have any questions, feature requests, or suggestions for improvement, we’d love to hear from you. Your feedback helps us make the API better for everyone!
Prerequisites
- A RandomCoffee workspace on the Enterprise Plan
Base URL
https://api.random-coffee.com/api/v2Authentication
All endpoints require an API token for authentication. The token should be passed in the Authorization header using the Bearer schema.
Example:
Authorization: Bearer YOUR_API_TOKEN1. Create a Category / Attribute
POST /data/attributes/
Create a new category or attribute for your company.
Request Body:
{ "title": "Location", "description": "User's workplace location", "type": "select", "values": ["New York", "San Francisco", "Chicago"]}Request Body Parameters:
title(string, required): The name of the category or attribute (e.g., “Location”).description(string, required): A description of the category or attribute (e.g., “User’s workplace location”).type(string, optional): The type of the category. Can be"select","text","date","integer","array"or"boolean". Default is"select".values(array, optional): A list of predefined values for the category. Only applicable if thetypeis"select"or"array".
Response:
- HTTP Status Code:
201 OKon success. - Returns the created category/attribute details.
{ "id": 1, "title": "Location", "description": "User's workplace location", "type": "select", "values": ["New York", "San Francisco", "Chicago"], "created_at": "2025-01-14T00:00:00Z"}2. Get Categories/Attributes
GET /data/attributes/
Retrieve a list of all categories and attributes associated with your company.
Response:
- HTTP Status Code:
200 OKon success. - Returns a list of categories/attributes.
[ { "id": 1, "title": "Location", "description": "User's workplace location", "type": "select", "values": ["New York", "San Francisco", "Chicago"], "created_at": "2025-01-14T00:00:00Z" }, { "id": 2, "title": "Department", "description": "User's department", "type": "text", "values": [], "created_at": "2025-01-14T00:00:00Z" }]3. Upload Users
POST /data/uploads/
Upload a list of users in bulk along with their associated attributes.
Request Body:
{ "users": [ { "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com", "extra_data": { "Location": "New York", "Department": "Engineering" } }, { "first_name": "Jane", "last_name": "Doe", "email": "jane.doe@example.com", "extra_data": { "Location": "San Francisco", "Department": "Marketing" } } ]}Request Body Parameters:
users(array, required): A list of users to upload. Each user must have:first_name(string, required)last_name(string, required)email(string, required)extra_data(object, optional): Custom attributes and their values (e.g.,"Location": "New York").
Response:
- HTTP Status Code:
201 OKon success. - Returns the details of the upload.
{ "id": 123, "finished_processing_at": null, "results": {"errors": [], "users": {}}, "created_at": "2025-01-14T00:00:00Z"}4. Get Upload Details
GET /data/uploads/{upload_id}/
Retrieve the details of a specific upload by its ID.
URL Parameters:
upload_id(integer, required): The ID of the upload.
Response:
- HTTP Status Code:
200 OKon success. - Returns the details of the upload, including processing results.
{ "id": 123, "finished_processing_at": null, "results": {"errors": [], "users": {}}, "created_at": "2025-01-14T00:00:00Z"}5. Get User Details
GET /data/users/{email}/
Retrieves detailed information about a specific user, identified by their email address.
URL Parameters:
email(string, required): The user’s email address.
Response:
- HTTP Status Code:
200 OKon success. - Returns a JSON object containing user information and participation metrics.
{ "email": "thierry.john@company.com", "first_name": "Thierry", "last_name": "John", "is_active": true, "randomcoffee_count": 13, "last_randomcoffee_date": "2025-06-10T09:30:00Z"}6. Get Users List
This endpoint allows you to retrieve the list of users belonging to your organization.
GET /data/users/
The Get Users List endpoint returns a paginated list of users along with their participation metrics.
You can control the number of users returned per page using the limit parameter, and iterate through all pages using the next value provided in the response.
You can also apply filters to retrieve only users matching specific criteria (e.g., only active users).
Response:
- HTTP Status Code:
200 OKon success. - Returns a JSON object containing pagination info and user details.
{ "count": 1, "next": null, "previous": null, "offset_start": 1, "offset_end": 1, "results": [ { "email": "thierry.john@company.com", "first_name": "Thierry", "last_name": "John", "is_active": true, "randomcoffee_count": 13, "last_randomcoffee_date": "2025-06-10T09:30:00Z" } ]}Pagination
Results are paginated to improve performance.
Each response includes:
results: the list of users for the current pagenext: a URL to the next page of results (ornullif there are no more results)previous: a URL to the previous page of results (ornull)
You can use the limit parameter to specify the maximum number of users per page (default: 10).
Example pagination flow:
- Call the endpoint with
?limit=50 - Parse the response and collect
results - If the
nextfield is not null, call the next URL - Continue until
nextis null
Filtering
You can apply filters to the users list by passing a filters parameter as a JSON string.
The filters follow a structured schema supporting:
- version : filtering schema version (currently
"v1") - operator : logical operator (
"and"or"or") - filters : list of conditions with:
type: the field to filter on (e.g.,is_active,email,first_name,last_name)operator: comparison operator (eq,ne,in, etc.)value: value(s) to compare against
Example filter object
{ "version": "v1", "operator": "or", "filters": [ { "type": "is_active", "operator": "eq", "value": 1 } ]}This retrieves only users who are active (is_active = 1).
Example: Retrieve All Active Users (Python Language)
import requestsimport json
BASE_API_URL = "https://api.random-coffee.com/api/v2"
def get_users(filters=None): url = f"{BASE_API_URL}/data/users/?limit=50" if filters: url += f"&filters={filters}" data = [] while url: resp = requests.get(url, headers={ "Authorization": "Bearer {{KEY}}" }).json() data.extend(resp["results"]) url = resp["next"] return data
# Define filter for active usersfilters = json.dumps({ "version": "v1", "operator": "or", "filters": [{"type": "is_active", "operator": "eq", "value": 1}]})
active_users = get_users(filters=filters)Example: Retrieve Inactive Users
inactive_filters = json.dumps({ "version": "v1", "operator": "or", "filters": [{"type": "is_active", "operator": "eq", "value": 0}]})
inactive_users = get_users(filters=inactive_filters)Example: Retrieve Users by Last RandomCoffee Date
by_last_randomcoffee_date_filters = json.dumps({ 'version': 'v1', 'operator': 'or', 'filters': [{ 'value': '2025-09-10', 'operator': 'gte', 'type': 'last_randomcoffee_date' }]})
users = get_users(filters=by_last_randomcoffee_date_filters)Error Handling
401 Unauthorized: Missing or invalid authentication token.403 Forbidden: Invalid token or insufficient permissions.400 Bad Request: Invalid request data (e.g., missing required fields).404 Not Found: Resource not found.405 Method Not Allowed: Invalid HTTP method for the resource.
Rate Limiting
This API is rate-limited to prevent abuse. Make sure to handle the 429 Too Many Requests status by retrying after the specified duration.
Example Tests
Here are some test cases for these routes:
Test Case 1: Create Category
import requests
BASE_API_URL = "https://api.random-coffee.com/api/v2"
response = requests.post(f'{BASE_API_URL}/data/attributes/', json={ "title": "Location", "description": "User's workplace location", "type": "select", "values": ["New York", "San Francisco"]}, headers={"Authorization": "Bearer YOUR_API_TOKEN"})assert response.status_code == 201assert response.json()['title'] == "Location"Test Case 2: Upload Users
import requests
BASE_API_URL = "https://api.random-coffee.com/api/v2"
response = requests.post(f'{BASE_API_URL}/data/uploads/', json={ "users": [ { "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com", "extra_data": {"Location": "New York"} }, { "first_name": "Jane", "last_name": "Doe", "email": "jane.doe@example.com", "extra_data": {"Location": "San Francisco"} } ]}, headers={"Authorization": "Bearer YOUR_API_TOKEN"})assert response.status_code == 201Test Case 3: Get Upload Details
import requests
BASE_API_URL = "https://api.random-coffee.com/api/v2"
response = requests.get( f'{BASE_API_URL}/data/uploads/123/', headers={"Authorization": "Bearer YOUR_API_TOKEN"})assert response.status_code == 200assert response.json()['id'] == 123