# MacVendors MAC Address Lookup (`automation-lab/mac-address-oui-manufacturer-lookup`) Actor

Resolve batches of MAC addresses and OUI prefixes to normalized manufacturer, lookup status, duplicate count, and MacVendors provenance records.

- **URL**: https://apify.com/automation-lab/mac-address-oui-manufacturer-lookup.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.32 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## MacVendors MAC Address Lookup

Resolve batches of MAC addresses and OUI prefixes to manufacturer names with a **MacVendors MAC address lookup** workflow built for inventory enrichment.

Submit observed device identifiers and receive one normalized row per unique input with the OUI, manufacturer, lookup status, duplicate count, and source provenance.

### What does this Actor do?

This Actor:

- accepts full 48-bit MAC addresses and 24-bit OUI prefixes;
- accepts colon, hyphen, dotted, and unseparated notation;
- validates every submitted value before starting source requests;
- normalizes values to uppercase colon-separated notation;
- deduplicates equivalent inputs;
- resolves manufacturers through the public MacVendors endpoint;
- exports explicit `found`, `not_found`, or `lookup_error` status;
- preserves public source links and lookup timestamps.

It does not infer device models, ownership, location, or network activity. A manufacturer assignment identifies an address block, not necessarily the current device owner.

### Who is it for?

#### Network inventory teams

Enrich switch, DHCP, Wi-Fi, or asset inventory exports with manufacturer names.

#### Security operations teams

Add vendor context to observed device lists before triage or classification.

#### Managed service providers

Normalize MAC address batches from multiple customer systems into a repeatable dataset contract.

#### Data engineers

Feed manufacturer lookup results into spreadsheets, databases, BI tools, or scheduled Apify workflows.

### Why use this MacVendors lookup?

Raw lookup responses are useful for one address. Recurring inventory work needs a stable batch contract.

This Actor adds:

- strict input validation;
- normalized addresses and OUI values;
- input-type classification;
- duplicate accounting;
- bounded retries for transient failures;
- typed dataset rows;
- explicit provenance;
- Apify scheduling, API, webhook, and integration support.

### Input

| Field | Type | Required | Default | Description |
|---|---|---:|---:|---|
| `addresses` | string array | Yes | — | Full MAC addresses or six-hex-digit OUI prefixes. |
| `maxItems` | integer | No | `100` | Maximum unique values to process, from 1 to 200. |

Example:

```json
{
  "addresses": [
    "44:38:39:ff:ef:57",
    "00-1B-63",
    "F4F5.D800.0001"
  ],
  "maxItems": 3
}
```

### Supported address formats

The following formats are accepted:

- `44:38:39:FF:EF:57`
- `44-38-39-FF-EF-57`
- `443839FFEF57`
- `4438.39FF.EF57`
- `44:38:39`
- `44-38-39`
- `443839`

A full address must contain exactly 12 hexadecimal digits. An OUI prefix must contain exactly 6 hexadecimal digits.

The complete input batch is validated before charging or requesting MacVendors. One malformed entry fails the run so pipelines do not silently lose records.

### Output fields

| Field | Description |
|---|---|
| `input` | Original submitted representation. |
| `normalizedAddress` | Uppercase colon-separated MAC address or OUI. |
| `oui` | First three normalized octets. |
| `inputType` | `mac_address` or `oui_prefix`. |
| `manufacturer` | Organization returned by MacVendors, or `null`. |
| `status` | `found`, `not_found`, or `lookup_error`. |
| `duplicateCount` | Occurrences of the normalized value in the submitted batch. |
| `source` | `MacVendors`. |
| `sourceUrl` | Public lookup URL for verification. |
| `sourceApiUrl` | Endpoint used by the run. |
| `error` | Bounded diagnostic for exhausted request failures, otherwise `null`. |
| `lookedUpAt` | ISO 8601 completion timestamp. |

### Output example

This is representative of current Actor behavior:

