SalvioAPI Docs
OpenAPIllms.txtHome
API Reference

Salvio API

OTC product-data infrastructure: full-text product search, brand-to-generic equivalence, ingredient label analysis, and barcode resolution for the U.S. pharmacy aisle. Built for developers and AI agents.

Base URL: https://api.salvio.health/v1 · try any endpoint live below
Informational product data only
Salvio returns structured product information sourced from FDA labeling. It does not provide medical advice, diagnosis, or treatment or substitution recommendations. Always consult a pharmacist or healthcare provider before making medication decisions.

Authentication

Pass your API key as a Bearer token in the Authorization header. Keys are prefixed sk_.

curl
curl https://api.salvio.health/v1/products/search?q=tylenol \
  -H "Authorization: Bearer sk_..."
No key needed during pre-launch
The API is currently open: calls without an Authorization header are served on an anonymous open tier, so every Try it panel on this page works with no key. Once keys become required, send Authorization: Bearer sk_... and unauthenticated requests will return 401.

Rate limits

Keyed requests are metered per calendar month. Responses include X-RateLimit-Limit and X-RateLimit-Remaining headers; exceeding your monthly allowance returns 429.

TierMonthly limitPrice
Open (anonymous)Pre-launch, open access
Hobby10,000 / monthFree
Starter100,000 / month$49 / mo
Pro1,000,000 / month$249 / mo
EnterpriseCustomContact sales
Reference

Endpoints

Every endpoint is under the base URL above. Each is listed below with its parameters, an example response, and a live Try It panel. Prefer to explore visually? Jump to the interactive playground.

Health

GET/health

Liveness probe. Returns service status, the number of active products loaded, and the API version. Always public.

Try itLive call to the Salvio API · no key required

Product Lookup

GET/products/{identifier}

Look up a single product by NDC code or UPC barcode. Returns full detail including active ingredients, barcodes, and FDA label data (indications, warnings, dosage, interactions) when available.

Try itLive call to the Salvio API · no key required
Label data
When FDA label data is available for the product, the response includes label.indications, label.warnings, label.do_not_use, label.dosage_instructions, and label.drug_interactions. These are informational restatements of FDA labeling, not advice.

Equivalents

GET/products/{identifier}/equivalents

Find all products that share the same active ingredients, strength, and dosage form (for example, store-brand and generic products with the same formulation as a name brand). Store brands are sorted first, and each match carries a confidence score. “Equivalent” means matching active ingredients — not a clinical substitution recommendation.

Try itLive call to the Salvio API · no key required

Confidence levels

exact
All ingredients, strengths, and form match
high
Ingredients match; minor variation
medium
Same therapeutic class
low
Related; review the label

Ingredient Analysis

POST/ingredients/analyze

Analyze a list of active-ingredient strings parsed from a product label, OCR scan, or manual input. Returns an ingredient breakdown, matching products, informational safety notes drawn from FDA labeling, and suggestions. Returns { ingredients_parsed, matched_products, safety_notes, suggestions, disclaimer }.

Request body

request
{
  "ingredients": [
    "ACETAMINOPHEN 325 MG",
    "DEXTROMETHORPHAN HYDROBROMIDE 10 MG",
    "GUAIFENESIN 200 MG",
    "PHENYLEPHRINE HYDROCHLORIDE 5 MG"
  ]
}
Try itLive call to the Salvio API · no key required
Comma-separate the ingredients
The ingredients field above is a convenience for this panel — type ingredient strings separated by commas and Salvio sends them as a JSON array { "ingredients": [...] }.

Safety note structure

Every safety note carries recommendation_type: "informational_only". This is FDA label data, not medical advice.

safety_notes
{
  "ingredient": "ACETAMINOPHEN",
  "label_warning_present": true,
  "warning_category": "liver",
  "source": "FDA label",
  "consumer_summary": "This product contains acetaminophen...",
  "recommendation_type": "informational_only"
}

Suggestion types

ingredient_concern
Known effectiveness or safety notes on the FDA label
overlap_warning
Risk of exceeding a labeled dose across products
duplicate_class
Multiple ingredients in the same class (e.g. two NSAIDs)
cheaper_alternative
Store-brand products with the same formulation exist

Ingredient Search

GET/ingredients

Search the catalog of canonical active-ingredient names. Use this to resolve a user-typed name (e.g. “tylenol” or a misspelling) to the canonical ingredient before calling /ingredients/{name}/products. Each match carries its purpose, therapeutic class, RxNorm identifier, and an informational label-safety note where one exists. Returns { total, ingredients }.

NameTypeRequiredDescription
qstringOptionalSubstring to match against canonical ingredient names. Omit to list ingredients alphabetically.
response
{
  "total": 1,
  "ingredients": [{
    "name": "ACETAMINOPHEN",
    "purpose": "Pain reliever / fever reducer",
    "safety_note": "Liver warning: contains acetaminophen...",
    "therapeutic_class": "Analgesic / antipyretic",
    "rxcui": "161"
  }]
}
Try itLive call to the Salvio API · no key required

