{"openapi":"3.1.0","info":{"title":"Salvio API","version":"1.0.0","summary":"OTC product-data infrastructure for developers and AI agents.","description":"A REST API for structured over-the-counter (OTC) medication data: full-text product search, brand-to-generic equivalence mapping, ingredient label analysis, NDC/UPC barcode resolution, and a symptom-to-ingredient layer (FDA-labeled indications). Responses are informational product data sourced from FDA labeling and do not constitute medical advice. Auth: during the pre-launch period the API accepts anonymous requests; once API keys are enforced, every endpoint except GET /v1/health requires the bearer key shown in the security scheme — send it from day one to be forward-compatible.","contact":{"name":"Salvio","url":"https://salvio.health"}},"servers":[{"url":"https://api.salvio.health","description":"Production API"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/health":{"get":{"operationId":"getHealth","summary":"Service health and product count","security":[],"responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/products/search":{"get":{"operationId":"searchProducts","summary":"Full-text search across OTC products","description":"Search by brand name, generic name, ingredient, or labeler. Homeopathic products are excluded by default.","parameters":[{"name":"q","in":"query","required":true,"description":"Search query","schema":{"type":"string"}},{"name":"dosage_form","in":"query","schema":{"type":"string"},"description":"Filter by dosage form (e.g. TABLET)"},{"name":"labeler_type","in":"query","schema":{"type":"string","enum":["name_brand","store_brand","generic"]}},{"name":"exclude_homeopathic","in":"query","schema":{"type":"boolean","default":true}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"Paginated product results","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"page":{"type":"integer"},"per_page":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/products/{identifier}":{"get":{"operationId":"getProduct","summary":"Look up a product by NDC or UPC","parameters":[{"name":"identifier","in":"path","required":true,"description":"Product NDC code or UPC barcode","schema":{"type":"string"}}],"responses":{"200":{"description":"Full product detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/products/{identifier}/equivalents":{"get":{"operationId":"getEquivalents","summary":"Equivalent products (same active ingredients, strength, form)","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string"}},{"name":"labeler_type","in":"query","schema":{"type":"string","enum":["name_brand","store_brand","generic"]}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":50,"maximum":100}}],"responses":{"200":{"description":"Reference product plus its equivalents","content":{"application/json":{"schema":{"type":"object","properties":{"reference_product":{"$ref":"#/components/schemas/ProductSummary"},"equivalence_group":{"$ref":"#/components/schemas/EquivalenceGroup"},"total_equivalents":{"type":"integer"},"equivalents":{"type":"array","items":{"$ref":"#/components/schemas/EquivalentProduct"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/ingredients/analyze":{"post":{"operationId":"analyzeIngredients","summary":"Analyze a list of ingredient strings","description":"Parses ingredient strings (e.g. from an OCR scan), identifies purpose and label warnings, finds matching products, and returns informational-only safety notes. Not medical advice.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ingredients"],"properties":{"ingredients":{"type":"array","items":{"type":"string"},"example":["ACETAMINOPHEN 500 MG","IBUPROFEN 200 MG"]}}}}}},"responses":{"200":{"description":"Ingredient analysis","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/scan/{barcode}":{"get":{"operationId":"scanBarcode","summary":"Look up a product by UPC/EAN barcode","parameters":[{"name":"barcode","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Product detail with barcode resolution metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/categories":{"get":{"operationId":"listCategories","summary":"Therapeutic categories with product counts","responses":{"200":{"description":"Category list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesResponse"}}}}}}},"/v1/equivalence-groups":{"get":{"operationId":"listEquivalenceGroups","summary":"Browse equivalence groups by minimum member count","parameters":[{"name":"min_members","in":"query","schema":{"type":"integer","default":2}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"Paginated equivalence groups","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquivalenceGroupsResponse"}}}}}}},"/v1/stats":{"get":{"operationId":"getStats","summary":"Database counts, labeler breakdown, and top equivalence groups","responses":{"200":{"description":"Aggregate statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}}}},"/v1/ingredients":{"get":{"operationId":"searchIngredients","summary":"Search canonical active-ingredient names","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Substring to match against canonical ingredient names"}],"responses":{"200":{"description":"Matching ingredients","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngredientsSearchResponse"}}}}}}},"/v1/ingredients/{name}/products":{"get":{"operationId":"productsByIngredient","summary":"Products containing an active ingredient (cross-linking)","description":"Products whose active ingredients include the named ingredient, with relationship filters for dose, composition, and labeler. Also returns the distinct doses the ingredient appears at.","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"Canonical active-ingredient name, e.g. ACETAMINOPHEN"},{"name":"strength","in":"query","schema":{"type":"string"},"description":"Specific normalized dose, e.g. '500 mg'. Omit for any dose."},{"name":"composition","in":"query","schema":{"type":"string","enum":["single","combination","all"],"default":"all"},"description":"single = sole active ingredient; combination = with others"},{"name":"labeler_type","in":"query","schema":{"type":"string","enum":["name_brand","store_brand","generic"]}},{"name":"free_of","in":"query","schema":{"type":"string"},"description":"Comma-separated allergen codes to exclude (see /v1/allergens). Only products with known inactive-ingredient data are returned, so 'free of' is never falsely asserted."},{"name":"contains_allergen","in":"query","schema":{"type":"string"},"description":"Comma-separated allergen codes; keep only products containing all of them"},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"Ingredient, available doses, and matching products","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngredientProductsResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/allergens":{"get":{"operationId":"listAllergens","summary":"Tracked allergen/sensitivity catalog with product counts","responses":{"200":{"description":"Allergen catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllergensResponse"}}}}}}},"/v1/symptoms":{"get":{"operationId":"listSymptoms","summary":"Symptom taxonomy (FDA-labeled ingredient mapping)","description":"Stable symptom ids with display labels and groups, plus the age bands accepted by the {id} routes. Every symptom maps to active ingredients that FDA OTC monographs or FDA-approved OTC labeling list for that indication — informational only, never a recommendation.","responses":{"200":{"description":"Symptom ids, groups, labels, and age bands","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymptomsListResponse"}}}}}}},"/v1/symptoms/{id}":{"get":{"operationId":"getSymptom","summary":"FDA-labeled ingredients for one symptom","description":"The full mapping entry: ingredients (primary and alternate lines) with regulatory sources, informational flags (with definitions), typical label age minimums, and pediatric availability data. The optional age filter is a label-convention pre-filter, not dosing guidance — the product label governs.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Symptom id from /v1/symptoms, e.g. fever"},{"name":"age","in":"query","schema":{"type":"integer","minimum":0,"maximum":120},"description":"Keep only ingredients whose typical label minimum age is <= this (years)"},{"name":"age_band","in":"query","schema":{"type":"string"},"description":"Age-range id from /v1/symptoms age_bands (e.g. 6_11) — the recommended filter for UIs; exact age= is the programmatic alternative"}],"responses":{"200":{"description":"Symptom mapping entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymptomDetailResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/symptoms/{id}/products":{"get":{"operationId":"symptomProducts","summary":"Catalog products for a symptom's FDA-labeled ingredients","description":"Convenience join: for each ingredient labeled for the symptom (after the optional age and line filters), the matching catalog products. Ingredients pooling multiple routes (e.g. menthol) are filtered to the entry's dosage form/route server-side.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Symptom id from /v1/symptoms"},{"name":"age","in":"query","schema":{"type":"integer","minimum":0,"maximum":120}},{"name":"age_band","in":"query","schema":{"type":"string"}},{"name":"line","in":"query","schema":{"type":"string","enum":["primary","all"],"default":"primary"},"description":"primary = monograph category directly indicated; all includes alternates"},{"name":"labeler_type","in":"query","schema":{"type":"string","enum":["name_brand","store_brand","generic"]}},{"name":"free_of","in":"query","schema":{"type":"string"},"description":"Comma-separated allergen codes to exclude (see /v1/allergens)"},{"name":"per_page","in":"query","schema":{"type":"integer","default":10,"maximum":25},"description":"Products per ingredient"}],"responses":{"200":{"description":"Per-ingredient product sets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymptomProductsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key as a bearer token: `Authorization: Bearer sk_...`. Required in production; the health endpoint is open."}},"responses":{"BadRequest":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Label":{"type":"object","description":"FDA Drug Facts label sections — informational restatements of FDA labeling, not advice.","properties":{"indications":{"type":["string","null"]},"warnings":{"type":["string","null"]},"do_not_use":{"type":["string","null"]},"ask_doctor":{"type":["string","null"]},"dosage_instructions":{"type":["string","null"]},"drug_interactions":{"type":["string","null"]},"pregnancy_warning":{"type":["string","null"]},"purpose":{"type":["string","null"]},"inactive_ingredients":{"type":["string","null"]}}},"ScanResponse":{"type":"object","description":"Catalog hit: product (ProductDetail) + resolution. Catalog miss known to the external database: product is null and external_match carries attributed descriptive data (no FDA label fields).","properties":{"barcode":{"type":"string"},"product":{"oneOf":[{"$ref":"#/components/schemas/ProductDetail"},{"type":"null"}]},"resolution":{"type":"object","properties":{"source":{"type":"string","example":"openfda"},"confidence":{"type":"number","example":0.95},"last_verified_at":{"type":["string","null"],"format":"date-time"}}},"external_match":{"type":"object","description":"Present only on catalog misses resolved by the external barcode database (EAN-DB). Descriptive, informational-only data.","properties":{"source":{"type":"string","enum":["ean-db"]},"title":{"type":["string","null"]},"manufacturer":{"type":["string","null"]},"categories":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}}},"scan_source":{"type":"string"}}},"CategoriesResponse":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","example":"analgesic"},"product_count":{"type":"integer"}}}}}},"EquivalenceGroupRow":{"type":"object","description":"A precomputed equivalence group (raw browse row).","properties":{"equivalence_hash":{"type":"string"},"ingredient_signature":{"type":"string","example":"ACETAMINOPHEN 500 mg [TABLET]"},"dosage_form":{"type":["string","null"]},"member_count":{"type":"integer"},"confidence_level":{"type":"string","enum":["exact","high","medium","low"]}}},"EquivalenceGroupsResponse":{"type":"object","properties":{"total":{"type":"integer"},"page":{"type":"integer"},"per_page":{"type":"integer"},"min_members":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EquivalenceGroupRow"}}}},"StatsResponse":{"type":"object","properties":{"counts":{"type":"object","properties":{"products":{"type":"integer"},"product_labels":{"type":"integer"},"equivalence_groups":{"type":"integer"},"ingredients":{"type":"integer"},"barcodes":{"type":"integer"}}},"labeler_breakdown":{"type":"object","properties":{"name_brand":{"type":"integer"},"store_brand":{"type":"integer"},"generic":{"type":"integer"}}},"top_equivalence_groups":{"type":"array","items":{"type":"object","properties":{"ingredient_signature":{"type":"string"},"member_count":{"type":"integer"}}}}}},"IngredientMeta":{"type":"object","description":"Canonical active-ingredient metadata.","properties":{"name":{"type":"string","example":"ACETAMINOPHEN"},"purpose":{"type":["string","null"]},"safety_note":{"type":["string","null"],"description":"Informational restatement of label warnings"},"therapeutic_class":{"type":["string","null"]},"rxcui":{"type":["string","null"]}}},"IngredientsSearchResponse":{"type":"object","properties":{"total":{"type":"integer"},"ingredients":{"type":"array","items":{"$ref":"#/components/schemas/IngredientMeta"}}}},"StrengthCount":{"type":"object","properties":{"strength":{"type":"string","example":"500 mg"},"product_count":{"type":"integer"}}},"IngredientProductRow":{"type":"object","description":"A product row in ingredient context (carries the named ingredient's dose and composition flags).","properties":{"product_id":{"type":"string"},"product_ndc":{"type":"string"},"brand_name":{"type":"string"},"generic_name":{"type":["string","null"]},"labeler_name":{"type":["string","null"]},"labeler_type":{"type":["string","null"],"enum":["name_brand","store_brand","generic",null]},"dosage_form":{"type":["string","null"]},"route":{"type":["array","null"],"items":{"type":"string"}},"this_ingredient_strength":{"type":["string","null"],"description":"Dose of the NAMED ingredient in this product"},"active_ingredient_count":{"type":"integer"},"is_combination":{"type":"boolean"},"allergen_flags":{"type":["array","null"],"items":{"type":"string"},"description":"Detected codes; [] = none detected; null = unknown"},"equivalence_hash":{"type":["string","null"]}}},"IngredientProductsResponse":{"type":"object","properties":{"ingredient":{"$ref":"#/components/schemas/IngredientMeta"},"query":{"type":"object","properties":{"resolved_name":{"type":"string"},"strength":{"type":["string","null"]},"composition":{"type":"string"},"free_of":{"type":"array","items":{"type":"string"}},"contains_allergen":{"type":"array","items":{"type":"string"}}}},"available_strengths":{"type":"array","items":{"$ref":"#/components/schemas/StrengthCount"}},"total":{"type":"integer"},"page":{"type":"integer"},"per_page":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/IngredientProductRow"}}}},"AllergensResponse":{"type":"object","properties":{"total":{"type":"integer"},"allergens":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"dye"},"label":{"type":"string","example":"Artificial dyes / colors"},"product_count":{"type":"integer","description":"Products KNOWN to contain it (coverage is partial)"}}}}}},"AgeBand":{"type":"object","properties":{"id":{"type":"string","example":"6_11"},"label":{"type":"string","example":"Older children (6–11)"},"min":{"type":"integer","example":6}}},"SymptomsListResponse":{"type":"object","properties":{"total":{"type":"integer"},"age_bands":{"type":"array","items":{"$ref":"#/components/schemas/AgeBand"}},"symptoms":{"type":"array","items":{"type":"object","properties":{"symptom_id":{"type":"string","example":"fever"},"group":{"type":"string","example":"cold_flu"},"label":{"type":"string","example":"Fever"}}}},"disclaimer":{"type":"string"}}},"AgeLabeling":{"type":"object","description":"Typical FDA Drug Facts label age convention — editorial, the product label governs. Not dosing guidance.","properties":{"min_age_years":{"type":"integer"},"under_age_guidance":{"type":"string","enum":["ask_doctor","do_not_use","none"]},"basis":{"type":"string"}}},"PedsInfo":{"type":"object","description":"Pediatric availability signals from live catalog sampling (UI hints, not facts). Ignore for ophthalmic-only ingredients.","properties":{"peds_branded_in_sample":{"type":"integer"},"liquid_or_chewable_in_sample":{"type":"integer"},"sample_size":{"type":"integer"},"peds_products_found":{"type":"boolean"},"liquid_or_chewable_available":{"type":"boolean"}}},"PedsStrengths":{"type":"object","properties":{"peds_only":{"type":"array","items":{"type":"string"}},"peds_mostly":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}}},"SymptomIngredient":{"type":"object","description":"One FDA-labeled ingredient for a symptom, with its regulatory citation and informational flags.","properties":{"canonical_name":{"type":"string"},"display_name":{"type":"string"},"therapeutic_class":{"type":"string"},"line":{"type":"string","enum":["primary","alternate"]},"regulatory_source":{"type":"string","example":"FDA OTC Monograph M013"},"salvio_query":{"type":"object","additionalProperties":{"type":"string"}},"client_filters":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}}},"flags":{"type":"array","items":{"type":"string"}},"age_labeling":{"$ref":"#/components/schemas/AgeLabeling"},"peds":{"$ref":"#/components/schemas/PedsInfo"},"peds_strengths":{"$ref":"#/components/schemas/PedsStrengths"},"validated":{"type":"object","properties":{"date":{"type":"string"},"product_count":{"type":"integer"}}}}},"SymptomDetailResponse":{"type":"object","properties":{"symptom_id":{"type":"string"},"group":{"type":"string"},"label":{"type":"string"},"ingredients":{"type":"array","items":{"$ref":"#/components/schemas/SymptomIngredient"}},"age_filter_applied":{"type":["integer","null"]},"excluded_by_age":{"type":"integer"},"flag_definitions":{"type":"object","additionalProperties":{"type":"string"}},"disclaimer":{"type":"string"}}},"SymptomProductsResponse":{"type":"object","properties":{"symptom_id":{"type":"string"},"label":{"type":"string"},"age_filter_applied":{"type":["integer","null"]},"line":{"type":"string","enum":["primary","all"]},"per_page":{"type":"integer"},"ingredients":{"type":"array","items":{"type":"object","properties":{"canonical_name":{"type":"string"},"display_name":{"type":"string"},"therapeutic_class":{"type":"string"},"line":{"type":"string","enum":["primary","alternate"]},"flags":{"type":"array","items":{"type":"string"}},"age_labeling":{"$ref":"#/components/schemas/AgeLabeling"},"peds":{"$ref":"#/components/schemas/PedsInfo"},"peds_strengths":{"oneOf":[{"$ref":"#/components/schemas/PedsStrengths"},{"type":"null"}]},"products":{"type":"object","description":"Matching catalog products, or { error } if this ingredient's lookup failed. For route_filtered entries, total is the catalog-wide ingredient count (pre-filter).","properties":{"available_strengths":{"type":"array","items":{"$ref":"#/components/schemas/StrengthCount"}},"total":{"type":"integer"},"route_filtered":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/IngredientProductRow"}},"error":{"type":"string"}}}}}},"disclaimer":{"type":"string"}}},"ParsedIngredient":{"type":"object","properties":{"name":{"type":"string","example":"ACETAMINOPHEN"},"strength":{"type":["string","null"],"example":"500 MG"},"purpose":{"type":["string","null"]},"safety_note":{"type":["string","null"]},"therapeutic_class":{"type":["string","null"]}}},"Suggestion":{"type":"object","properties":{"type":{"type":"string","enum":["ingredient_concern","overlap_warning","duplicate_class"]},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"detail":{"type":"string"},"suggestion":{"type":"string"}}},"Health":{"type":"object","properties":{"status":{"type":"string","example":"healthy"},"products_loaded":{"type":"integer"},"version":{"type":"string"},"disclaimer":{"type":"string"}}},"ActiveIngredient":{"type":"object","properties":{"name":{"type":"string"},"strength":{"type":["string","null"]},"strength_raw":{"type":["string","null"]},"purpose":{"type":["string","null"]},"safety_note":{"type":["string","null"]},"rxcui":{"type":["string","null"],"description":"RxNorm concept identifier"}}},"ProductSummary":{"type":"object","properties":{"product_id":{"type":"string"},"product_ndc":{"type":"string"},"brand_name":{"type":"string"},"generic_name":{"type":["string","null"]},"labeler_name":{"type":["string","null"]},"labeler_type":{"type":["string","null"],"enum":["name_brand","store_brand","generic",null]},"dosage_form":{"type":["string","null"]},"route":{"type":["array","null"],"items":{"type":"string"}},"active_ingredients":{"type":"array","items":{"$ref":"#/components/schemas/ActiveIngredient"}},"equivalents_count":{"type":["integer","null"]}}},"ProductDetail":{"allOf":[{"$ref":"#/components/schemas/ProductSummary"},{"type":"object","properties":{"marketing_category":{"type":["string","null"]},"allergen_flags":{"type":["array","null"],"items":{"type":"string"},"description":"Detected allergen/sensitivity codes, e.g. [\"dye\",\"gelatin\"]. null = unknown (no inactive-ingredient data); [] = none detected. Codes: dye, gluten, lactose, gelatin, aspartame, sulfites, soy, peanut, egg, parabens, benzoate, propylene_glycol."},"barcodes":{"type":"array","items":{"type":"object","properties":{"upc":{"type":"string"},"source":{"type":"string"},"confidence":{"type":"number"}}}},"label":{"oneOf":[{"$ref":"#/components/schemas/Label"},{"type":"null"}],"description":"FDA label sections (informational only); null when no label is on file"}}}]},"EquivalenceGroup":{"type":["object","null"],"properties":{"hash":{"type":"string"},"signature":{"type":"string"},"dosage_form":{"type":["string","null"]},"member_count":{"type":"integer"},"confidence_level":{"type":"string","enum":["exact","high","medium","low"]}}},"EquivalentProduct":{"allOf":[{"$ref":"#/components/schemas/ProductSummary"},{"type":"object","properties":{"confidence_score":{"type":"number"},"match_reason":{"type":["string","null"]}}}]},"SafetyNote":{"type":"object","properties":{"ingredient":{"type":"string"},"label_warning_present":{"type":"boolean"},"warning_category":{"type":"string"},"source":{"type":"string"},"consumer_summary":{"type":"string"},"recommendation_type":{"type":"string","enum":["informational_only"]}}},"AnalysisResponse":{"type":"object","properties":{"ingredients_parsed":{"type":"array","items":{"$ref":"#/components/schemas/ParsedIngredient"}},"matched_products":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"safety_notes":{"type":"array","items":{"$ref":"#/components/schemas/SafetyNote"}},"suggestions":{"type":"array","items":{"$ref":"#/components/schemas/Suggestion"}},"disclaimer":{"type":"string"}}}}}}