Generated banner for Openfda Database
Generated logo for Openfda Database

Openfda Database

Google DeepMindOfficialPublished by Google DeepMind

  • Skill
  • Tool integration
  • Science and research
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Query, search, and download data from the openFDA API for drugs, devices, foods, tobacco, cosmetics, animal and veterinary products, substances, and transparency data. Use for FDA adverse events, recalls, labeling, approvals, shortages, 510(k) clearances, NDC lookups, and any FDA safety or regulatory data query across all 28 API endpoints.
— the description by Google DeepMind

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The openfda-database skill provides a structured interface to interact with the openFDA API. It enables users to search, count, and download large datasets related to drugs, medical devices, food, tobacco, and other regulated products. The skill includes built-in rate-limiting management and helper scripts to ensure efficient data retrieval while adhering to API constraints.

What it does

  • Searches across 28 distinct FDA API endpoints for regulatory and safety data.
  • Aggregates and counts unique field values to identify trends in adverse events or product data.
  • Downloads large datasets with automated pagination and safety caps.
  • Supports precise querying using exact-match syntax for categorical fields.
  • Provides guidance on handling hyphenated identifiers like NDCs and managing discontinued product lookups.
  • Integrates with local environment configurations to manage API keys for increased request limits.

When to use it

  • When researching adverse event reports for specific drugs or medical devices.
  • When performing regulatory analysis on product recalls, approvals, or shortages.
  • When looking up National Drug Code (NDC) information for active or discontinued products.
  • When analyzing demographic or geographic trends in safety reporting data.
  • When conducting large-scale data extraction from FDA databases for research purposes.

Advantages

  • Simplifies complex API interaction with a unified command-line interface.
  • Prevents accidental rate-limit exhaustion through built-in management.
  • Enforces best practices for data precision using exact-match suffixes.
  • Provides a safe, file-based output mechanism to handle large JSON responses.
  • Includes clear fallback strategies for common data retrieval challenges.

Usage examples

“Find the top 10 adverse reaction terms for Metformin.”
The agent uses the count command with the exact-match suffix on the reaction field to generate a summary file of the most frequent MedDRA preferred terms.
“Download all adverse event reports for Aspirin from January 2025.”
The agent uses the download command with a date-range filter to fetch and save the relevant records to a JSON file.
“Look up information for a discontinued drug using its NDC.”
The agent attempts to query the NDC endpoint, and upon finding no results, automatically falls back to the label endpoint to retrieve product information.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/google-deepmind/openfda-database/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip openfda-database.zip -d .agents/skills

Documentation by Google DeepMind

openFDA Search and Query

Prerequisites

  1. uv: Read the uv skill and follow its Setup instructions to ensure uv is installed and on PATH.

  2. User Notification: If .licenses/openfda_database_LICENSE.txt does not already exist in the workspace root directory then (1) prominently notify the user to check the terms at https://open.fda.gov/apis/ and https://open.fda.gov/license, then (2) create the file recording the notification text and timestamp.

  3. .env file: Make sure the .env file exists in your home directory. Create one if it does not exist.

  4. FDA_API_KEY (optional but recommended): Raises the daily request limit from 1,000 to 120,000. The skill works without it, but an agent can easily exhaust the keyless limit in a single session. You can register for a free key at https://open.fda.gov/apis/authentication/. You MUST use the safe credentials protocol in the credentials skill to check for and request this key if this skill looks relevant to the user's request.

Core Rules

  • Use the Wrapper: ALWAYS execute the provided helper scripts to query the database rather than accessing the database directly. The scripts automatically enforce the required rate limit gracefully.

  • Rate Limiting: Respect openFDA rate limits. Without API key: 240 requests/min, 1,000 requests/day per IP. With API key: 240 requests/min, 120,000 requests/day per key. Always set an API key before running multi-query workflows.

Warning: An automated agent can easily exhaust the 1,000-request daily limit in a single research session. Always set an API key before running multi-query workflows.

