GET/api/v2/mac

MAC lookup API

The vendor behind a MAC address or prefix, its IEEE block, and what the address itself says (randomized, multicast, virtual).

GEThttps://dnsrobot.netBase URL/api/v2Version/macEndpoint?address=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "address": "B8:27:EB:12:34:56"
  },
  "address": "B8:27:EB:12:34:56",
  "prefix": null,
  "kind": "vendor",
  "vendor": {
    "name": "Raspberry Pi Foundation",
    "address": "Mitchell Wood House Caldecote Cambridgeshire US CB23 7NU",
    "country": "GB",
    "countryName": "United Kingdom",
    "location": {
      "place": "Cambridge, England",
      "latitude": 52.195,
      "longitude": -0.029,
      "precision": "postal"
    }
  },
  "assignment": {
    "prefix": "B8:27:EB",
    "block": "MA-L",
    "size": 16777216,
    "firstAddress": "B8:27:EB:00:00:00",
    "lastAddress": "B8:27:EB:FF:FF:FF",
    "organization": "Raspberry Pi Foundation",
    "firstSeen": null,
    "firstListed": {
      "on": "2012-03-02",
      "notOn": "2012-02-04"
    },
    "nameHistory": null
  },
  "flags": {
    "multicast": false,
    "locallyAdministered": false,
    "broadcast": false
  },
  "localQuadrant": null,
  "likelyRandomized": false,
  "special": null,
  "ipv6": {
    "interfaceId": "ba27:ebff:fe12:3456",
    "linkLocal": "fe80::ba27:ebff:fe12:3456",
    "solicitedNode": "ff02::1:ff12:3456",
    "solicitedNodeMac": "33:33:ff:12:34:56"
  },
  "formats": {
    "colon": "b8:27:eb:12:34:56",
    "dash": "B8-27-EB-12-34-56",
    "dot": "b827.eb12.3456",
    "bare": "B827EB123456"
  },
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 440
}

How it works

Looks the address up in the IEEE Registration Authority's public listing (MA-L, MA-M, MA-S, IAB and CID blocks, the most specific first) and reads its own bits: the multicast (I/G) and locally administered (U/L) flags, IEEE 802c's local quadrant, and well-known special addresses (broadcast, IPv4 and IPv6 multicast mappings, STP and LLDP, VRRP and HSRP virtual routers, VMware, VirtualBox, Hyper-V, Docker and QEMU defaults).

A locally administered unicast address in no registry is almost always randomized (iOS, Android and Windows do it per network): likelyRandomized says so, and no vendor can be known. Organizations that paid the IEEE to stay unlisted come back as kind: "private".

Send a full address in any notation, or just its first 6 to 11 hex digits (then address is null and prefix is set). ipv6 is the modified EUI-64 interface ID and link-local address a host could build from it.

Answers kept: 1 day (`public, max-age=86400`): the registry snapshot changes with our monthly sync.

Query parameters

  • addressstringrequired
    A MAC address in any notation (B8:27:EB:12:34:56, b8-27-eb-12-34-56, b827.eb12.3456) or its first 6 to 11 hex digits.

Response fields

