{"openapi":"3.0.0","info":{"title":"Instadram API","version":"1.0.0","description":"REST API for managing bourbon collections, bottles, expressions, and cocktails","contact":{"name":"API Support","email":"support@instadram.me"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://api.instadram.me/v1","description":"Production server"},{"url":"https://api-instadram-me.web.app/v1","description":"Firebase Hosting server"},{"url":"https://us-central1-oldoak-collection.cloudfunctions.net/v1","description":"Firebase Functions server"},{"url":"http://localhost:5001/oldoak-collection/us-central1/v1","description":"Local development server"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Firebase Auth JWT token"}},"schemas":{"ApiResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was successful"},"data":{"description":"Response data"},"error":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"},"details":{"description":"Additional error details"}}},"timestamp":{"type":"string","format":"date-time","description":"Response timestamp"}}},"Pagination":{"type":"object","properties":{"total_count":{"type":"integer","description":"Total number of items"},"limit":{"type":"integer","description":"Number of items per page"},"offset":{"type":"integer","description":"Number of items to skip"},"page":{"type":"integer","description":"Current page number"},"total_pages":{"type":"integer","description":"Total number of pages"},"has_next":{"type":"boolean","description":"Whether there is a next page"},"has_prev":{"type":"boolean","description":"Whether there is a previous page"}}},"Collection":{"type":"object","properties":{"id":{"type":"string","description":"Collection ID"},"name":{"type":"string","description":"Collection name"},"description":{"type":"string","description":"Collection description"},"image_url":{"type":"string","description":"Collection image URL"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"},"is_system":{"type":"boolean","description":"Whether this is a system collection"},"type":{"type":"string","description":"Collection type"},"bottle_count":{"type":"integer","description":"Number of bottles in collection"}}},"CreateCollectionRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Collection name","maxLength":50},"description":{"type":"string","description":"Collection description","maxLength":500},"image_url":{"type":"string","description":"Collection image URL"}}},"UpdateCollectionRequest":{"type":"object","properties":{"name":{"type":"string","description":"Collection name","maxLength":50},"description":{"type":"string","description":"Collection description","maxLength":500},"image_url":{"type":"string","description":"Collection image URL"}}},"Bottle":{"type":"object","properties":{"id":{"type":"string","description":"Bottle ID"},"name":{"type":"string","description":"Bottle name"},"distillery":{"type":"string","description":"Distillery name"},"proof":{"type":"number","description":"Bottle proof"},"notes":{"type":"string","description":"User notes"},"image_url":{"type":"string","description":"Bottle image URL"},"msrp":{"type":"number","description":"Manufacturer suggested retail price"},"msrp_source":{"type":"string","description":"Source of MSRP information"},"collection_ids":{"type":"array","items":{"type":"string"},"description":"Collection IDs this bottle belongs to"},"status":{"type":"string","enum":["unopened","opened","consumed","wishlist"],"description":"Bottle status"},"is_favorite":{"type":"boolean","description":"Whether bottle is favorited"},"rating":{"type":"number","minimum":1,"maximum":5,"description":"User rating (1-5)"},"availability":{"type":"string","description":"Bottle availability"},"override_proof":{"type":"number","description":"User override for proof"},"purchase_price":{"type":"number","description":"Purchase price. Owner-only: omitted when the caller is not the shelf owner"},"purchased_from":{"type":"string","description":"Where the bottle was purchased. Owner-only: omitted when the caller is not the shelf owner"},"override_batch_number":{"type":"string","description":"User override for batch number"},"store_pick":{"type":"boolean","description":"Whether this is a store pick"},"store_pick_name":{"type":"string","description":"Store pick name"},"override_expression_name":{"type":"string","description":"User override for expression name"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}},"AddBottleRequest":{"type":"object","required":["expression_id"],"properties":{"expression_id":{"type":"string","description":"Expression ID"},"collection_ids":{"type":"array","items":{"type":"string"},"description":"Collection IDs to add bottle to"},"notes":{"type":"string","description":"User notes"},"image_url":{"type":"string","description":"Bottle image URL"},"rating":{"type":"number","minimum":1,"maximum":5,"description":"User rating (1-5)"},"status":{"type":"string","enum":["unopened","opened","consumed","wishlist"],"default":"unopened","description":"Bottle status"},"override_proof":{"type":"number","description":"User override for proof"},"purchase_price":{"type":"number","description":"Purchase price. Owner-only: omitted when the caller is not the shelf owner"},"purchased_from":{"type":"string","description":"Where the bottle was purchased. Owner-only: omitted when the caller is not the shelf owner"},"override_batch_number":{"type":"string","description":"User override for batch number"},"store_pick":{"type":"boolean","default":false,"description":"Whether this is a store pick"},"store_pick_name":{"type":"string","description":"Store pick name"},"override_expression_name":{"type":"string","description":"User override for expression name"}}},"UpdateBottleRequest":{"type":"object","properties":{"notes":{"type":"string","description":"User notes"},"image_url":{"type":"string","description":"Bottle image URL"},"rating":{"type":"number","minimum":1,"maximum":5,"description":"User rating (1-5)"},"status":{"type":"string","enum":["unopened","opened","consumed","wishlist"],"description":"Bottle status"},"override_proof":{"type":"number","description":"User override for proof"},"purchase_price":{"type":"number","description":"Purchase price. Owner-only: omitted when the caller is not the shelf owner"},"purchased_from":{"type":"string","description":"Where the bottle was purchased. Owner-only: omitted when the caller is not the shelf owner"},"override_batch_number":{"type":"string","description":"User override for batch number"},"store_pick":{"type":"boolean","description":"Whether this is a store pick"},"store_pick_name":{"type":"string","description":"Store pick name"},"override_expression_name":{"type":"string","description":"User override for expression name"}}},"Expression":{"type":"object","properties":{"id":{"type":"string","description":"Expression ID"},"name":{"type":"string","description":"Expression name"},"distillery_id":{"type":"string","description":"Distillery ID"},"distillery_name":{"type":"string","description":"Distillery name"},"mash_bill":{"type":"string","description":"Mash bill composition"},"abv":{"type":"number","description":"Alcohol by volume percentage"},"proof":{"type":"number","description":"Proof"},"msrp":{"type":"number","description":"Manufacturer suggested retail price"},"msrp_source":{"type":"string","description":"Source of MSRP information"},"description":{"type":"string","description":"Expression description"},"age_statement":{"type":"string","description":"Age statement"},"batch_number":{"type":"string","description":"Batch number"},"barrel_type":{"type":"string","description":"Barrel type"},"filtration":{"type":"string","description":"Filtration method"},"bottle_size":{"type":"string","description":"Bottle size"},"limited_edition":{"type":"boolean","description":"Whether this is a limited edition"},"tasting_notes":{"type":"object","properties":{"aroma":{"type":"string","description":"Aroma notes"},"palate":{"type":"string","description":"Palate notes"},"finish":{"type":"string","description":"Finish notes"}}},"awards":{"type":"array","items":{"type":"string"},"description":"Awards received"},"availability":{"type":"string","description":"Availability status"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}},"Cocktail":{"type":"object","properties":{"id":{"type":"string","description":"Cocktail ID"},"name":{"type":"string","description":"Cocktail name"},"ingredients":{"type":"array","items":{"type":"string"},"description":"List of ingredients"},"instructions":{"type":"string","description":"Preparation instructions"},"glassware":{"type":"string","description":"Recommended glassware"},"garnish":{"type":"string","description":"Garnish"},"website_url":{"type":"string","description":"Source website URL"},"image_url":{"type":"string","description":"Cocktail image URL"},"source":{"type":"string","description":"Source name"},"spirit_types":{"type":"array","items":{"type":"string"},"description":"Types of spirits used"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp"}}},"UserProfile":{"type":"object","properties":{"id":{"type":"string","description":"User ID"},"display_name":{"type":"string","description":"User display name"},"email":{"type":"string","description":"User email"},"photo_url":{"type":"string","description":"User photo URL"},"created_at":{"type":"string","format":"date-time","description":"Account creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"},"collection_count":{"type":"integer","description":"Number of collections"},"bottle_count":{"type":"integer","description":"Number of bottles"}}},"UserCollection":{"type":"object","properties":{"user_id":{"type":"string","description":"User ID"},"user_name":{"type":"string","description":"User name"},"bottles":{"type":"array","items":{"$ref":"#/components/schemas/Bottle"},"description":"User's bottles"},"total_count":{"type":"integer","description":"Total number of bottles"}}},"SearchRequest":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query"},"type":{"type":"string","enum":["bottles","expressions","cocktails","all"],"default":"all","description":"Type of items to search"},"limit":{"type":"integer","default":20,"description":"Number of results to return"},"offset":{"type":"integer","default":0,"description":"Number of results to skip"},"filters":{"type":"object","properties":{"proof_min":{"type":"number","description":"Minimum proof"},"proof_max":{"type":"number","description":"Maximum proof"},"price_min":{"type":"number","description":"Minimum price"},"price_max":{"type":"number","description":"Maximum price"},"availability":{"type":"array","items":{"type":"string"},"description":"Availability filters"},"spirit_types":{"type":"array","items":{"type":"string"},"description":"Spirit type filters"}}}}},"SearchResponse":{"type":"object","properties":{"results":{"type":"array","items":{"description":"Search results (can be bottles, expressions, or cocktails)"},"description":"Search results"},"total_count":{"type":"integer","description":"Total number of results"},"query":{"type":"string","description":"Original search query"},"filters_applied":{"type":"object","description":"Filters that were applied"}}},"Activity":{"type":"object","properties":{"id":{"type":"string","description":"Activity ID"},"user_id":{"type":"string","description":"User ID"},"user_name":{"type":"string","description":"User name"},"action":{"type":"string","description":"Action performed"},"bottle_id":{"type":"string","description":"Bottle ID (if applicable)"},"bottle_name":{"type":"string","description":"Bottle name (if applicable)"},"collection_id":{"type":"string","description":"Collection ID (if applicable)"},"collection_name":{"type":"string","description":"Collection name (if applicable)"},"timestamp":{"type":"string","format":"date-time","description":"Activity timestamp"},"metadata":{"type":"object","description":"Additional activity metadata"}}},"RatingRequest":{"type":"object","required":["rating"],"properties":{"rating":{"type":"number","minimum":1,"maximum":5,"description":"Rating value (1-5)"}}},"AddToCollectionRequest":{"type":"object","required":["collection_id"],"properties":{"collection_id":{"type":"string","description":"Collection ID to add to"}}},"RemoveFromCollectionRequest":{"type":"object","required":["collection_id"],"properties":{"collection_id":{"type":"string","description":"Collection ID to remove from"}}}}},"tags":[{"name":"Collections","description":"Collection management operations"},{"name":"Bottles","description":"Bottle management operations"},{"name":"Expressions","description":"Bourbon expression operations"},{"name":"Cocktails","description":"Cocktail recipe operations"},{"name":"Users","description":"User profile and collection operations"},{"name":"Search","description":"Search operations"},{"name":"Activity","description":"User activity operations"}],"paths":{"/api/v1/activity":{"get":{"summary":"Get user activity feed","tags":["Activity"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of activities to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of activities to skip"},{"in":"query","name":"since","schema":{"type":"string","format":"date-time"},"description":"Get activities since this date"}],"responses":{"200":{"description":"Activity feed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Activity"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/api/v1/activity/friends":{"get":{"summary":"Get friends' activity feed","tags":["Activity"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of activities to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of activities to skip"},{"in":"query","name":"user_ids","schema":{"type":"array","items":{"type":"string"}},"description":"Filter by specific user IDs"}],"responses":{"200":{"description":"Friends' activity feed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Activity"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/api/v1/bottles":{"get":{"summary":"Get user's bottles","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of bottles to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of bottles to skip"},{"in":"query","name":"collection_id","schema":{"type":"string"},"description":"Filter by collection ID"},{"in":"query","name":"status","schema":{"type":"string","enum":["unopened","opened","consumed","wishlist"]},"description":"Filter by bottle status"},{"in":"query","name":"favorites_only","schema":{"type":"boolean"},"description":"Show only favorite bottles"}],"responses":{"200":{"description":"List of user bottles","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Bottle"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}},"post":{"summary":"Add a bottle to user's collection","tags":["Bottles"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBottleRequest"}}}},"responses":{"201":{"description":"Bottle added successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Bottle"}}}}}}}}},"/api/v1/bottles/{id}":{"get":{"summary":"Get a specific bottle","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"}],"responses":{"200":{"description":"Bottle details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Bottle"}}}}}}}},"put":{"summary":"Update a bottle","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBottleRequest"}}}},"responses":{"200":{"description":"Bottle updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Bottle"}}}}}}}},"delete":{"summary":"Delete a bottle","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"}],"responses":{"200":{"description":"Bottle deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/api/v1/bottles/{id}/rating":{"post":{"summary":"Rate a bottle","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingRequest"}}}},"responses":{"200":{"description":"Rating updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Bottle"}}}}}}}}},"/api/v1/bottles/{id}/collections":{"post":{"summary":"Add bottle to collection","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddToCollectionRequest"}}}},"responses":{"200":{"description":"Bottle added to collection successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/api/v1/bottles/{id}/collections/{collection_id}":{"delete":{"summary":"Remove bottle from collection","tags":["Bottles"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Bottle ID"},{"in":"path","name":"collection_id","required":true,"schema":{"type":"string"},"description":"Collection ID"}],"responses":{"200":{"description":"Bottle removed from collection successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/api/v1/cocktails":{"get":{"summary":"Search cocktails","tags":["Cocktails"],"parameters":[{"in":"query","name":"q","schema":{"type":"string"},"description":"Search query"},{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of cocktails to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of cocktails to skip"},{"in":"query","name":"spirit_type","schema":{"type":"string"},"description":"Filter by spirit type"}],"responses":{"200":{"description":"List of cocktails","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Cocktail"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/api/v1/cocktails/{id}":{"get":{"summary":"Get a specific cocktail","tags":["Cocktails"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Cocktail ID"}],"responses":{"200":{"description":"Cocktail details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Cocktail"}}}}}}}}},"/api/v1/collections":{"get":{"summary":"Get user's collections","tags":["Collections"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of collections to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of collections to skip"}],"responses":{"200":{"description":"List of user collections","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}},"post":{"summary":"Create a new collection","tags":["Collections"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectionRequest"}}}},"responses":{"201":{"description":"Collection created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Collection"}}}}}}}}},"/api/v1/collections/{id}":{"get":{"summary":"Get a specific collection","tags":["Collections"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Collection ID"}],"responses":{"200":{"description":"Collection details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Collection"}}}}}}}},"put":{"summary":"Update a collection","tags":["Collections"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Collection ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionRequest"}}}},"responses":{"200":{"description":"Collection updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Collection"}}}}}}}},"delete":{"summary":"Delete a collection","tags":["Collections"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Collection ID"}],"responses":{"200":{"description":"Collection deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/api/v1/expressions":{"get":{"summary":"Search expressions","tags":["Expressions"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"q","schema":{"type":"string"},"description":"Search query"},{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of expressions to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of expressions to skip"},{"in":"query","name":"distillery","schema":{"type":"string"},"description":"Filter by distillery"},{"in":"query","name":"proof_min","schema":{"type":"number"},"description":"Minimum proof"},{"in":"query","name":"proof_max","schema":{"type":"number"},"description":"Maximum proof"},{"in":"query","name":"price_min","schema":{"type":"number"},"description":"Minimum MSRP"},{"in":"query","name":"price_max","schema":{"type":"number"},"description":"Maximum MSRP"}],"responses":{"200":{"description":"List of expressions","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Expression"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/api/v1/expressions/{id}":{"get":{"summary":"Get a specific expression","tags":["Expressions"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Expression ID"}],"responses":{"200":{"description":"Expression details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Expression"}}}}}}}}},"/api/v1/search":{"get":{"summary":"Global search across bottles, expressions, and cocktails","tags":["Search"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string"},"description":"Search query"},{"in":"query","name":"type","schema":{"type":"string","enum":["bottles","expressions","cocktails","all"],"default":"all"},"description":"Type of items to search"},{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of results to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of results to skip"}],"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/SearchResponse"}}}}}}}}},"/api/v1/users/profile":{"get":{"summary":"Get current user's profile","tags":["Users"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User profile","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/UserProfile"}}}}}}}}},"/api/v1/users/{id}/collection":{"get":{"summary":"Get a user's collection","tags":["Users"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"User ID"},{"in":"query","name":"limit","schema":{"type":"integer","default":20},"description":"Number of bottles to return"},{"in":"query","name":"offset","schema":{"type":"integer","default":0},"description":"Number of bottles to skip"}],"responses":{"200":{"description":"User's collection","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/UserCollection"}}}}}}}}},"/api/v1/users/following":{"get":{"summary":"Get list of users the current user follows","tags":["Users"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of followed users","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"users":{"type":"array","items":{"$ref":"#/components/schemas/FollowingUser"}},"total_count":{"type":"integer"}}}}}}}}}}},"/api/v1/users/search":{"get":{"summary":"Search for users by username or display name","tags":["Users"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string"},"description":"Username or display name to search for"}],"responses":{"200":{"description":"User search results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"users":{"type":"array","items":{"$ref":"#/components/schemas/UserProfile"}},"total_count":{"type":"integer"}}}}}}}}}}}}}