
Linear elements — returned as line segments with a start point, end point, length, and thickness:
Walls (including internal and external walls)
Doors
Windows
Areal elements — returned as polygons with contour points, area, perimeter, and any text found inside the region:
Rooms, corridors, and other enclosed spaces
Custom named areas, such as GIA (Gross Internal Area) or GEA (Gross External Area), found by searching for text labels on the drawing
All measurements are converted to real-world units based on the scale you set for the project, alongside pixel coordinates relative to the source file.
Every AI search follows the same four steps. The base URL is https://takeoff.kreo.net/api/ai-search/v1/takeoff2D, and all requests need your API key in the X-API-KEY header.
POST /upload with the file as multipart form data. Supported formats: PDF, CAD (DWG, DXF, DWF, DGN), and images (PNG, TIFF, JPG, JPEG, BMP, EMF, GIF). The response is a temporary fileKey you'll use in the next step.
POST /project with the fileKey. A project represents the analysis of a single drawing page — for multi-page documents, specify which page to use with pageIndex (zero-based, defaults to 0) and create a separate project for each page you want to analyze.
You can set the drawing scale right away. For a 1:100 drawing:
{
"fileKey": "your-file-key",
"pageIndex": 0,
"scale": {
"drawingCalibrationLineLength": 1,
"originalCalibrationLineLength": 100
}
}If the project status comes back as Calculating (common for CAD files that need conversion), poll GET /projects/{projectId}/status until it's Ready. You can also set or update the scale later with PUT /projects/{projectId}/scale — but only while the project status is Ready.
POST /projects/{projectId}/search starts an asynchronous search job:
{
"dpi": 300,
"type": "wall"
}Parameters:
type (required) — what to look for: wall, door, window, space (rooms and enclosed areas), or polygon (find an area by its text label).
dpi (required) — search resolution: 150, 300, 450, or 600. Default is 300. Higher DPI can improve detection on dense drawings but takes longer.
text — required when type is polygon: the text label to search for, e.g. "GEA" for gross external area. Must be omitted for other types.
includeWalls — only for type: space: extends space areas to wall center lines.
cropBox — an optional [x1, y1, x2, y2] rectangle to limit the search to part of the drawing.
The response contains a jobId.
GET /projects/{projectId}/search/{jobId} — poll until status is Ready. You can filter results by AI confidence with the optional confidence query parameter (a value between 0 and 1).
Linear results (walls, doors, windows) come back as lines:
{
"status": "Ready",
"lines": [
{
"p1": [1715.523, 218.374],
"p2": [1667.250, 525.628],
"length": 15.6,
"thickness": 0.25
}
]
}p1 and p2 are the centerline endpoints in pixels; length and thickness are in meters.
Areal results (spaces and polygons) come back as contours:
{
"status": "Ready",
"contours": [
{
"points": [[1127.16, 812.88], [1127.16, 704.4], [1031.88, 704.4], [1031.88, 812.88]],
"text": ["DblBedroom", "13.0m²"],
"area": 12.86,
"perimeter": 14.38
}
]
}points are the polygon vertices in pixels, area is in square meters, perimeter is in meters, and text contains any labels the AI found inside the region — useful for matching results to room names on the plan. If a contour has holes, the area excludes them and the perimeter includes them.
Set the scale before searching. Without a correct scale, lengths and areas won't match real-world dimensions.
One project = one page. Create a project per page for multi-page PDFs.
Use cropBox to speed up searches and avoid noise when you only need part of a large sheet.
Need the converted drawing? For projects created from images or CAD files, GET /projects/{projectId}/pdf downloads the project as a PDF.
Detailed schemas and example outputs for each element type are in our developer portal: Walls, Doors, Windows, Rooms and Areas, and GIA.
Questions? Contact us at [email protected] or via the in-app chat.