200 with this JSON object, plus tookMs, and incomplete with warnings when a source failed. Fields marked optional appear only when they apply.

  • queryobjectalways
    What was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).
    • addressstringalways
      The address (or prefix) in upper-case colon notation.
  • addressstring or nullalways
    The full address, colon notation; null when a prefix was sent.
  • prefixstring or nullalways
    The prefix sent, when it wasn't a full address.
  • kindstringalways
    vendor (a company holds the block), private (unlisted at the holder's request), block (an IEEE block split into MA-M/MA-S, unassigned here), cid (a Company ID, IEEE 802c), local (locally administered, in no registry), unlisted, multicast, broadcast.

    one of "vendor", "private", "block", "cid", "local", "unlisted", "multicast", "broadcast"

  • vendorobject or nullalways
    The organization holding the block; null for private, local, unlisted and CID addresses. For a multicast address, the protocol's owner.
    Show 5 fields
    • namestringalways
      The organization as registered.
    • addressstring or nullalways
      Its registered postal address.
    • countrystring or nullalways
      ISO 3166-1 alpha-2 code where it is.
    • countryNamestring or nullalways
      The country's English name.
    • locationobject or nullalways
      Where the registered address is (GeoNames), or null.
      Show 4 fields
      • placestringalways
        The place's name.
      • latitudenumberalways
        Latitude.
      • longitudenumberalways
        Longitude.
      • precisionstringalways
        How precisely it could be placed: postal, city or country.

        one of "postal", "city", "country"

  • assignmentobject or nullalways
    The registry entry that covers the address, or null.
    Show 9 fields
    • prefixstringalways
      The assigned prefix, colon notation.
    • blockstringalways
      MA-L (24 bits), MA-M (28), MA-S (36), IAB (36) or CID (24).

      one of "MA-L", "MA-M", "MA-S", "IAB", "CID"

    • sizeintegeralways
      How many addresses the block holds.
    • firstAddressstringalways
      Its first address.
    • lastAddressstringalways
      Its last address.
    • organizationstringalways
      The organization as registered (also for private and CID entries).
    • firstSeenstring or nullalways
      When our monthly sync first saw it listed (YYYY-MM-DD); null for entries older than our first sync.
    • firstListedobject or nullalways
      From archived copies of the IEEE's listing (the Wayback Machine): the first copy that lists it, and the last earlier one that didn't. The assignment falls between them.
      Show 2 fields
      • onstringalways
        First copy listing it (YYYY-MM-DD).
      • notOnstring or nullalways
        Last earlier copy without it; null when the earliest copy already lists it.
    • nameHistoryarray of objects or nullalways
      Earlier holder names, when the name changed (an acquisition), the current one last; null when it never changed.
      Show 2 fields
      • namestringalways
        The holder's name.
      • sincestringalways
        The archived copy it first appears in (YYYY-MM-DD).
  • flagsobjectalways
    The first octet's two flag bits.
    • multicastbooleanalways
      I/G bit: a group (multicast) address.
    • locallyAdministeredbooleanalways
      U/L bit: set locally (randomized, virtual or by hand), not by the vendor.
    • broadcastbooleanalways
      FF:FF:FF:FF:FF:FF.
  • localQuadrantstring or nullalways
    IEEE 802c's quadrant of a local unicast address: aai (administratively assigned: random or by hand), eli (extended local, under a CID), sai (standard assigned), reserved; null otherwise.

    one of "aai", "eli", "sai", "reserved", null

  • likelyRandomizedboolean or nullalways
    A locally administered unicast address in no registry (or Android's 02:00:00:00:00:00): almost always a randomized, private address. Null under a Company ID, whose holder may hand out random addresses too.
  • specialobject or nullalways
    What the address means beyond its registry entry, or null.
    Show 4 fields
    • idstringalways
      e.g. broadcast, ipv4-multicast, ipv6-multicast, ipv6-solicited, stp, lldp, vrrp4, hsrp1, vmware, virtualbox, hyperv, docker, qemu, android.
    • groupstringalways
      group, protocol, router or virtual.

      one of "group", "protocol", "router", "virtual"

    • valuesobjectalways
      Values the address carries, e.g. group (the IP multicast group), number (the virtual router's).
    • servicestring or nullalways
      A multicast group's well-known service, e.g. mdns, allNodes.
  • ipv6object or nullalways
    What an IPv6 host using this address with modified EUI-64 would take (unicast addresses only), or null.
    Show 4 fields
    • interfaceIdstringalways
      The interface ID.
    • linkLocalstringalways
      The link-local address.
    • solicitedNodestringalways
      That address's solicited-node multicast group.
    • solicitedNodeMacstringalways
      The MAC address that group is sent to.
  • formatsobject or nullalways
    The full address in each system's notation, or null for a prefix.
    Show 4 fields
    • colonstringalways
      Linux, macOS: lower case, colons.
    • dashstringalways
      Windows: upper case, dashes.
    • dotstringalways
      Cisco: three groups of four.
    • barestringalways
      12 hex digits, upper case.
  • sourceobjectalways
    The registry snapshot.
    • registrystringalways
      Always IEEE Registration Authority.
    • updatedstringalways
      When our copy was synced (YYYY-MM-DD).
    • urlstringalways
      The IEEE's public listing.

Errors

  • 503 unavailable The registry files couldn't be read.

Plus the errors every endpoint can return: 400 for a missing or unreadable parameter, 429 past the limit, 503 when every source failed.

Code samples

curl "https://dnsrobot.net/api/v2/mac?address=B8%3A27%3AEB%3A12%3A34%3A56"
const params = new URLSearchParams({ address: "B8:27:EB:12:34:56" });
const res = await fetch(`https://dnsrobot.net/api/v2/mac?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.vendor);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/mac",
    params={"address": "B8:27:EB:12:34:56"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["vendor"])
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	q := url.Values{"address": {"B8:27:EB:12:34:56"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/mac?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var data map[string]any
	if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(data["error"])
	}
	fmt.Println(data["vendor"])
}
<?php
$query = http_build_query(["address" => "B8:27:EB:12:34:56"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/mac?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["vendor"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/mac")
uri.query = URI.encode_www_form(address: "B8:27:EB:12:34:56")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["vendor"]
// Cargo.toml: reqwest = { version = "0.13", features = ["blocking", "json"] }, serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::blocking::get("https://dnsrobot.net/api/v2/mac?address=B8%3A27%3AEB%3A12%3A34%3A56")?;
    let ok = res.status().is_success();
    let data: serde_json::Value = res.json()?;
    if !ok {
        return Err(data["error"]["message"].to_string().into());
    }
    println!("{}", data["vendor"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/mac?address=B8%3A27%3AEB%3A12%3A34%3A56");
var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement;
if (!res.IsSuccessStatusCode)
    throw new Exception(data.GetProperty("error").GetProperty("message").GetString());
Console.WriteLine(data.GetProperty("vendor"));

A Raspberry Pi

GET /api/v2/mac?address=B8%3A27%3AEB%3A12%3A34%3A56
200 OKRecorded 2026-10-25
{
  "query": {
    "address": "B8:27:EB:12:34:56"
  },
  "address": "B8:27:EB:12:34:56",
  "prefix": null,
  "kind": "vendor",
  "vendor": {
    "name": "Raspberry Pi Foundation",
    "address": "Mitchell Wood House Caldecote Cambridgeshire US CB23 7NU",
    "country": "GB",
    "countryName": "United Kingdom",
    "location": {
      "place": "Cambridge, England",
      "latitude": 52.195,
      "longitude": -0.029,
      "precision": "postal"
    }
  },
  "assignment": {
    "prefix": "B8:27:EB",
    "block": "MA-L",
    "size": 16777216,
    "firstAddress": "B8:27:EB:00:00:00",
    "lastAddress": "B8:27:EB:FF:FF:FF",
    "organization": "Raspberry Pi Foundation",
    "firstSeen": null,
    "firstListed": {
      "on": "2012-03-02",
      "notOn": "2012-02-04"
    },
    "nameHistory": null
  },
  "flags": {
    "multicast": false,
    "locallyAdministered": false,
    "broadcast": false
  },
  "localQuadrant": null,
  "likelyRandomized": false,
  "special": null,
  "ipv6": {
    "interfaceId": "ba27:ebff:fe12:3456",
    "linkLocal": "fe80::ba27:ebff:fe12:3456",
    "solicitedNode": "ff02::1:ff12:3456",
    "solicitedNodeMac": "33:33:ff:12:34:56"
  },
  "formats": {
    "colon": "b8:27:eb:12:34:56",
    "dash": "B8-27-EB-12-34-56",
    "dot": "b827.eb12.3456",
    "bare": "B827EB123456"
  },
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 440
}

A randomized (private) address

GET /api/v2/mac?address=52%3A1C%3A9F%3A6B%3A2C%3A0E
200 OKRecorded 2026-10-25
{
  "query": {
    "address": "52:1C:9F:6B:2C:0E"
  },
  "address": "52:1C:9F:6B:2C:0E",
  "prefix": null,
  "kind": "local",
  "vendor": null,
  "assignment": null,
  "flags": {
    "multicast": false,
    "locallyAdministered": true,
    "broadcast": false
  },
  "localQuadrant": "aai",
  "likelyRandomized": true,
  "special": null,
  "ipv6": {
    "interfaceId": "501c:9fff:fe6b:2c0e",
    "linkLocal": "fe80::501c:9fff:fe6b:2c0e",
    "solicitedNode": "ff02::1:ff6b:2c0e",
    "solicitedNodeMac": "33:33:ff:6b:2c:0e"
  },
  "formats": {
    "colon": "52:1c:9f:6b:2c:0e",
    "dash": "52-1C-9F-6B-2C-0E",
    "dot": "521c.9f6b.2c0e",
    "bare": "521C9F6B2C0E"
  },
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 349
}

A vendor prefix only

GET /api/v2/mac?address=00%3A50%3A56
200 OKRecorded 2026-10-25
{
  "query": {
    "address": "00:50:56"
  },
  "address": null,
  "prefix": "00:50:56",
  "kind": "vendor",
  "vendor": {
    "name": "VMware, Inc.",
    "address": "3401 Hillview Avenue PALO ALTO CA US 94304",
    "country": "US",
    "countryName": "United States",
    "location": {
      "place": "Palo Alto, California",
      "latitude": 37.433,
      "longitude": -122.184,
      "precision": "postal"
    }
  },
  "assignment": {
    "prefix": "00:50:56",
    "block": "MA-L",
    "size": 16777216,
    "firstAddress": "00:50:56:00:00:00",
    "lastAddress": "00:50:56:FF:FF:FF",
    "organization": "VMware, Inc.",
    "firstSeen": null,
    "firstListed": {
      "on": "2000-11-09",
      "notOn": "1998-04-22"
    },
    "nameHistory": null
  },
  "flags": {
    "multicast": false,
    "locallyAdministered": false,
    "broadcast": false
  },
  "localQuadrant": null,
  "likelyRandomized": false,
  "special": {
    "id": "vmware",
    "group": "virtual",
    "values": {},
    "service": null
  },
  "ipv6": null,
  "formats": null,
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 295
}