# RxNorm Drug Concept Search Scraper (`compute-edge/rxnorm-drug-search-scraper`) Actor

Look up RxNorm concepts (RxCUI, brand vs generic, dose form, strength, ATC class, DEA schedule, prescribable status) from the NLM RxNav REST API by drug name.

- **URL**: https://apify.com/compute-edge/rxnorm-drug-search-scraper.md
- **Developed by:** [Compute Edge](https://apify.com/compute-edge) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## RxNorm Drug Concept Search Scraper

Look up clinical drug concepts in **RxNorm** — the U.S. National Library of Medicine's normalized naming system for prescription and over-the-counter medications. This Actor queries the NLM RxNav REST API by drug name and returns every RxNorm concept variant (brand, generic, dose form, strength) plus optional clinical attributes (ATC class, DEA schedule, prescribable status).

### What this Actor does

- Sends each input drug name to `https://rxnav.nlm.nih.gov/REST/drugs.json` and expands it into every RxNorm concept variant.
- Returns the canonical `rxcui` identifier you need to integrate with EHRs, claims data, FDA structured product labels, and other clinical systems.
- Optionally enriches each concept with `/rxcui/{id}/allProperties` data: ATC drug class, DEA schedule, prescribable status, cardinality.
- No authentication needed — RxNav is a free, public NLM service.

### Why scrape RxNorm

RxNorm is the federally-recognized standard for drug terminology in the United States (mandated in CMS Meaningful Use, used by Surescripts, EHRs, formularies). A clean RxCUI mapping is worth real money to:

- **HealthTech startups** building patient-facing apps, telemedicine, or medication-reminder tools
- **Health insurance / PBMs** normalizing claims data across pharmacies
- **Clinical research** translating brand names into NDC/ATC for cohort selection
- **Pharma BD teams** mapping their products into payer formulary structures
- **AI/LLM developers** grounding retrieval-augmented generation over drug labels

### Output fields

| Field | Description |
| --- | --- |
| `queryName` | The drug name you searched for |
| `rxcui` | RxNorm Concept Unique Identifier — the canonical join key |
| `name` | Full RxNorm concept name (e.g. "atorvastatin 80 MG Oral Tablet [Lipitor]") |
| `synonym` | Common synonym/display form |
| `tty` | RxNorm Term Type code |
| `ttyDescription` | Human-readable expansion of TTY (e.g. "Semantic Branded Drug") |
| `language` | Concept language (typically ENG) |
| `suppress` | NLM suppression flag |
| `umlscui` | UMLS Concept Unique Identifier if mapped |
| `prescribable` | "Y"/"N" — whether the concept is currently prescribable (only with enrichment) |
| `atcClass` | WHO Anatomical Therapeutic Chemical class (only with enrichment) |
| `deaSchedule` | DEA controlled-substance schedule (only with enrichment) |
| `cardinality` | RxNorm cardinality flag (only with enrichment) |
| `url` | RxNav web URL for the concept |

### How to scrape RxNorm

1. Open the Actor in Apify Console.
2. Fill in the **Drug Names** input — one drug name per line. Brand or generic both work (e.g. `lipitor`, `atorvastatin`, `synthroid`).
3. (Optional) Limit results to specific Term Types via **Term Type Filter** — e.g. `["SBD"]` for branded drugs only.
4. (Optional) Enable **Enrich With Clinical Properties** to add ATC class, DEA schedule, and prescribable status. This costs ~1 extra API call per concept.
5. Run. Results land in the dataset in seconds.

### Pricing

This Actor is billed at $0.003 per concept record. A single common drug name typically returns 50–200 concept variants (every strength × form × brand combination), so each input name costs roughly $0.15–$0.60.

For a 100-drug-name sweep with no enrichment:
- Apify per-result charge: typically $15–$60 depending on drug breadth
- RxNav API: free, no key required
- Compute: typically < $0.10

### Input example

```json
{
  "drugNames": ["lipitor", "atorvastatin", "synthroid"],
  "ttyFilter": ["SBD", "SCD"],
  "enrichProperties": true,
  "maxResultsPerDrug": 0
}
````

### Output example

```json
{
  "queryName": "lipitor",
  "rxcui": "617314",
  "name": "atorvastatin 10 MG Oral Tablet [Lipitor]",
  "synonym": "Lipitor 10 MG Oral Tablet",
  "tty": "SBD",
  "ttyDescription": "Semantic Branded Drug",
  "language": "ENG",
  "prescribable": "Y",
  "atcClass": "C10AA05",
  "deaSchedule": "",
  "url": "https://mor.nlm.nih.gov/RxNav/search?searchBy=RXCUI&searchTerm=617314"
}
```

### FAQ

**Do I need an API key?** No. RxNav is free and unauthenticated.

**Are there rate limits?** NLM publishes a soft guideline of ~20 requests/second. This Actor stays well within that.

**Is RxNorm data current?** Yes. NLM publishes new RxNorm weekly releases; the RxNav API always serves the latest release.

**Can I get NDC codes?** This Actor returns RxCUI which maps to NDC via NLM's RxNorm tables. To pull NDC arrays per RxCUI, request the related Actor "NLM DailyMed FDA Drug Labels Scraper".

### Legal

This Actor pulls only data published by the U.S. National Library of Medicine (a federal agency) on the public RxNav REST service. NLM data is U.S. government work and is in the public domain. No personal data is collected. Respect NLM's published terms of service: https://www.nlm.nih.gov/web\_policies.html

Support: bciccarelli6@gmail.com

# Actor input Schema

## `drugNames` (type: `array`):

List of drug names (brand or generic) to look up. Each name is sent to the RxNav /drugs endpoint and expanded into all RxNorm concept variants (BPCK, GPCK, SBD, SCD).

## `ttyFilter` (type: `array`):

Limit to specific RxNorm Term Types (TTY). Common values: SBD = Semantic Branded Drug, SCD = Semantic Clinical Drug, BPCK = Brand Pack, GPCK = Generic Pack, BN = Brand Name, IN = Ingredient.

## `enrichProperties` (type: `boolean`):

If enabled, an extra API call is made per RxCUI to pull ATC class, DEA schedule, prescribable status, and other clinical attributes. Adds ~1 call per concept.

## `maxResultsPerDrug` (type: `integer`):

Cap on the number of concepts returned per input drug name. Set to 0 for unlimited.

## Actor input object example

```json
{
  "drugNames": [
    "aspirin",
    "atorvastatin",
    "metformin",
    "lisinopril",
    "ibuprofen",
    "amoxicillin",
    "albuterol",
    "omeprazole",
    "levothyroxine",
    "amlodipine"
  ],
  "ttyFilter": [],
  "enrichProperties": false,
  "maxResultsPerDrug": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("compute-edge/rxnorm-drug-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("compute-edge/rxnorm-drug-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call compute-edge/rxnorm-drug-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=compute-edge/rxnorm-drug-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RxNorm Drug Concept Search Scraper",
        "description": "Look up RxNorm concepts (RxCUI, brand vs generic, dose form, strength, ATC class, DEA schedule, prescribable status) from the NLM RxNav REST API by drug name.",
        "version": "0.1",
        "x-build-id": "IgtaBYCZ4FDQwsUj0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/compute-edge~rxnorm-drug-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-compute-edge-rxnorm-drug-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/compute-edge~rxnorm-drug-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-compute-edge-rxnorm-drug-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/compute-edge~rxnorm-drug-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-compute-edge-rxnorm-drug-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "drugNames"
                ],
                "properties": {
                    "drugNames": {
                        "title": "Drug Names",
                        "type": "array",
                        "description": "List of drug names (brand or generic) to look up. Each name is sent to the RxNav /drugs endpoint and expanded into all RxNorm concept variants (BPCK, GPCK, SBD, SCD).",
                        "default": [
                            "aspirin",
                            "atorvastatin",
                            "metformin",
                            "lisinopril",
                            "ibuprofen",
                            "amoxicillin",
                            "albuterol",
                            "omeprazole",
                            "levothyroxine",
                            "amlodipine"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "ttyFilter": {
                        "title": "Term Type Filter",
                        "type": "array",
                        "description": "Limit to specific RxNorm Term Types (TTY). Common values: SBD = Semantic Branded Drug, SCD = Semantic Clinical Drug, BPCK = Brand Pack, GPCK = Generic Pack, BN = Brand Name, IN = Ingredient.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichProperties": {
                        "title": "Enrich With Clinical Properties",
                        "type": "boolean",
                        "description": "If enabled, an extra API call is made per RxCUI to pull ATC class, DEA schedule, prescribable status, and other clinical attributes. Adds ~1 call per concept.",
                        "default": false
                    },
                    "maxResultsPerDrug": {
                        "title": "Max Results Per Drug Name",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Cap on the number of concepts returned per input drug name. Set to 0 for unlimited.",
                        "default": 0
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
