GET/api/v2/mac/vendors

MAC vendor search API

Find a vendor's MAC address prefixes by its name.

GEThttps://dnsrobot.netBase URL/api/v2Version/mac/vendorsEndpoint?q=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "q": "Raspberry Pi"
  },
  "vendors": [
    {
      "name": "Raspberry Pi (Trading) Ltd",
      "country": "GB",
      "prefixCount": 10,
      "prefixes": [
        {
          "prefix": "28:CD:C1",
          "block": "MA-L"
        },
        {
          "prefix": "2C:CF:67",
          "block": "MA-L"
        },
        {
          "prefix": "3A:35:41",
          "block": "CID"
        },
        {
          "prefix": "88:A2:9E",
          "block": "MA-L"
        },
        {
          "prefix": "8C:1F:64:34:A",
          "block": "MA-S"
        },
        {
          "prefix": "98:FE:54",
          "block": "MA-L"
        },
        {
          "prefix": "D8:3A:DD",
          "block": "MA-L"
        },
        {
          "prefix": "DC:A6:32",
          "block": "MA-L"
        },
        {
          "prefix": "E4:5F:01",
          "block": "MA-L"
        },
        {
          "prefix": "F0:40:AF:9",
          "block": "MA-M"
        }
      ],
      "truncated": false
    },
    {
      "name": "Raspberry Pi Foundation",
      "country": "US",
      "prefixCount": 1,
      "prefixes": [
        {
          "prefix": "B8:27:EB",
          "block": "MA-L"
        }
      ],
      "truncated": false
    }
  ],
  "more": false,
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 545
}

How it works

Searches the IEEE Registration Authority's organization names (grouped as the IEEE writes them, legal forms ignored). Every word of q must start a word of the name; whole-word matches come first, then the vendors holding the most prefixes.

At most 10 vendors come back (more says whether there were others: make q more specific), each with its first 100 prefixes; prefixCount is always the full count.

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

Query parameters

  • qstringrequired
    A vendor name or the start of one, 2 to 64 characters.

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).
    • qstringalways
      The name searched, spaces collapsed.
  • vendorsarray of objectsalways
    Matching organizations, best first.
    Show 5 fields
    • namestringalways
      The name as registered.
    • countrystring or nullalways
      ISO 3166-1 alpha-2 code where it is registered.
    • prefixCountintegeralways
      How many prefixes it holds.
    • prefixesarray of objectsalways
      Its prefixes, the first 100.
      Show 2 fields
      • prefixstringalways
        The prefix, colon notation.
      • blockstringalways
        Its block type.

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

    • truncatedbooleanalways
      Whether prefixes stops at 100.
  • morebooleanalways
    Whether more than 10 vendors matched.
  • 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 vendor index 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 -G "https://dnsrobot.net/api/v2/mac/vendors" \
  --data-urlencode "q=Raspberry Pi"
const params = new URLSearchParams({ q: "Raspberry Pi" });
const res = await fetch(`https://dnsrobot.net/api/v2/mac/vendors?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.vendors);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/mac/vendors",
    params={"q": "Raspberry Pi"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["vendors"])
package main

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

func main() {
	q := url.Values{"q": {"Raspberry Pi"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/mac/vendors?" + 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["vendors"])
}
<?php
$query = http_build_query(["q" => "Raspberry Pi"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/mac/vendors?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["vendors"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/mac/vendors")
uri.query = URI.encode_www_form(q: "Raspberry Pi")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["vendors"]
// 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/vendors?q=Raspberry+Pi")?;
    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["vendors"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/mac/vendors?q=Raspberry+Pi");
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("vendors"));

Raspberry Pi's prefixes

GET /api/v2/mac/vendors?q=Raspberry+Pi
200 OKRecorded 2026-10-25
{
  "query": {
    "q": "Raspberry Pi"
  },
  "vendors": [
    {
      "name": "Raspberry Pi (Trading) Ltd",
      "country": "GB",
      "prefixCount": 10,
      "prefixes": [
        {
          "prefix": "28:CD:C1",
          "block": "MA-L"
        },
        {
          "prefix": "2C:CF:67",
          "block": "MA-L"
        },
        {
          "prefix": "3A:35:41",
          "block": "CID"
        },
        // … 7 more items
      ],
      "truncated": false
    },
    {
      "name": "Raspberry Pi Foundation",
      "country": "US",
      "prefixCount": 1,
      "prefixes": [
        {
          "prefix": "B8:27:EB",
          "block": "MA-L"
        }
      ],
      "truncated": false
    }
  ],
  "more": false,
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 545
}

Shortened for the page: long lists show their first items.

Ubiquiti's prefixes

GET /api/v2/mac/vendors?q=Ubiquiti
200 OKRecorded 2026-10-25
{
  "query": {
    "q": "Ubiquiti"
  },
  "vendors": [
    {
      "name": "Ubiquiti Inc",
      "country": "US",
      "prefixCount": 49,
      "prefixes": [
        {
          "prefix": "00:15:6D",
          "block": "MA-L"
        },
        {
          "prefix": "00:27:22",
          "block": "MA-L"
        },
        {
          "prefix": "00:50:C2:B0:4",
          "block": "IAB"
        },
        // … 46 more items
      ],
      "truncated": false
    }
  ],
  "more": false,
  "source": {
    "registry": "IEEE Registration Authority",
    "updated": "2026-10-18",
    "url": "https://standards-oui.ieee.org/"
  },
  "tookMs": 0
}

Shortened for the page: long lists show their first items.