```json
{
  "input": "44:38:39:ff:ef:57",
  "normalizedAddress": "44:38:39:FF:EF:57",
  "oui": "44:38:39",
  "inputType": "mac_address",
  "manufacturer": "Cumulus Networks, inc",
  "status": "found",
  "duplicateCount": 1,
  "source": "MacVendors",
  "sourceUrl": "https://macvendors.com/query/44%3A38%3A39%3AFF%3AEF%3A57",
  "sourceApiUrl": "https://api.macvendors.com/44%3A38%3A39%3AFF%3AEF%3A57",
  "error": null,
  "lookedUpAt": "2026-09-04T06:40:43.724Z"
}
```

### Getting started

1. Open the Actor in Apify Console.
2. Add one or more values to **MAC addresses or OUI prefixes**.
3. Keep `maxItems` small for an initial run.
4. Click **Start**.
5. Open the default dataset to inspect normalized results.
6. Export JSON, CSV, Excel, XML, or another supported dataset format.
7. Save the input as a Task when you need scheduling or integrations.

### How much does it cost to look up MAC address manufacturers?

Pay-per-event pricing has two components:

- **$0.0015 per run** for the `start` event;
- **$0.003872 per completed lookup** at the BRONZE tier.

A completed source response is billed under the `item` event. A request that exhausts all retries is exported for diagnosis without an item charge.

Approximate BRONZE examples:

| Completed lookups | Estimated Actor charge |
|---:|---:|
| 1 | about 0.005372 USD |
| 10 | about 0.04022 USD |
| 25 | about 0.0983 USD |
| 100 | about 0.3887 USD |

Higher subscription tiers receive the discounts shown on the Actor pricing tab. Platform compute charges and plan allowances are governed by Apify.

### Batch and deduplication behavior

Equivalent notations resolve once per run.

For example, `44:38:39:ff:ef:57` and `443839FFEF57` produce one row whose `duplicateCount` is `2`.

`maxItems` applies after normalization and deduplication. Input order determines which unique values are processed when the limit is smaller than the batch.

### Status and failure behavior

#### `found`

MacVendors returned a non-empty manufacturer name.

#### `not_found`

The source reported no manufacturer assignment for the supplied value.

#### `lookup_error`

A transport, timeout, rate-limit, or server failure remained after bounded retries. The row contains a short `error` value and is not charged as an item.

The Actor retries only transient failures such as HTTP 429, HTTP 5xx, timeouts, and connection resets. It does not blindly retry malformed input.

### Source limits and responsible request pacing

Requests are sequential and paced at approximately one request per second. This conservative behavior is intentional because the anonymous MacVendors service applies rate and daily usage limits.

A large batch can therefore take roughly one second per unique value, plus retry delays. The Actor limits a run to 200 unique lookups.

If a source quota is exhausted, wait for it to reset and rerun the Task. Increasing Actor memory will not bypass source limits.

### Network inventory enrichment workflow

A repeatable workflow can be:

1. Export distinct MAC addresses from an authorized network inventory.
2. Submit them through an Actor Task.
3. Join output using `normalizedAddress` or `oui`.
4. Keep `status` and `lookedUpAt` for auditability.
5. Schedule a later Task run when fresh source assignments are needed.

The Actor reports current lookup results. It does not maintain historical changes or send alerts by itself.

### Export and integrations

Use the default Apify dataset with:

- JSON for applications;
- CSV or Excel for inventory analysts;
- webhooks for pipeline completion;
- Make or Zapier for no-code workflows;
- Google Sheets for review queues;
- the Apify API for scheduled enrichment jobs.

Every run has its own default dataset, so outputs from unrelated runs are not mixed.

### API usage with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~mac-address-oui-manufacturer-lookup/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"addresses":["44:38:39:ff:ef:57","00-1B-63"],"maxItems":2}'
```

To wait for completion and retrieve dataset items, use the Apify run and dataset endpoints returned by the run response.

### API usage with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/mac-address-oui-manufacturer-lookup').call({
    addresses: ['44:38:39:ff:ef:57', '00-1B-63'],
    maxItems: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/mac-address-oui-manufacturer-lookup').call(
    run_input={
        'addresses': ['44:38:39:ff:ef:57', '00-1B-63'],
        'maxItems': 2,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use through Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/mac-address-oui-manufacturer-lookup"
```

