REST API v1

JSON over HTTPS. No SDK required — every endpoint is a single request.

Base URL

https://macprobe.com/api/v1

Authentication

Anonymous requests are allowed at the Free tier limits (1000/day, 2/sec per IP). Authenticate to raise limits — any one of these works:

Authorization: Bearer mp_live_xxxxxxxxxxxxxxxx
X-API-Key: mp_live_xxxxxxxxxxxxxxxx
API keys in URL query parameters are deliberately not supported.

Keys are stored only as SHA-256 hashes; a lost key cannot be recovered, only rotated.

GET /v1/lookup

ParamTypeRequiredNotes
macstringYesUse 6, 7, 9, 12, or 16 hexadecimal digits in supported standard formats. q is accepted as an alias.
curl "https://macprobe.com/api/v1/lookup?mac=00:1A:2F:3B:4C:5D"

200 response

{
  "success": true,
  "data": {
    "query": "00:1A:2F:3B:4C:5D",
    "mac": "00:1A:2F:3B:4C:5D",
    "oui": "00:1A:2F",
    "properties": {
      "transmission": "unicast",
      "administration": "universally administered (UAA)",
      "is_broadcast": false,
      "is_randomized": false,
      "eui64": "021A:2FFF:FE3B:4C5D",
      "binary_octet1": "00000000"
    },
    "vendor": {
      "name": "Cisco-Linksys, LLC",
      "address": "121 Theory Irvine CA",
      "country": "US",
      "registry": "MA-L",
      "prefix": "00:1A:2F",
      "prefix_bits": 24,
      "is_private": false,
      "updated_at": "2026-10-20 03:00:11"
    }
  },
  "meta": { "plan": "free", "authenticated": false, "requests_today": 7, "daily_limit": 1000 }
}

GET /v1/vendor

ParamTypeDefaultNotes
namestring—Min 2 chars, partial match
limitint25Max 50 anonymous, 500 authenticated
offsetint0Pagination offset
curl "https://macprobe.com/api/v1/vendor?name=raspberry&limit=10"

POST /v1/bulk Paid plans

curl -X POST "https://macprobe.com/api/v1/bulk" \
  -H "Authorization: Bearer mp_live_xxxx" \
  -H "Content-Type: application/json" \
  -d '{"macs":["00:00:0C:11:22:33","B8:27:EB:01:02:03","02:AA:BB:CC:DD:EE"]}'

Batch size is capped by your plan; oversized batches are rejected instead of silently truncated. Each MAC counts as one lookup against your daily quota.

GET /v1/status

curl "https://macprobe.com/api/v1/status"

Returns record count, last database update timestamp and server time — useful for monitoring.

Rate limit headers

HeaderMeaning
X-RateLimit-LimitDaily quota for the plan
X-RateLimit-RemainingLookups left today
X-RateLimit-PolicyPer-second burst policy, e.g. 10;w=1
Retry-AfterSeconds to wait (sent with 429 only)

Status codes

CodeMeaningAction
200FoundUse data
400Missing/invalid parameterFix request
401Invalid API keyCheck the key
402Feature requires a paid planUpgrade
403Key disabledContact support
404Prefix not assignedDo not retry; cache the negative result
405Wrong HTTP methodUse POST for bulk
413Body over 256 KBSplit the batch
422Unparseable MACNormalize input
429Rate/quota exceededBack off per Retry-After
503Database unavailableRetry with backoff

Code samples

Python

import requests

API = "https://macprobe.com/api/v1"
KEY = "mp_live_xxxxxxxxxxxxxxxx"

r = requests.get(f"{API}/lookup",
                 params={"mac": "00:1A:2F:3B:4C:5D"},
                 headers={"Authorization": f"Bearer {KEY}"},
                 timeout=10)
if r.status_code == 200:
    print(r.json()["data"]["vendor"]["name"])
elif r.status_code == 404:
    print("Unassigned or randomized address")
else:
    print("Error", r.status_code, r.text)

JavaScript (Node 18+)

const res = await fetch("https://macprobe.com/api/v1/lookup?mac=B8:27:EB:01:02:03", {
  headers: { Authorization: "Bearer mp_live_xxxx" }
});
const json = await res.json();
console.log(json.success ? json.data.vendor.name : json.error);

PowerShell

$h = @{ "X-API-Key" = "mp_live_xxxx" }
Invoke-RestMethod -Uri "https://macprobe.com/api/v1/lookup?mac=00-00-0C-11-22-33" -Headers $h |
  Select-Object -ExpandProperty data

Bulk from a Cisco switch inventory (bash)

show mac address-table | awk '{print $2}' | grep -E '^[0-9a-f.]{14}$' \
  | jq -R -s -c 'split("\n")[:-1] | {macs: .}' \
  | curl -s -X POST "https://macprobe.com/api/v1/bulk" \
      -H "Authorization: Bearer mp_live_xxxx" \
      -H "Content-Type: application/json" -d @- | jq '.data.results[]'