Products by Ingredient

GET/ingredients/{name}/products

The core cross-linking primitive: every product whose active ingredients include the named ingredient, with relationship filters for dose, composition (sole active vs. combination), and labeler. The response also returns the distinct doses the ingredient appears at (available_strengths) so you can build a dose picker, plus per-product allergen_flags. Returns { ingredient, query, available_strengths, total, page, per_page, results }.

NameTypeRequiredDescription
namestring (path)RequiredCanonical active-ingredient name, e.g. ACETAMINOPHEN (case-insensitive)
strengthstringOptionalSpecific normalized dose, e.g. 500 mg. Omit for any dose.
compositionstringOptionalsingle = sole active ingredient; combination = with others; all (default)
labeler_typestringOptionalname_brand, store_brand, generic
free_ofstringOptionalComma-separated allergen codes to exclude (see /allergens). Only products with known inactive-ingredient data are returned.
contains_allergenstringOptionalComma-separated allergen codes; keep only products containing all of them
pageintegerOptional1-based page number (default 1)
per_pageintegerOptionalResults per page (default 20, max 100)
response
{
  "ingredient": {
    "name": "IBUPROFEN",
    "purpose": "Pain reliever / fever reducer (NSAID)",
    "therapeutic_class": "NSAID",
    "rxcui": "5640"
  },
  "query": {
    "resolved_name": "IBUPROFEN",
    "strength": "200 mg",
    "composition": "single",
    "free_of": ["gluten"],
    "contains_allergen": []
  },
  "available_strengths": [
    { "strength": "200 mg", "product_count": 412 },
    { "strength": "400 mg", "product_count": 88 }
  ],
  "total": 412,
  "page": 1,
  "per_page": 20,
  "results": [{
    "product_ndc": "0573-0150",
    "brand_name": "ADVIL",
    "generic_name": "IBUPROFEN",
    "labeler_type": "name_brand",
    "dosage_form": "TABLET, COATED",
    "this_ingredient_strength": "200 mg",
    "active_ingredient_count": 1,
    "is_combination": false,
    "allergen_flags": ["dye"]
  }]
}
Try itLive call to the Salvio API · no key required
Allergen flags are informational and partial
allergen_flags lists allergen codes detected in a product’s FDA-listed inactive ingredients. Coverage is partial — only ~55% of products have inactive-ingredient data on file. When a product has no inactive-ingredient data, allergen_flags is null (status unknown) rather than an empty list, and the free_of filter excludes those products entirely — so “free of” is never falsely asserted. This is informational product data, not a guarantee of safety for any individual.

Allergens

GET/allergens

The catalog of allergens and sensitivities Salvio tracks, each with the number of products known to contain it. Use the returned code values with the free_of and contains_allergen filters on /ingredients/{name}/products. Returns { total, allergens }.

response
{
  "total": 12,
  "allergens": [
    { "code": "dye",     "label": "Artificial dyes / colors", "product_count": 5821 },
    { "code": "gluten",  "label": "Gluten (wheat)",           "product_count": 1043 },
    { "code": "lactose", "label": "Lactose",                  "product_count": 2310 },
    { "code": "gelatin", "label": "Gelatin (animal-derived)", "product_count": 1487 }
  ]
}
Try itLive call to the Salvio API · no key required
Informational, partial coverage
Allergen detection runs over FDA-listed inactive ingredients, which are on file for only ~55% of products. product_count reflects products where the allergen was detected; it is not an exhaustive count. Treat this as informational product data, not medical or dietary advice.

Symptoms

GET/symptoms · /symptoms/{id} · /symptoms/{id}/products

The symptom-to-ingredient mapping: for each of 20 common symptom ids, the active ingredients that FDA OTC monographs or FDA-approved OTC labeling list for that indication — with regulatory sources, informational flags, typical label age minimums, and pediatric availability. /symptoms lists the taxonomy and the selectable age ranges; /symptoms/{id} returns one symptom’s ingredients (filter with an age_band= range id — the recommended way — or an exact age= in years); /symptoms/{id}/products joins each qualifying ingredient out to its catalog products (line=primary|all, labeler_type, free_of, per_page per ingredient, max 25).

response (symptoms/fever?age_band=4_5, abridged)
{
  "symptom_id": "fever",
  "label": "Fever",
  "ingredients": [
    {
      "canonical_name": "ACETAMINOPHEN",
      "display_name": "Acetaminophen",
      "therapeutic_class": "Antipyretic",
      "line": "primary",
      "regulatory_source": "FDA OTC Monograph M013",
      "flags": ["APAP_LIVER"],
      "age_labeling": { "min_age_years": 2, "under_age_guidance": "ask_doctor" }
    }
  ],
  "age_filter_applied": 4,
  "excluded_by_age": 2,
  "flag_definitions": { "APAP_LIVER": "Acetaminophen liver warning; ..." }
}
Try itLive call to the Salvio API · no key required
Labeled for — never a recommendation
Every mapping entry exists because FDA OTC monographs or FDA-approved OTC labeling list that ingredient for that indication. The mapping does not rank by effectiveness or recommend treatment, and the age filter is a label-convention pre-filter, not dosing guidance — the individual product label always governs. Informational product data only.

