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
| Param | Type | Required | Notes |
|---|---|---|---|
mac | string | Yes | Use 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
| Param | Type | Default | Notes |
|---|---|---|---|
name | string | — | Min 2 chars, partial match |
limit | int | 25 | Max 50 anonymous, 500 authenticated |
offset | int | 0 | Pagination 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
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Daily quota for the plan |
X-RateLimit-Remaining | Lookups left today |
X-RateLimit-Policy | Per-second burst policy, e.g. 10;w=1 |
Retry-After | Seconds to wait (sent with 429 only) |
Status codes
| Code | Meaning | Action |
|---|---|---|
| 200 | Found | Use data |
| 400 | Missing/invalid parameter | Fix request |
| 401 | Invalid API key | Check the key |
| 402 | Feature requires a paid plan | Upgrade |
| 403 | Key disabled | Contact support |
| 404 | Prefix not assigned | Do not retry; cache the negative result |
| 405 | Wrong HTTP method | Use POST for bulk |
| 413 | Body over 256 KB | Split the batch |
| 422 | Unparseable MAC | Normalize input |
| 429 | Rate/quota exceeded | Back off per Retry-After |
| 503 | Database unavailable | Retry 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[]'