You MUST use the safe credentials protocol in the credentials skill to help the user add FDA_API_KEY to their .env file if this skill looks relevant to the user's request. The script will emit a warning to stderr if no API key is detected.

  • Always Use --output: All subcommands require --output <file> to write results to a file. This prevents large output becoming overwhelming. Use jq or code to read the output file.

  • Notification: If this skill is used, ensure this is mentioned in the output.

Utility Script

Single script for all operations:

uv run scripts/openfda_query.py {search,count,download} --output <file> [options]

Search any of the 28 endpoints and save JSON results to a file.

uv run scripts/openfda_query.py search \
  --category drug --endpoint event \
  --search "patient.drug.medicinalproduct:aspirin" \
  --limit 5 --output /tmp/fda_results.json

Stdout prints a compact summary:

{"status": "success", "output": "/tmp/fda_results.json", "results_in_file": 5, "total_matching": 601477}

Options:

  • --output: Output file for full JSON results (required).

  • --category: API category — drug, device, food, tobacco, other, animalandveterinary, cosmetic, transparency.

  • --endpoint: Endpoint within the category (e.g., event, label, 510k). See references/api_endpoints.md for full list.

  • --search: Query string (e.g., patient.drug.medicinalproduct:aspirin+AND+serious:1).

  • --sort: Sort field and order (e.g., receivedate:desc).

  • --limit: Max results (default 10, max 1000).

  • --skip: Pagination offset (default 0).

  • --api_key: API key (also reads FDA_API_KEY env var).

2. Count

Count unique values of a field within matching results.

uv run scripts/openfda_query.py count \
  --category drug --endpoint event \
  --search "patient.drug.medicinalproduct:aspirin" \
  --count_field "patient.reaction.reactionmeddrapt.exact" \
  --summary 10 --output /tmp/aspirin_reactions.json

Stdout prints a summary with the top 5 terms. Full data is in the output file.

Additional options:

  • --count_field: Field to count (append .exact for whole-phrase counting).

  • --summary N: Return only the top N most frequent terms. Use this to avoid flooding the context with hundreds of infrequent terms.

3. Download

Download multiple pages of results to a file.

uv run scripts/openfda_query.py download \
  --category drug --endpoint event \
  --search "patient.drug.medicinalproduct:aspirin" \
  --limit 100 --max_pages 5 \
  --output /tmp/aspirin_events.json

Additional options:

  • --max_pages: Maximum pages to fetch (default 10).

  • --all_results: Automatically paginate to fetch all matching results. Safety cap of 25,000 records maximum per download to prevent runaway downloads and prevent excessive API usage.

    Tip: Common drugs can have excessive reports. Use a date range (e.g., receivedate:[20250101+TO+20250131]) to limit the volume of download.

Entity Resolution: Using .exact for Precision

When searching for specific product names, drug names, or categorical terms, always use the .exact suffix on the field to get exact-match results. Without it, the API tokenizes multi-word values and returns noisy partial matches.

# Precise: matches only "ADVIL"
uv run scripts/openfda_query.py search --category drug --endpoint label \
  --search 'openfda.brand_name.exact:"ADVIL"' \
  --limit 5 --output /tmp/advil_label.json

Note: Many brand names in the FDA database include variant suffixes (e.g., "TYLENOL Extra Strength" rather than just "TYLENOL"). If an .exact search returns 0 results, try without .exact to see the available brand name variants, then re-query with the full exact name.

The .exact suffix is also required when using --count_field to aggregate whole phrases instead of individual words.

NDC Lookups: Hyphens & Discontinued Drugs

  1. Always Quote Hyphenated NDCs: In openFDA search syntax, an unquoted hyphen (-) acts as the boolean NOT operator (e.g., 51285-092 searches for 51285 AND NOT 092). Always enclose hyphenated NDC strings in escaped double quotes:

    uv run scripts/openfda_query.py search --category drug --endpoint ndc \
      --search 'product_ndc:"51285-092"' \
      --limit 5 --output /tmp/ndc.json
  2. Discontinued Drugs Fallback (drug/label): The drug/ndc endpoint only contains currently active/marketed products. If a valid NDC returns 0 results in drug/ndc, query the drug/label endpoint with exact phrase quotes (--search '"51285-092"'). Note that for discontinued drugs, the openfda metadata block may be empty ({}), so read brand name, active ingredients, and labeler from the label text fields (package_label_principal_display_panel, description, or spl_product_data_elements).

