Every address, accounted for.
IPCraft is IP address management for teams that have outgrown the spreadsheet. Plan your subnets, keep a record for every host, and let your scripts find free space through the API.
Free for one person and 1,500 addresses. No credit card.
- Infrastructure
- Servers
- Users
- Wireless
- Facilities
- Platform
- Free
87 of 256 /24s are allocated. Each square is a /24, shaded by how full it is. Select a subnet to inspect it, drag it to renumber it, or find room for a new one.
Requests to place
Arrow keys move this subnet to the next free boundary in that direction.
Start from the network you already have
Most teams arrive with a spreadsheet and a network that has drifted away from it. Bring the spreadsheet in as CSV, then paste a scan to see what's actually live.
- Run a scanUse nmap,
arp -a, a ping sweep, or your DHCP server's lease file. Nothing to install. - Paste it into a subnetIPCraft detects the format and matches each live host to its record.
- Review, then applyConfirm what's live and add what's missing. Nothing is ever deleted.
What you paste
$ sudo nmap -sn 10.40.18.0/24
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for gw-2f.corp.example (10.40.18.1)
Host is up (0.00041s latency).
MAC Address: 00:1B:17:00:01:12 (Palo Alto Networks)
Nmap scan report for prn-2f-east.corp.example (10.40.18.23)
Host is up (0.0012s latency).
MAC Address: 00:17:C8:5A:20:0E (Kyocera)
Nmap scan report for ap-2f-03.corp.example (10.40.18.31)
Host is up (0.00088s latency).
MAC Address: F4:92:BF:2C:07:7F (Ubiquiti)
Nmap scan report for 10.40.18.141
Host is up (0.0021s latency).
MAC Address: 9A:4C:2E:6F:2A:11 (Unknown)
… 40 more hosts
Nmap done: 256 IP addresses (44 hosts up) scanned in 3.12 seconds
What IPCraft shows you
Scan preview
10.40.18.0/24 Floor 2- Confirmed
- 41
- Undocumented
- 3
- Not seen
- 2
- MAC conflicts
- 1
- 10.40.18.23 Confirmedprn-2f-east Marked as seen today.
- 10.40.18.141 UndocumentedNo record Created as assigned, with MAC 9A:4C:2E:6F:2A:11, when you apply.
- 10.40.18.31 MAC conflictap-2f-03 The record says F4:92:BF:2C:07:31. Flagged for you, not overwritten.
- 10.40.18.112 Not seendesk-2f-112 Left as is. It may just be switched off.
Blank hostnames and MACs are filled in from the scan. Anything you documented stays as you wrote it.
Coming from a spreadsheet? Upload it as CSV and map its columns to IPCraft's fields. See the CSV import guide and the scanning guide for every supported format.
An address plan you can actually see
Subnets nest under their parents automatically, so the tree reads like the plan in your head. Every row shows how full it is.
- Carve by size. Pick a /24 and IPCraft lists the free blocks inside the parent. No CIDR math, and no overlaps discovered later.
- Split without losing records. Break a /24 into four /26s and every hostname, MAC, and status moves with its address.
- Duplicates are refused. The same CIDR can't be created twice in one VRF. Overlapping private space gets a VRF of its own.
- VLANs and sites alongside. Tag subnets with VLANs and locations so layer 2 and geography sit next to the addressing.
Add a /24 to Users, HQ. 12 free blocks fit, starting at 10.40.20.0/24.
A record for every address
Open a subnet and every address is there with its status. Each record holds a hostname, MAC, owner, and any custom fields your team needs, and shows when a scan last saw it.
- Status
- Assigned
- MAC
- F4:92:BF:2C:07:31Last scan saw F4:92:BF:2C:07:7F
- Owner
- Network team
- Location
- HQ
- Description
- Ceiling access point, east wing
- asset_tag
- IT-04418
- warranty_end
- 2027-03-31
- Last seen
- Today at 09:12, by scan
Press ⌘K anywhere in the app to jump to a subnet, address, or hostname.
Automate the rest
The app is built on the same REST API your scripts use. Ask it for the next free address, keep your CMDB in sync, or get a signed webhook whenever something changes.
- GET/api/v1/subnets/{id}/first-free
- GET/api/v1/subnets/{id}/free-blocks
- POST/api/v1/subnets/{id}/addresses
- POST/api/v1/subnets/{id}/split
- POST/api/v1/subnets/{id}/scan/preview
- GET/api/v1/search?q=
- GET/api/v1/export/addresses
API=https://api.ipcraft.io/api/v1
# Ask for the next free address in a subnet
curl "$API/subnets/$SUBNET_ID/first-free" \
-H "Authorization: Bearer $IPCRAFT_KEY"
# {"ip": "10.40.18.42"}
# Record it
curl -X POST "$API/subnets/$SUBNET_ID/addresses" \
-H "Authorization: Bearer $IPCRAFT_KEY" \
-H "Content-Type: application/json" \
-H "X-Requested-With: XMLHttpRequest" \
-d '{
"ip": "10.40.18.42",
"hostname": "db-primary-01",
"status": "assigned",
"owner": "Platform team"
}'
import os, requests
API = "https://api.ipcraft.io/api/v1"
HEADERS = {
"Authorization": f"Bearer {os.environ['IPCRAFT_KEY']}",
"X-Requested-With": "XMLHttpRequest",
}
# Find the next free address
free = requests.get(
f"{API}/subnets/{subnet_id}/first-free", headers=HEADERS
).json()
# Assign it
requests.post(
f"{API}/subnets/{subnet_id}/addresses",
headers=HEADERS,
json={
"ip": free["ip"],
"hostname": "db-primary-01",
"status": "assigned",
"custom_fields": {"asset_tag": "IT-05120"},
},
).raise_for_status()
// POSTed to your endpoint when a subnet is created
{
"event": "subnet.created",
"delivery_id": "5f0c2e8a-3b1d-...",
"resource_type": "subnet",
"resource_id": "a1b2c3d4-e5f6-...",
"timestamp": "2026-10-22T14:30:00Z",
"data": {
"label": "10.40.20.0/24",
"name": "Floor 4"
}
}
// Sent with every delivery:
// X-Webhook-Event: subnet.created
// X-Webhook-Signature: t=1792679400,v1=5257a8...
// Content-Type: application/json
import hmac, hashlib
def verify_webhook(payload: bytes, header: str,
event_type: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
signed = f"{parts['t']}.{event_type}.".encode() + payload
computed = hmac.new(secret.encode(), signed,
hashlib.sha256).hexdigest()
return hmac.compare_digest(computed, parts["v1"])
# In your Flask or FastAPI handler
ok = verify_webhook(
request.data,
request.headers["X-Webhook-Signature"],
request.headers["X-Webhook-Event"],
"whsec_your_signing_secret",
)
Also in every account
- Activity log
- Who changed what, and when. Entries are hash-chained with SHA-256, so an edited history no longer verifies.
- Roles
- Admin, editor, and viewer roles for everyone in the workspace.
- CSV in and out
- Import a spreadsheet by mapping its columns. Export subnets, addresses, or the activity log whenever you like.
- IPv4 and IPv6
- Plan both families in the same tree, with the same carving and splitting.
- VRFs
- Keep overlapping RFC 1918 space apart. Duplicate checks are scoped to each VRF.
- Overlap report
- One page lists every subnet that shares space outside the tree. A healthy plan shows none.
- Sign-in
- Email and password, or Google.
- Isolation
- Every workspace is separated by row-level security in Postgres, not just by application code.
20 free network tools
The calculators and lookups we kept reaching for, free in the browser.
Addressing
DNS and ownership
Reachability and web
Free until you need more
Upgrade when you need more people, more addresses, or write access to the API.
| Plan | Price | People | Addresses | API | Webhooks |
|---|---|---|---|---|---|
| Free | $0 | 1 | 1,500 | Read-only | None |
| Pro | $29 /month | 2 | 5,000 | Read and write | 2 |
| Teams | $199 /month | 10 | 10,000 | Read and write | 50 |
| Enterprise | Custom | Unlimited | Unlimited | Read and write | Custom |
Paid plans have unlimited folders and subnets.
Retire the spreadsheet this afternoon.
Create a workspace, import what you have, and paste one scan. You'll know which records are wrong before the end of the day.