Barcode Scan

GET/scan/{barcode}

Resolve a product by UPC (12-digit) or EAN (13-digit) barcode. Returns product detail plus a resolution object with the match source and a confidence score.

resolution
{
  "resolution": {
    "source": "openfda",
    "confidence_score": 0.95,
    "barcode_format": "UPC",
    "last_verified_at": "2026-05-18T00:00:00Z"
  }
}
Try itLive call to the Salvio API · no key required
Partial barcode coverage
OpenFDA UPC coverage is partial (~34%), so many valid products will not resolve by barcode and return 404. Fall back to /products/search?q=... by product name.

Equivalence Groups

GET/equivalence-groups

Browse precomputed equivalence groups — sets of products sharing the same active ingredients, strength, and dosage form, ordered by member count. Useful for discovering which OTC products have the most generic and store-brand alternatives. Filter with min_members and paginate with page / per_page.

response
{
  "total": 2847,
  "results": [{
    "equivalence_hash": "a3f7b2c1e8d94f01",
    "ingredient_signature": "ACETAMINOPHEN 500 mg [TABLET]",
    "member_count": 665,
    "confidence_level": "exact",
    "store_brand_count": 245,
    "name_brand_count": 12,
    "generic_count": 408
  }]
}
Try itLive call to the Salvio API · no key required

Categories

GET/categories

List the OTC product categories Salvio recognizes (for example, pain relief, cough and cold, allergy). Returns { categories }.

Try itLive call to the Salvio API · no key required

Stats

GET/stats

Dataset summary statistics — counts of products, ingredients, equivalence groups, and label coverage across the corpus.

Try itLive call to the Salvio API · no key required
Interactive

Interactive playground

Explore the ingredient graph without writing any code. Search by ingredient and filter by dose, composition, labeler, and “free of” allergen — or search by product and pivot into its active ingredients. Every interaction is a live call to the same endpoints documented above (/ingredients/{name}/products, /products/search, /allergens).

Open during pre-launch — no key required
The playground (like the rest of the API right now) is open: it calls Salvio anonymously, so you can use it with no API key. Once keys become required, programmatic calls will need Authorization: Bearer sk_....
ibuprofenbismuth subsalicylateacetaminophenloratadine

DemoResults are limited to 5 — the full explorer (all matches) is for signed-in users.

Informational product data only, from FDA labeling. “Equivalent” = same active ingredients, strength, and dosage form — not a clinical substitution recommendation. Allergen coverage is partial: only ~55% of products have inactive-ingredient data on file. Products without it show “inactive ingredients not on file” and are never reported as “free of” anything.

Agents & MCP

Salvio is built to be consumed by AI agents as well as applications. Three machine-readable surfaces make the API discoverable.

SurfacePathPurpose
OpenAPI 3.1/openapi.jsonFull machine-readable spec for codegen and discovery
llms.txt/llms.txtPlain-text orientation for LLMs browsing the API
MCP server/api/mcpStreamable HTTP MCP endpoint exposing Salvio as agent tools

MCP server

The Salvio MCP server (salvio-mcp-server) is a remote, stateless Streamable HTTP endpoint at /api/mcp. Point any MCP-capable client at that URL. All twelve tools are read-only.

mcp client config
{
  "mcpServers": {
    "salvio": {
      "type": "streamable-http",
      "url": "https://api.salvio.health/api/mcp"
    }
  }
}

Tools

salvio_search_products
Full-text search across OTC products
salvio_get_product
Look up a product by NDC or UPC
salvio_get_equivalents
Products sharing the same active ingredients
salvio_analyze_ingredients
Analyze a list of ingredient strings
salvio_resolve_barcode
Resolve a UPC/EAN barcode to a product
salvio_list_equivalence_groups
Browse precomputed equivalence groups
salvio_search_ingredients
Search canonical active-ingredient names
salvio_products_by_ingredient
Products containing an ingredient (allergen filters)
salvio_list_allergens
Tracked allergen/sensitivity codes
salvio_list_symptoms
Symptom taxonomy + age bands
salvio_get_symptom
FDA-labeled ingredients for a symptom
salvio_symptom_products
Catalog products per labeled ingredient

Errors

CodeMeaning
200Success
400Bad request (missing or invalid parameter)
401Unauthorized (invalid key, or key required)
404Not found
429Rate limited (monthly limit exceeded)
500Server error
Disclaimer
This API provides informational product data sourced from FDA labeling. It does not provide medical advice, diagnosis, or treatment or substitution recommendations. Consult a pharmacist or healthcare provider before making medication decisions.
Salvio API v1.0Data: OpenFDA · RxNorm