MedDRA Term Resolution

openFDA adverse event data uses MedDRA (Medical Dictionary for Regulatory Activities) terms for reactions. The API reports Preferred Terms (PTs) but does not provide the MedDRA hierarchy (System Organ Class, High Level Terms, etc.).

Note: MedDRA is a proprietary ontology and is not indexed in the EMBL-EBI OLS. To approximate MedDRA hierarchy lookups, use the Human Phenotype Ontology (HP) or NCI Thesaurus (NCIT) as proxy ontologies — they cross-reference MedDRA IDs and provide parent/ancestor relationships.

# Step 1: Get top reactions from openFDA
uv run scripts/openfda_query.py count \
  --category drug --endpoint event \
  --search "patient.drug.medicinalproduct:metformin" \
  --count_field "patient.reaction.reactionmeddrapt.exact" \
  --summary 5 --output /tmp/metformin_reactions.json

# Step 2: Look up the top reaction term using a biomedical ontology service
# skill (e.g. embl-ebi-ols skill).
# MedDRA is not available in OLS; use the Human Phenotype Ontology (HP) or
# NCI Thesaurus (NCIT) as a proxy to find the hierarchical classification of
# the reaction term.

Available Endpoints (28 total)

Category to endpoint mapping:

  • drug: event, label, ndc, enforcement, drugsfda, shortages

  • device: 510k, classification, enforcement, event, pma, recall, registrationlisting, udi, covid19serology

  • food: enforcement, event

  • tobacco: problem, researchpreventionads, researchdigitalads, researchsmokefree

  • other: historicaldocument, nsde, substance, unii

  • animalandveterinary: event

  • cosmetic: event

  • transparency: crl

Reference

Recipes

Common query patterns for drugs, devices, foods, tobacco, cosmetics, animal and veterinary products, substances, transparency data, adverse events, recalls, labeling, approvals, shortages, 510(k) clearances, NDC lookups, any FDA safety or regulatory data query, and more. See references/recipes.md for the full recipes.

Workflow

  1. Search for records using search with --output. Read the output file.

  2. Use count with --summary 10 --output to summarize field distributions.

  3. Use download (with --all_results for exhaustive pulls) to fetch larger datasets.

  4. Read and analyze the output file using standard tools.

  5. For MedDRA term hierarchy questions, use a biomedical ontology service skill (e.g. EMBL-EBI OLS skill with the HP or NCIT ontology) to look up the term.

Files

scripts/openfda_query.py

# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Queries the openFDA API and returns results in clean JSON format.

