API Documentation
The Fellowship of the Fork API provides a RESTful JSON interface for building integrations with our cannabis edibles recipe platform. Use it to manage recipes, strains, collections, and more.
Base URL
https://fellowshipofthefork.com/api/v1
Request Format
All request bodies should be sent as JSON with the Content-Type: application/json header.
Authentication
Most endpoints require a Bearer token. Obtain one via the login or signup endpoint, then include it in all requests:
Authorization: Bearer YOUR_API_TOKEN
Pagination
List endpoints return paginated results. Use the per_page parameter to control page size. Pagination metadata is included in the meta key of the response.
{
"meta": {
"current_page": 1,
"total_pages": 5,
"total_count": 48,
"per_page": 10
}
}Authentication
Create accounts, log in, and manage sessions. Tokens are 64-character hex strings returned on signup and login.
Create a new user account and receive an API token.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
username | string | Yes | Unique username |
email | string | No | Email address |
password | string | Yes | Password (min 6 characters) |
password_confirmation | string | Yes | Must match password |
age_verified | boolean | Yes | Must be true (21+ confirmation) |
terms_accepted | boolean | Yes | Must be true |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/auth/signup \
-H "Content-Type: application/json" \
-d '{
"username": "samwise",
"email": "[email protected]",
"password": "p0tat03s",
"password_confirmation": "p0tat03s",
"age_verified": true,
"terms_accepted": true
}'Example Response
{
"user": {
"id": 1,
"username": "samwise",
"email": "[email protected]",
"display_name": null,
"bio": null,
"points": 0,
"admin": false,
"badges_count": 0,
"recipes_count": 0,
"strains_count": 0,
"preferences": {
"profile_visible": true,
"show_recipes": true,
"show_strains": true
},
"created_at": "2026-01-15T10:30:00Z"
},
"token": "a1b2c3d4e5f6..."
}Authenticate with username and password to receive an API token.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
username | string | Yes | Your username |
password | string | Yes | Your password |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "samwise", "password": "p0tat03s"}'Example Response
{
"user": {
"id": 1,
"username": "samwise",
"points": 150,
"badges_count": 3,
"recipes_count": 5,
"strains_count": 8
},
"token": "a1b2c3d4e5f6..."
}Invalidate the current API token. Requires authentication.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/auth/logout \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Logged out successfully"}Get the currently authenticated user's profile. Requires authentication.
Example Request
curl https://fellowshipofthefork.com/api/v1/auth/me \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"user": {
"id": 1,
"username": "samwise",
"email": "[email protected]",
"display_name": "Samwise Gamgee",
"bio": "Po-tay-toes enthusiast",
"avatar_url": "/avatars/samwise.jpg",
"points": 150,
"admin": false,
"age_verified": true,
"terms_accepted": true,
"badges_count": 3,
"recipes_count": 5,
"strains_count": 8,
"preferences": {
"profile_visible": true,
"show_recipes": true,
"show_strains": true
},
"created_at": "2026-01-15T10:30:00Z"
}
}Recipes
Create, browse, and manage cannabis edible recipes. Public recipes are accessible without authentication; creating and editing require a token.
List published recipes with filtering and sorting. No authentication required for public recipes.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
search | string | No | Search by recipe name or ingredients |
category | string | No | Filter by recipe category |
cannabis_type | string | No | Filter by strain type (indica, sativa, hybrid, cbd_dominant) |
difficulty | string | No | Filter by difficulty (easy, medium, hard) |
min_dosage | number | No | Minimum mg THC per serving |
max_dosage | number | No | Maximum mg THC per serving |
dietary_tags | array | No | Filter by dietary tags (e.g. vegan, gluten_free) |
drafts | boolean | No | If true, show your draft recipes (auth required) |
sort | string | No | Sort field: recipe_name, average_rating, ratings_count, calculated_dosage, created_at, difficulty, total_time, cost_per_serving |
direction | string | No | Sort direction: asc or desc |
per_page | integer | No | Results per page (default 10) |
Example Request
curl "https://fellowshipofthefork.com/api/v1/recipes?category=brownies&sort=average_rating&direction=desc"
Example Response
{
"recipes": [
{
"id": 1,
"recipe_name": "Lembas Brownies",
"slug": "lembas-brownies",
"recipe_category": "brownies",
"difficulty": "easy",
"servings": 12,
"prep_time": 15,
"total_time": 45,
"calculated_dosage": 10.5,
"calculated_cbd_dosage": 0.5,
"average_rating": 8.5,
"ratings_count": 23,
"forks_count": 3,
"dietary_tags": ["gluten_free"],
"total_cost": 25.00,
"cost_per_serving": 2.08,
"strain": {
"id": 1,
"strain_name": "Hobbit's Leaf",
"cannabis_type": "hybrid"
},
"user": {
"id": 1,
"username": "samwise"
},
"created_at": "2026-01-20T14:00:00Z"
}
],
"meta": {
"current_page": 1,
"total_pages": 3,
"total_count": 25,
"per_page": 10
}
}Get full details for a single recipe including ratings, ingredients, and equipment.
Example Request
curl https://fellowshipofthefork.com/api/v1/recipes/1
Example Response
{
"recipe": {
"id": 1,
"recipe_name": "Lembas Brownies",
"slug": "lembas-brownies",
"recipe_category": "brownies",
"difficulty": "easy",
"servings": 12,
"prep_time": 15,
"total_time": 45,
"product_amount": 3.5,
"decarb_method": "oven",
"decarb_temperature": 240,
"decarb_time": 40,
"decarb_notes": "Watch for golden color",
"infusion_method": "stovetop",
"infusion_medium": "butter",
"infusion_temperature": 180,
"infusion_time": 120,
"infusion_notes": "Low and slow",
"ingredients": "1 cup cannabutter\n2 cups flour\n...",
"instructions": "Step 1: Preheat oven...",
"tips": "Let cool completely before cutting",
"calculated_dosage": 10.5,
"calculated_cbd_dosage": 0.5,
"onset_time": 45,
"personal_effects": "Relaxing body high",
"average_rating": 8.5,
"ratings_count": 23,
"forks_count": 3,
"dietary_tags": ["gluten_free"],
"total_cost": 25.00,
"cost_per_serving": 2.08,
"cost_per_mg": 0.20,
"strain": {
"id": 1,
"strain_name": "Hobbit's Leaf",
"cannabis_type": "hybrid",
"thc_percentage": 20.0,
"cbd_percentage": 1.0
},
"user": {
"id": 1,
"username": "samwise"
},
"forked_from": null,
"recipe_ingredients": [
{"id": 1, "name": "Cannabutter", "link_url": null, "position": 1, "cost": 15.00}
],
"recipe_equipments": [
{"id": 1, "name": "Baking Pan", "link_url": null, "position": 1}
],
"ratings": [
{
"id": 1,
"rating": 9,
"onset_time": 60,
"effects": "Very relaxing",
"comments": "Perfect dosage!",
"user": {"id": 2, "username": "frodo"},
"created_at": "2026-01-25T09:00:00Z"
}
],
"created_at": "2026-01-20T14:00:00Z"
}
}Create a new recipe. Requires authentication. Awards 50 points when published.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
strain_id | integer | Yes | ID of the strain used |
recipe_name | string | Yes | Name of the recipe |
product_amount | decimal | Yes | Amount of cannabis in grams |
decarb_method | string | Yes | Decarb method (oven, sous_vide, instant_pot, etc.) |
decarb_temperature | integer | Yes | Temperature in Fahrenheit |
decarb_time | integer | Yes | Duration in minutes |
decarb_notes | string | No | Notes about decarboxylation |
infusion_method | string | Yes | Infusion method (stovetop, crockpot, sous_vide, etc.) |
infusion_medium | string | Yes | Medium (butter, coconut_oil, olive_oil, ghee, etc.) |
infusion_temperature | integer | Yes | Temperature in Fahrenheit |
infusion_time | integer | Yes | Duration in minutes |
infusion_notes | string | No | Notes about infusion |
recipe_category | string | No | Category (brownies, cookies, gummies, etc.) |
ingredients | text | Yes | Ingredient list |
instructions | text | Yes | Step-by-step instructions |
servings | integer | Yes | Number of servings |
onset_time | integer | No | Expected onset in minutes |
personal_effects | text | No | Creator's reported effects |
tips | text | No | Tips and suggestions |
difficulty | string | No | easy, medium, or hard |
prep_time | integer | No | Prep time in minutes |
total_time | integer | No | Total time in minutes |
dietary_tags | array | No | e.g. ["vegan", "gluten_free"] |
draft | boolean | No | Save as draft if true |
recipe_ingredients_attributes | array | No | Structured ingredients with name, link_url, position, cost |
recipe_equipments_attributes | array | No | Equipment items with name, link_url, position |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/recipes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"strain_id": 1,
"recipe_name": "Lembas Brownies",
"product_amount": 3.5,
"decarb_method": "oven",
"decarb_temperature": 240,
"decarb_time": 40,
"infusion_method": "stovetop",
"infusion_medium": "butter",
"infusion_temperature": 180,
"infusion_time": 120,
"ingredients": "1 cup cannabutter\n2 cups flour",
"instructions": "Preheat oven to 350F...",
"servings": 12,
"difficulty": "easy"
}'Update an existing recipe. Only the recipe owner can update. Requires authentication.
Accepts the same parameters as create. Only include fields you want to change.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/recipes/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"servings": 16, "tips": "Let cool completely"}'Delete a recipe. Only the recipe owner can delete. Requires authentication.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/recipes/1 \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Recipe deleted successfully"}Create a copy of a recipe to customize. Awards points to both the original creator and the forker. Requires authentication.
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/recipes/1/fork \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"recipe": {
"id": 15,
"recipe_name": "Lembas Brownies (Fork)",
"forked_from": {
"id": 1,
"recipe_name": "Lembas Brownies"
}
},
"message": "Recipe forked successfully"
}Download a printable PDF version of the recipe.
Example Request
curl -O https://fellowshipofthefork.com/api/v1/recipes/1/pdf
Returns a PDF file with Content-Type: application/pdf.
Recipe Ratings
Rate recipes and share your experience. One rating per user per recipe. All endpoints require authentication.
Rate a recipe. Awards 5 points, plus 10 bonus points if you include effects. You cannot rate your own recipes.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
rating | integer | Yes | Rating from 1 to 10 |
onset_time | integer | No | Your onset time in minutes |
effects | string | No | Describe the effects you experienced |
comments | string | No | Additional comments |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/recipes/1/ratings \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rating": 9,
"onset_time": 45,
"effects": "Relaxing body high, great for evening",
"comments": "Perfect dosage, will make again!"
}'Example Response
{
"rating": {
"id": 1,
"rating": 9,
"onset_time": 45,
"effects": "Relaxing body high, great for evening",
"comments": "Perfect dosage, will make again!",
"user": {"id": 2, "username": "frodo"},
"recipe": {
"id": 1,
"recipe_name": "Lembas Brownies",
"average_rating": 8.7,
"ratings_count": 24
},
"created_at": "2026-01-25T09:00:00Z"
}
}Update your rating for a recipe. Requires authentication.
Accepts the same parameters as create.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/recipes/1/ratings/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rating": 10, "comments": "Even better the second time!"}'Delete your rating. Requires authentication.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/recipes/1/ratings/1 \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Rating deleted successfully"}Strains
Manage your personal strain library. All endpoints require authentication.
List your strains with filtering and sorting.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
product_type | string | No | Filter: flower, wax, oil, edibles, tincture |
cannabis_type | string | No | Filter: indica, sativa, hybrid, cbd_dominant |
favorites | boolean | No | If true, show only favorites |
sort | string | No | Sort field: strain_name, product_type, cannabis_type, thc_percentage, cbd_percentage, created_at |
direction | string | No | asc or desc |
per_page | integer | No | Results per page |
Example Request
curl "https://fellowshipofthefork.com/api/v1/strains?cannabis_type=hybrid&sort=thc_percentage&direction=desc" \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"strains": [
{
"id": 1,
"strain_name": "Hobbit's Leaf",
"product_type": "flower",
"cannabis_type": "hybrid",
"thc_percentage": 20.0,
"cbd_percentage": 1.0,
"dispensary": "Green Dragon Dispensary",
"favorite": true,
"terpenes": {"myrcene": 0.5, "limonene": 0.3},
"total_terpenes": 0.8,
"slug": "hobbits-leaf",
"created_at": "2026-01-10T08:00:00Z"
}
],
"meta": {"current_page": 1, "total_pages": 1, "total_count": 1, "per_page": 10}
}Get full details for a strain including mood profile and recipe count.
Example Request
curl https://fellowshipofthefork.com/api/v1/strains/1 \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"strain": {
"id": 1,
"strain_name": "Hobbit's Leaf",
"product_type": "flower",
"cannabis_type": "hybrid",
"thc_percentage": 20.0,
"cbd_percentage": 1.0,
"dispensary": "Green Dragon Dispensary",
"favorite": true,
"terpenes": {"myrcene": 0.5, "limonene": 0.3},
"total_terpenes": 0.8,
"personal_notes": "Great for baking",
"purchase_date": "2026-01-05",
"mood_profile": {"relaxed": 7, "happy": 8, "creative": 6},
"dominant_mood": "happy",
"top_moods": [["happy", 8], ["relaxed", 7]],
"recipes_count": 3,
"slug": "hobbits-leaf",
"created_at": "2026-01-10T08:00:00Z"
}
}Add a new strain to your library. Awards 10 points.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
strain_name | string | Yes | Name of the strain |
product_type | string | Yes | flower, wax, oil, edibles, or tincture |
cannabis_type | string | Yes | indica, sativa, hybrid, or cbd_dominant |
thc_percentage | decimal | No | THC percentage (0-100) |
cbd_percentage | decimal | No | CBD percentage (0-100) |
dispensary | string | No | Where purchased |
personal_notes | string | No | Your notes |
purchase_date | date | No | Date purchased (YYYY-MM-DD) |
terpenes | object | No | Terpene profile as key-value pairs (e.g. {"myrcene": 0.5}) |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/strains \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"strain_name": "Hobbit'\''s Leaf",
"product_type": "flower",
"cannabis_type": "hybrid",
"thc_percentage": 20.0,
"cbd_percentage": 1.0,
"dispensary": "Green Dragon Dispensary",
"terpenes": {"myrcene": 0.5, "limonene": 0.3}
}'Update a strain. Only the owner can update. Accepts the same parameters as create.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/strains/1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"thc_percentage": 22.5, "personal_notes": "Updated after lab test"}'Delete a strain. Only the owner can delete.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/strains/1 \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Strain deleted successfully"}Toggle the favorite status of a strain.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/strains/1/toggle_favorite \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"strain": {
"id": 1,
"strain_name": "Hobbit's Leaf",
"favorite": true
}
}Users
View profiles, manage settings, and follow other users.
Get a user's public profile. No authentication required, but auth adds follow status.
Example Request
curl https://fellowshipofthefork.com/api/v1/users/1
Example Response
{
"user": {
"id": 1,
"username": "samwise",
"display_name": "Samwise Gamgee",
"bio": "Po-tay-toes enthusiast",
"avatar_url": "/avatars/samwise.jpg",
"points": 150,
"followers_count": 12,
"following_count": 5,
"is_following": false,
"badges": [
{"id": 1, "badge_type": "chef", "badge_name": "One Recipe to Rule Them All", "created_at": "2026-01-20T14:00:00Z"}
],
"recipes": [
{"id": 1, "recipe_name": "Lembas Brownies", "slug": "lembas-brownies", "average_rating": 8.5}
],
"strains": [
{"id": 1, "strain_name": "Hobbit's Leaf", "cannabis_type": "hybrid"}
],
"created_at": "2026-01-15T10:30:00Z"
}
}Follow a user. Requires authentication. You cannot follow yourself.
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/users/2/follow \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Now following frodo", "followers_count": 8}Unfollow a user. Requires authentication.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/users/2/follow \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Unfollowed frodo", "followers_count": 7}Update your account settings. Requires authentication.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
email | string | No | New email address |
password | string | No | New password |
password_confirmation | string | No | Must match new password |
display_name | string | No | Display name |
bio | string | No | Bio text |
avatar_data | string | No | Base64-encoded avatar image (data URI) |
preferences | object | No | Privacy settings |
preferences.profile_visible | boolean | No | Make profile public |
preferences.show_recipes | boolean | No | Show recipes on profile |
preferences.show_strains | boolean | No | Show strains on profile |
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/users/settings \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "Samwise Gamgee",
"bio": "Po-tay-toes enthusiast",
"preferences": {"profile_visible": true, "show_recipes": true}
}'Permanently delete your account and all associated data. Requires authentication. This action cannot be undone.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/users/account \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Account deleted successfully"}Collections
Curate and organize recipes into themed collections.
List public collections and your own private collections (if authenticated).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Results per page |
Example Request
curl https://fellowshipofthefork.com/api/v1/collections
Example Response
{
"collections": [
{
"id": 1,
"name": "Second Breakfast Favorites",
"description": "Best recipes for morning edibles",
"public": true,
"slug": "second-breakfast-favorites",
"recipes_count": 5,
"user": {"id": 1, "username": "samwise"},
"created_at": "2026-02-01T12:00:00Z"
}
],
"meta": {"current_page": 1, "total_pages": 1, "total_count": 3, "per_page": 10}
}Get collection details with all recipes included.
Example Request
curl https://fellowshipofthefork.com/api/v1/collections/1
Create a new collection. Awards 10 points. Requires authentication.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Collection name |
description | string | No | Description |
public | boolean | No | Public visibility (default: true) |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/collections \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Second Breakfast Favorites", "description": "Morning edibles", "public": true}'Update a collection. Owner only. Accepts the same parameters as create.
Delete a collection. Owner only. Requires authentication.
Add a recipe to a collection. Owner only. Requires authentication.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
recipe_id | integer | Yes | ID of the recipe to add |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/collections/1/collection_recipes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"recipe_id": 5}'Example Response
{"message": "Recipe added to collection"}Remove a recipe from a collection. Owner only. Requires authentication.
Example Request
curl -X DELETE https://fellowshipofthefork.com/api/v1/collections/1/collection_recipes/3 \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "Recipe removed from collection"}Dosage Calculator
Calculate THC/CBD dosages. All endpoints are public and require no authentication.
Calculate per-serving dosage from raw cannabis.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Amount of cannabis (must be > 0) |
unit | string | No | g (grams, default) or oz (ounces) |
thc_percentage | number | Yes | THC percentage |
cbd_percentage | number | No | CBD percentage |
servings | integer | Yes | Number of servings (must be > 0) |
decarb_method | string | No | Decarb method (affects efficiency) |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/dosage_calculator/calculate \
-H "Content-Type: application/json" \
-d '{
"amount": 3.5,
"unit": "g",
"thc_percentage": 20,
"cbd_percentage": 1,
"servings": 12
}'Example Response
{
"results": {
"thc_mg_per_serving": 52.5,
"cbd_mg_per_serving": 2.63,
"thc_mg_total": 630.0,
"cbd_mg_total": 31.5,
"input": {
"amount": 3.5,
"unit": "g",
"thc_percentage": 20,
"cbd_percentage": 1,
"servings": 12
}
}
}Calculate concentration per unit of infused medium (e.g. per cup of butter).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Amount of cannabis |
unit | string | No | g or oz |
thc_percentage | number | Yes | THC percentage |
cbd_percentage | number | No | CBD percentage |
decarb_method | string | No | Decarb method |
volume | number | Yes | Volume of infusion medium |
volume_unit | string | No | cup (default) or ml |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/dosage_calculator/infusion \
-H "Content-Type: application/json" \
-d '{
"amount": 7,
"thc_percentage": 20,
"volume": 2,
"volume_unit": "cup"
}'Calculate per-serving dosage from a pre-made infusion.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
infusion_amount | number | Yes | Amount of infusion used |
infusion_unit | string | No | tsp (default) or ml |
thc_per_tsp | number | Yes | THC mg per teaspoon of infusion |
cbd_per_tsp | number | No | CBD mg per teaspoon of infusion |
servings | integer | Yes | Number of servings |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/dosage_calculator/recipe \
-H "Content-Type: application/json" \
-d '{
"infusion_amount": 4,
"infusion_unit": "tsp",
"thc_per_tsp": 25,
"servings": 8
}'Badges
View your earned badges and total points. Requires authentication.
List all badges earned by the authenticated user.
Example Request
curl https://fellowshipofthefork.com/api/v1/badges \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"badges": [
{
"id": 1,
"badge_type": "explorer",
"badge_name": "Strained Relations",
"description": "Created your first strain",
"created_at": "2026-01-10T08:00:00Z"
},
{
"id": 2,
"badge_type": "chef",
"badge_name": "One Recipe to Rule Them All",
"description": "Created your first recipe",
"created_at": "2026-01-20T14:00:00Z"
}
],
"total_points": 150
}Feed
Activity feed showing actions from users you follow. Requires authentication.
Get your personalized activity feed.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Results per page (default 25) |
Example Request
curl https://fellowshipofthefork.com/api/v1/feed \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"activities": [
{
"id": 42,
"action": "created_recipe",
"user": {"id": 2, "username": "frodo"},
"trackable_type": "Recipe",
"trackable_id": 10,
"metadata": {"recipe_name": "Elevenses Gummies"},
"created_at": "2026-02-10T15:30:00Z"
}
],
"meta": {"current_page": 1, "total_pages": 2, "total_count": 35, "per_page": 25}
}Terpene Matcher
Find recipes and strains that match your desired mood profile. No authentication required.
Get recipe and strain recommendations based on desired mood dimensions (rated 1-10).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
mood[relaxed] | integer | No | Relaxation level (1-10, default 5) |
mood[happy] | integer | No | Happiness level (1-10, default 5) |
mood[creative] | integer | No | Creativity level (1-10, default 5) |
mood[energetic] | integer | No | Energy level (1-10, default 5) |
mood[focused] | integer | No | Focus level (1-10, default 5) |
mood[sleepy] | integer | No | Sleepiness level (1-10, default 5) |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/terpene_matcher/match \
-H "Content-Type: application/json" \
-d '{"mood": {"relaxed": 8, "happy": 7, "creative": 3}}'Example Response
{
"recipe_matches": [
{
"recipe": {"id": 1, "name": "Lembas Brownies", "slug": "lembas-brownies"},
"strain": {"id": 1, "name": "Hobbit's Leaf"},
"similarity": 0.92,
"mood_profile": {"relaxed": 9, "happy": 7, "creative": 4}
}
],
"strain_matches": [
{
"strain": {"id": 1, "name": "Hobbit's Leaf", "cannabis_type": "hybrid"},
"similarity": 0.95,
"mood_profile": {"relaxed": 9, "happy": 7, "creative": 4}
}
]
}Leaderboards
Community rankings and top content. No authentication required.
Get community leaderboards by time period.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
period | string | No | week, month, or all_time (default) |
Example Request
curl "https://fellowshipofthefork.com/api/v1/leaderboards?period=month"
Example Response
{
"top_fellows": [
{"id": 1, "username": "samwise", "points": 500, "badge_count": 5}
],
"top_recipes": [
{"id": 1, "recipe_name": "Lembas Brownies", "slug": "lembas-brownies",
"creator": "samwise", "average_rating": 9.2, "ratings_count": 30, "forks_count": 5}
],
"most_forked": [
{"id": 1, "recipe_name": "Lembas Brownies", "slug": "lembas-brownies",
"creator": "samwise", "forks_count": 5}
],
"rising_stars": [
{"id": 3, "username": "pippin", "points": 120, "badge_count": 2}
]
}Notifications
In-app notifications for activity on your content. All endpoints require authentication.
Get your notifications with unread count.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Results per page (default 25) |
Example Request
curl https://fellowshipofthefork.com/api/v1/notifications \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"notifications": [
{
"id": 1,
"action": "rated_recipe",
"actor": {"id": 2, "username": "frodo", "display_name": "Frodo Baggins"},
"notifiable_type": "Recipe",
"notifiable_id": 1,
"metadata": {},
"read_at": null,
"created_at": "2026-02-15T09:00:00Z"
}
],
"unread_count": 3,
"meta": {"current_page": 1, "total_pages": 1, "total_count": 8, "per_page": 25}
}Mark a single notification as read.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/notifications/1/read \ -H "Authorization: Bearer YOUR_TOKEN"
Mark all notifications as read.
Example Request
curl -X PATCH https://fellowshipofthefork.com/api/v1/notifications/read_all \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{"message": "All notifications marked as read"}Equipment
Browse the equipment catalog and manage reviews.
List available equipment. No authentication required.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
category | string | No | Filter by category |
Example Request
curl https://fellowshipofthefork.com/api/v1/equipment
Example Response
{
"equipment": [
{
"id": 1,
"name": "Magical Butter Machine",
"slug": "magical-butter-machine",
"description": "Automated infusion device",
"category": "infusion",
"affiliate_url": "https://example.com/...",
"average_rating": 8.5,
"reviews_count": 12
}
]
}Get equipment details with reviews and recipe count. Uses slug as ID.
Example Request
curl https://fellowshipofthefork.com/api/v1/equipment/magical-butter-machine
Review a piece of equipment. One review per user per equipment. Requires authentication.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
equipment_review[rating] | integer | Yes | Rating (1-10) |
equipment_review[body] | string | No | Review text |
Example Request
curl -X POST https://fellowshipofthefork.com/api/v1/equipment/magical-butter-machine/equipment_reviews \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"equipment_review": {"rating": 9, "body": "Works perfectly for cannabutter"}}'Update your review. Accepts the same parameters as create.
Delete your review. Requires authentication.
Search
Search across all content types. No authentication required.
Search recipes, strains, equipment, and users. Returns up to 5 results per type.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query |
Example Request
curl "https://fellowshipofthefork.com/api/v1/search?q=brownies"
Example Response
{
"recipes": [
{"id": 1, "recipe_name": "Lembas Brownies", "slug": "lembas-brownies"}
],
"strains": [],
"equipment": [],
"users": []
}Quests
Time-limited community challenges. No authentication required, but auth adds your quest entry status.
Get the currently active quest and your participation status.
Example Request
curl https://fellowshipofthefork.com/api/v1/quests/current \ -H "Authorization: Bearer YOUR_TOKEN"
Example Response
{
"quest": {
"id": 1,
"name": "The Great Brownie Bake-Off",
"description": "Create and share a brownie recipe this week!",
"quest_type": "recipe_creation",
"bonus_points": 100,
"start_date": "2026-02-17",
"end_date": "2026-02-24"
},
"quest_entry": {
"id": 5,
"completed_at": "2026-02-18T14:30:00Z",
"recipe_id": 15
}
}