Use the same configuration in **Claude Desktop**, **Cursor**, or **VS Code**:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/mac-address-oui-manufacturer-lookup"
    }
  }
}
```

Example prompts:

- “Resolve these MAC addresses to manufacturers and return a compact table.”
- “Normalize this OUI list and identify which lookups were not found.”
- “Enrich this authorized network inventory and preserve provenance URLs.”

### Accuracy and interpretation

Manufacturer assignments can change when address blocks are transferred or source data is updated.

Randomized or locally administered MAC addresses may not identify the device manufacturer. The Actor does not claim that an OUI proves a device model, person, owner, or physical location.

Preserve `status`, `sourceUrl`, and `lookedUpAt` when results support operational decisions.

### Legal and responsible use

Use the Actor only with identifiers you are authorized to process. Follow your organization's security and privacy policies, MacVendors terms, source rate limits, and applicable law.

MAC addresses can be device identifiers in some contexts. Avoid publishing inventories or combining results into invasive tracking profiles.

This Actor accesses anonymously reachable public lookup responses. It does not bypass authentication or CAPTCHA controls.

### Troubleshooting

#### Why did my input fail before any output?

Check that every entry contains exactly 6 or 12 hexadecimal digits. Remove labels, comments, or unsupported separators.

#### Why is `manufacturer` null?

Inspect `status`. `not_found` means the source has no assignment; `lookup_error` means a transient source or network failure exhausted retries.

#### Why is my run slow?

The Actor deliberately performs about one request per second to respect source limits. Deduplicate the input and use `maxItems` to bound test runs.

#### Why are fewer rows returned than submitted values?

Equivalent values are deduplicated, and `maxItems` limits unique normalized lookups. Use `duplicateCount` to audit repeated inputs.

### FAQ

#### Can I submit only an OUI?

Yes. Supply six hexadecimal digits such as `44:38:39` or `443839`.

#### Does this identify a device model?

No. It resolves a manufacturer organization associated with the address prefix.

#### Does it use a proxy?

No. The Actor calls the anonymous public endpoint directly and does not enable an automatic paid proxy fallback.

#### Can I schedule recurring runs?

Yes. Save the input as an Apify Task and attach a schedule. Each run returns current source data; change comparison and alerting belong in your downstream workflow.

#### Are duplicate values charged twice?

No. Equivalent inputs are normalized and resolved once per run.

### Related Automation Lab Actors

- [IP Geolocation & Network Lookup](https://apify.com/automation-lab/ip-geolocation-network-lookup) enriches public IPv4 and IPv6 addresses with network and location context.
- [Open Food Facts EAN UPC GTIN Lookup](https://apify.com/automation-lab/ean-upc-gtin-product-lookup) demonstrates a related batch identifier-enrichment workflow for food products.

Choose this Actor when the input is specifically a MAC address or OUI and the required output is the MacVendors manufacturer assignment.

# Actor input Schema

## `addresses` (type: `array`):

One MAC address (12 hexadecimal digits) or OUI prefix (6 hexadecimal digits) per entry. Colon, hyphen, dotted, and unseparated formats are accepted.

## `maxItems` (type: `integer`):

Maximum unique normalized addresses to process after deduplication. MacVendors lookups are paced to approximately one request per second.

## Actor input object example

```json
{
  "addresses": [
    "44:38:39:ff:ef:57",
    "00-1B-63",
    "F4F5D8AABBCC"
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Open normalized manufacturer results, statuses, and source provenance in the overview view.

# 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 = {
    "addresses": [
        "44:38:39:ff:ef:57",
        "00-1B-63",
        "F4F5D8AABBCC"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/mac-address-oui-manufacturer-lookup").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 = {
    "addresses": [
        "44:38:39:ff:ef:57",
        "00-1B-63",
        "F4F5D8AABBCC",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/mac-address-oui-manufacturer-lookup").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "addresses": [
    "44:38:39:ff:ef:57",
    "00-1B-63",
    "F4F5D8AABBCC"
  ],
  "maxItems": 10
}' |
apify call automation-lab/mac-address-oui-manufacturer-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/mac-address-oui-manufacturer-lookup"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RwO0Y2iCrJZqspjl1/builds/uM4fPtSCBqiANahKo/openapi.json