This script provides a CLI for searching, counting, and downloading data from
all 28 openFDA API endpoints across 8 categories: drug, device, food, tobacco,
other, animalandveterinary, cosmetic, and transparency.
"""

# /// script
# requires-python = ">=3.10"
# dependencies = [
#   "polite-http",
#   "python-dotenv",
# ]
# ///

from __future__ import annotations

import argparse
import gzip
import json
import os
import sys
from typing import Any

import dotenv
from polite_http import http_client

BASE_URL = "https://api.fda.gov"
CLIENT = http_client.HttpClient(BASE_URL, qps=4.0)

VALID_ENDPOINTS = {
    "drug": [
        "event",
        "label",
        "ndc",
        "enforcement",
        "drugsfda",
        "shortages",
    ],
    "device": [
        "510k",
        "classification",
        "enforcement",
        "event",
        "pma",
        "recall",
        "registrationlisting",
        "udi",
        "covid19serology",
    ],
    "food": ["enforcement", "event"],
    "tobacco": [
        "problem",
        "researchpreventionads",
        "researchdigitalads",
        "researchsmokefree",
    ],
    "other": ["historicaldocument", "nsde", "substance", "unii"],
    "animalandveterinary": ["event"],
    "cosmetic": ["event"],
    "transparency": ["crl"],
}

ALL_RESULTS_SAFETY_CAP = 25000


def _warn_no_api_key(api_key: str | None) -> None:
  key = api_key or os.environ.get("FDA_API_KEY")
  if not key:
    print(
        "WARNING: No API key provided. This API has much lower rate limits"
        " without a key. Get one at https://open.fda.gov/apis/authentication/"
        " and pass via --api_key or the FDA_API_KEY environment variable.",
        file=sys.stderr,
    )


def _write_output(data: dict[str, Any], output_path: str) -> None:
  out_dir = os.path.dirname(output_path)
  if out_dir:
    os.makedirs(out_dir, exist_ok=True)

  if isinstance(data, dict):
    data["_license_notice"] = (
        "Data provided by openFDA. Please review the licensing terms at"
        " https://open.fda.gov/license/"
    )

  with open(output_path, "w") as f:
    json.dump(data, f, indent=2)


def _print_json(data: dict[str, Any]) -> None:
  """Prints a dictionary as indented JSON to stdout."""
  print(json.dumps(data, indent=2))


def _validate_endpoint(category: str, endpoint: str) -> bool:
  if category not in VALID_ENDPOINTS:
    return False
  return endpoint in VALID_ENDPOINTS[category]


def _print_endpoint_error(category: str, endpoint: str) -> None:
  """Prints an error message for an invalid endpoint and exits.

  The error message includes the valid endpoints for the given category.

  Args:
    category: The API category provided.
    endpoint: The invalid API endpoint provided.
  """
  valid = ", ".join(VALID_ENDPOINTS.get(category, []))
  _print_json({
      "status": "error",
      "message": (
          f"Invalid endpoint '{endpoint}' for category "
          f"'{category}'. Valid endpoints: {valid}"
      ),
  })
  sys.exit(1)


def _build_url(
    *,
    category: str,
    endpoint: str,
    search: str | None = None,
    sort: str | None = None,
    limit: int = 10,
    skip: int = 0,
    count_field: str | None = None,
    api_key: str | None = None,
) -> str:
  """Builds the openFDA API URL with the given parameters.

  Args:
    category: The API category (e.g., "drug").
    endpoint: The API endpoint within the category (e.g., "event").
    search: Optional search query string.
    sort: Optional sort field and order string.
    limit: The maximum number of results per request.
    skip: The number of records to skip for pagination.
    count_field: Optional field to count unique values for.
    api_key: Optional API key.

  Returns:
    A string representing the constructed URL.
  """
  url = f"{BASE_URL}/{category}/{endpoint}.json?"
  params = []

  key = api_key or os.environ.get("FDA_API_KEY")
  if key:
    params.append(f"api_key={key}")
  if search:
    params.append(f"search={search}")
  if sort:
    params.append(f"sort={sort}")
  if count_field:
    params.append(f"count={count_field}")
  else:
    params.append(f"limit={limit}")
    params.append(f"skip={skip}")

  return url + "&".join(params)


def _fetch(url: str) -> dict[str, Any]:
  """Fetches JSON data from the given URL and handles errors."""

  try:
    resp = CLIENT.fetch(url, headers={"Accept": "application/json"})
    body = resp.data
    # Fallback: decompress if the body is gzip but the Content-Encoding
    # header was missing or stripped (common with the openFDA API).
    if body[:2] == b"\x1f\x8b":
      body = gzip.decompress(body)
    return json.loads(body.decode(resp.encoding))
  except http_client.HttpError as e:
    if e.status_code == 429:
      return {
          "status": "error",
          "http_code": 429,
          "message": (
              "Rate limit exceeded (HTTP 429). You have hit the openFDA request"
              " limit. Without an API key the limit is 240 requests/min and"
              " 1,000/day. With a free API key the daily limit increases to"
              " 120,000. Register at: https://open.fda.gov/apis/authentication/"
          ),
      }
    if e.status_code is not None:
      body = ""
      if e.body:
        body = e.body.decode("utf-8", errors="replace")
      try:
        error_json = json.loads(body)
        return {"status": "error", "http_code": e.status_code, **error_json}
      except (json.JSONDecodeError, ValueError):
        return {
            "status": "error",
            "http_code": e.status_code,
            "message": f"HTTP {e.status_code}: {str(e)}",
            "body": body[:500],
        }
    return {"status": "error", "message": f"Network error: {str(e)}"}


def cmd_search(args: argparse.Namespace) -> None:
  """Searches the openFDA API and writes the results to a file.

  Constructs a search URL based on the provided arguments, fetches the data,
  and writes the JSON response to the file specified by --output. Also prints
  a summary of the operation to stdout.

  Args:
    args: An argparse.Namespace object containing the command-line arguments,
      including category, endpoint, search, sort, limit, skip, api_key, and
      output.
  """
  if not _validate_endpoint(args.category, args.endpoint):
    _print_endpoint_error(args.category, args.endpoint)

  _warn_no_api_key(args.api_key)

  url = _build_url(
      category=args.category,
      endpoint=args.endpoint,
      search=args.search,
      sort=args.sort,
      limit=args.limit,
      skip=args.skip,
      api_key=args.api_key,
  )
  result = _fetch(url)
  _write_output(result, args.output)

  total = result.get("meta", {}).get("results", {}).get("total", "?")
  count = len(result.get("results", []))
  _print_json({
      "status": "success",
      "output": args.output,
      "results_in_file": count,
      "total_matching": total,
  })


def cmd_count(args: argparse.Namespace) -> None:
  """Counts unique values for a specified field using the openFDA API.

  Fetches counts of unique terms for a given field based on the provided
  search criteria. Optionally, it can return only a summary of the top N
  most frequent terms. The results are written to the file specified by
  --output.

  Args:
    args: An argparse.Namespace object containing the command-line arguments,
      including category, endpoint, search, count_field, summary, and output.
  """
  if not _validate_endpoint(args.category, args.endpoint):
    _print_endpoint_error(args.category, args.endpoint)

  _warn_no_api_key(args.api_key)

  url = _build_url(
      category=args.category,
      endpoint=args.endpoint,
      search=args.search,
      sort=args.sort,
      count_field=args.count_field,
      api_key=args.api_key,
  )
  result = _fetch(url)

  if args.summary and "results" in result:
    result["results"] = result["results"][: args.summary]

  _write_output(result, args.output)

  entries = len(result.get("results", []))
  top_terms = []
  for r in result.get("results", [])[:5]:
    top_terms.append({"term": r.get("term"), "count": r.get("count")})
  _print_json({
      "status": "success",
      "output": args.output,
      "entries": entries,
      "top_terms": top_terms,
  })


def cmd_download(args: argparse.Namespace) -> None:
  """Downloads multiple pages of openFDA results and writes them to a file.

  Fetches results from the specified openFDA endpoint, handling pagination
  based on --max_pages or --all_results. The fetched records are
  accumulated and written as a single JSON object to the file specified
  by --output.

  Args:
    args: An argparse.Namespace object containing the command-line arguments.
  """
  if not _validate_endpoint(args.category, args.endpoint):
    _print_endpoint_error(args.category, args.endpoint)

  _warn_no_api_key(args.api_key)

  all_results = []
  skip = args.skip
  limit = args.limit

  if args.all_results:
    max_records = ALL_RESULTS_SAFETY_CAP
    limit = min(limit, 1000) if limit else 1000
    max_pages = max_records // limit + 1
    print(
        f"Fetching all results (safety cap: {max_records} records)...",
        file=sys.stderr,
    )
  else:
    max_pages = args.max_pages
    max_records = max_pages * limit

  for page in range(max_pages):
    url = _build_url(
        category=args.category,
        endpoint=args.endpoint,
        search=args.search,
        sort=args.sort,
        limit=limit,
        skip=skip,
        api_key=args.api_key,
    )
    result = _fetch(url)

    if result.get("status") == "error" or "error" in result:
      print(json.dumps(result, indent=2), file=sys.stderr)
      break

    results = result.get("results", [])
    if not results:
      break

    all_results.extend(results)
    meta = result.get("meta", {}).get("results", {})
    total = meta.get("total", 0)

    print(
        f"Page {page + 1}: fetched {len(results)} records "
        f"({len(all_results)}/{total} total)",
        file=sys.stderr,
    )

    skip += limit
    if skip >= total or len(all_results) >= max_records:
      break

  output_data = {
      "status": "success",
      "results_count": len(all_results),
      "results": all_results,
  }
  _write_output(output_data, args.output)

  _print_json({
      "status": "success",
      "message": f"Downloaded {len(all_results)} records to {args.output}",
  })


def parse_args() -> argparse.Namespace:
  """Parses command-line arguments for the openFDA query script.

  Defines subparsers for 'search', 'count', and 'download' commands,
  along with common arguments like category, endpoint, search, sort,
  limit, skip, api_key, and output.

  Returns:
      argparse.Namespace: The parsed command-line arguments.
  """
  parser = argparse.ArgumentParser(
      description="Query the openFDA API (all 28 endpoints)"
  )
  subparsers = parser.add_subparsers(dest="command", required=True)

  common = argparse.ArgumentParser(add_help=False)
  common.add_argument(
      "--category",
      type=str,
      required=True,
      choices=sorted(VALID_ENDPOINTS.keys()),
      help="API category (e.g. drug, device, food)",
  )
  common.add_argument(
      "--endpoint",
      type=str,
      required=True,
      help="API endpoint within the category (e.g. event, label, 510k)",
  )
  common.add_argument(
      "--search",
      type=str,
      default=None,
      help="Search query (e.g. 'patient.drug.medicinalproduct:aspirin')",
  )
  common.add_argument(
      "--sort",
      type=str,
      default=None,
      help="Sort field:order (e.g. 'receivedate:desc')",
  )
  common.add_argument(
      "--limit",
      type=int,
      default=10,
      help="Max results per request (default 10, max 1000)",
  )
  common.add_argument(
      "--skip",
      type=int,
      default=0,
      help="Pagination offset (default 0)",
  )
  common.add_argument(
      "--api_key",
      type=str,
      default=None,
      help="API key (also reads FDA_API_KEY env var)",
  )
  common.add_argument(
      "--output",
      type=str,
      required=True,
      help="Output file path for results JSON (required)",
  )

  subparsers.add_parser(
      "search",
      parents=[common],
      help="Search an endpoint and save JSON results to --output",
  )

  count_parser = subparsers.add_parser(
      "count",
      parents=[common],
      help="Count unique field values and save to --output",
  )
  count_parser.add_argument(
      "--count_field",
      type=str,
      required=True,
      help="Field to count on (e.g. 'patient.reaction.reactionmeddrapt.exact')",
  )
  count_parser.add_argument(
      "--summary",
      type=int,
      default=None,
      metavar="N",
      help="Return only the top N most frequent terms (e.g. --summary 10)",
  )

  download_parser = subparsers.add_parser(
      "download",
      parents=[common],
      help="Download multiple pages of results to --output",
  )
  download_parser.add_argument(
      "--max_pages",
      type=int,
      default=10,
      help="Max pages to fetch (default 10)",
  )
  download_parser.add_argument(
      "--all_results",
      action="store_true",
      default=False,
      help=(
          "Fetch all matching results (auto-paginate). "
          f"Safety cap: {ALL_RESULTS_SAFETY_CAP} records."
      ),
  )

  return parser.parse_args()


def main():
  dotenv.load_dotenv(os.path.expanduser("~/.env"))
  main_args = parse_args()
  if main_args.command == "search":
    cmd_search(main_args)
  elif main_args.command == "count":
    cmd_count(main_args)
  elif main_args.command == "download":
    cmd_download(main_args)


if __name__ == "__main__":
  main()

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an API key, Needs Python

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Google DeepMind
Publisher
Google DeepMind (Official)
Source
google-deepmind/science-skills · skills/openfda_database · commit 4de6786
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Google DeepMind.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download openfda-database.zip