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).
- 120 calls a minute per IP
- Same engine as the MAC Lookup tool
{
"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
addressstringrequiredA 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.
queryobjectalwaysWhat was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).addressstringalwaysThe address (or prefix) in upper-case colon notation.
addressstring or nullalwaysThe full address, colon notation; null when a prefix was sent.prefixstring or nullalwaysThe prefix sent, when it wasn't a full address.kindstringalwaysvendor(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 nullalwaysThe organization holding the block; null for private, local, unlisted and CID addresses. For a multicast address, the protocol's owner.Show 5 fields
namestringalwaysThe organization as registered.addressstring or nullalwaysIts registered postal address.countrystring or nullalwaysISO 3166-1 alpha-2 code where it is.countryNamestring or nullalwaysThe country's English name.locationobject or nullalwaysWhere the registered address is (GeoNames), or null.Show 4 fields
placestringalwaysThe place's name.latitudenumberalwaysLatitude.longitudenumberalwaysLongitude.precisionstringalwaysHow precisely it could be placed:postal,cityorcountry.one of
"postal","city","country"
assignmentobject or nullalwaysThe registry entry that covers the address, or null.Show 9 fields
prefixstringalwaysThe assigned prefix, colon notation.blockstringalwaysMA-L(24 bits),MA-M(28),MA-S(36),IAB(36) orCID(24).one of
"MA-L","MA-M","MA-S","IAB","CID"sizeintegeralwaysHow many addresses the block holds.firstAddressstringalwaysIts first address.lastAddressstringalwaysIts last address.organizationstringalwaysThe organization as registered (also for private and CID entries).firstSeenstring or nullalwaysWhen our monthly sync first saw it listed (YYYY-MM-DD); null for entries older than our first sync.firstListedobject or nullalwaysFrom 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
onstringalwaysFirst copy listing it (YYYY-MM-DD).notOnstring or nullalwaysLast earlier copy without it; null when the earliest copy already lists it.
nameHistoryarray of objects or nullalwaysEarlier holder names, when the name changed (an acquisition), the current one last; null when it never changed.Show 2 fields
namestringalwaysThe holder's name.sincestringalwaysThe archived copy it first appears in (YYYY-MM-DD).
flagsobjectalwaysThe first octet's two flag bits.multicastbooleanalwaysI/G bit: a group (multicast) address.locallyAdministeredbooleanalwaysU/L bit: set locally (randomized, virtual or by hand), not by the vendor.broadcastbooleanalwaysFF:FF:FF:FF:FF:FF.
localQuadrantstring or nullalwaysIEEE 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",nulllikelyRandomizedboolean or nullalwaysA 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 nullalwaysWhat the address means beyond its registry entry, or null.Show 4 fields
idstringalwayse.g.broadcast,ipv4-multicast,ipv6-multicast,ipv6-solicited,stp,lldp,vrrp4,hsrp1,vmware,virtualbox,hyperv,docker,qemu,android.groupstringalwaysgroup,protocol,routerorvirtual.one of
"group","protocol","router","virtual"valuesobjectalwaysValues the address carries, e.g.group(the IP multicast group),number(the virtual router's).servicestring or nullalwaysA multicast group's well-known service, e.g.mdns,allNodes.
ipv6object or nullalwaysWhat an IPv6 host using this address with modified EUI-64 would take (unicast addresses only), or null.Show 4 fields
interfaceIdstringalwaysThe interface ID.linkLocalstringalwaysThe link-local address.solicitedNodestringalwaysThat address's solicited-node multicast group.solicitedNodeMacstringalwaysThe MAC address that group is sent to.
formatsobject or nullalwaysThe full address in each system's notation, or null for a prefix.Show 4 fields
colonstringalwaysLinux, macOS: lower case, colons.dashstringalwaysWindows: upper case, dashes.dotstringalwaysCisco: three groups of four.barestringalways12 hex digits, upper case.
sourceobjectalwaysThe registry snapshot.registrystringalwaysAlwaysIEEE Registration Authority.updatedstringalwaysWhen our copy was synced (YYYY-MM-DD).urlstringalwaysThe IEEE's public listing.
Errors
503unavailableThe 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{
"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{
"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{
"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
}