Resources
API reference
The BIM Monkey Partner API lets AEC platforms connect directly to the generation, correction, and intelligence layers — without requiring a Revit license or BIM Monkey subscription on the calling side. Pass model data in, get back a complete NCS-organized CD plan.
Authentication
All generation and review endpoints require a partner key passed as a Bearer token:
Authorization: Bearer pk_your_key_here
Keys have the prefix pk_ and are issued per integration. A key can be revoked at any time. Keys with contribute_to_platform: true allow approved output to feed the shared platform pool.
Base URL
https://bimmonkey-production.up.railway.app
Discovery endpoints
These are public — no auth required. Use them to inspect the full API surface or to integrate BIM Monkey as an MCP tool.
Returns the full OpenAPI 3.1 spec for the Partner API.
Returns the MCP tool manifest. Use this to add BIM Monkey as a tool in any MCP-compatible AI agent.
Generate a CD plan
Pass a Revit model snapshot, get back a complete NCS-organized CD plan: sheets, view assignments, detail plan, schedule plan, and CSI specification sections. Output quality compounds with each review cycle — the more your team approves and corrects, the better future generations become.
Request body
| Field | Type | Description |
|---|---|---|
| modelDatarequired | object | Revit model snapshot. See schema below. |
modelData schema
| Field | Type | Description |
|---|---|---|
| projectName | string | Project name as it appears in the model. |
| buildingType | string | residential · multi-family · mixed-use · commercial · institutional |
| conditions | string[] | Detected model conditions, e.g. flat-roof-parapet, slab-on-grade, wood-frame. Used to select relevant details and specifications. |
| views | object[] | Available views in the model (name, viewType, level). |
| levels | object[] | Project levels (name, elevation). |
| rooms | object[] | Rooms/spaces (name, level, area). |
| schedules | object[] | Existing schedules (name, category). |
Example request
{
"modelData": {
"projectName": "123 Main St - DADU",
"buildingType": "residential",
"conditions": ["flat-roof-parapet", "slab-on-grade", "wood-frame"],
"views": [
{ "name": "Level 1 Floor Plan", "viewType": "FloorPlan", "level": "Level 1" },
{ "name": "South Elevation", "viewType": "Elevation" }
],
"levels": [{ "name": "Level 1", "elevation": 0 }, { "name": "Roof", "elevation": 144 }],
"rooms": [{ "name": "Living", "level": "Level 1", "area": 320 }],
"schedules": []
}
}
Response
{
"success": true,
"generationId": 1042,
"specSectionsGenerated": 14,
"plan": {
"projectName": "123 Main St - DADU",
"sheets": [
{
"sheetNumber": "A0.1",
"sheetName": "Cover Sheet",
"views": [{ "viewName": "Site Plan", "viewType": "SitePlan" }]
}
],
"detailPlan": [
{
"detailType": "parapet",
"title": "Parapet Cap Detail",
"sheetRef": "A5.1",
"priority": "HIGH"
}
],
"schedulePlan": [
{ "scheduleName": "Door Schedule", "category": "Doors", "sheetRef": "A6.1" }
],
"specPlan": [
{
"csi": "07 51 00",
"title": "Built-Up Bituminous Roofing",
"conditions": ["flat-roof-parapet"],
"notes": "Specify 4-ply SBS-modified system with 90-day warranty minimum."
}
]
}
}
Submit a review
Approve, edit, or deny a generated plan item. Approved and edited items are added to your firm's training library. If your key has contribute_to_platform: true, approved items are also added to the shared platform pool — improving generation quality for all users.
Reviews must reflect genuine human evaluation. Auto-approving outputs without human review degrades the intelligence layer over time.
Request body
| Field | Type | Description |
|---|---|---|
| generationIdrequired | integer | ID returned by /api/partner/generate. |
| itemTyperequired | string | cdPlan · detail · spec |
| aiOutputrequired | object | The AI-generated item being reviewed. |
| decisionrequired | string | approved · edited · denied |
| itemRef | string | Identifier for the item (e.g. sheet number, detail type, CSI section). |
| editedOutput | object | Required when decision is edited. The corrected version of the item. |
| denialReason | string | Required when decision is denied. |
| tags | string[] | Optional tags: building type, detail type, CSI section, etc. |
Example request — approved sheet plan
{
"generationId": 1042,
"itemType": "cdPlan",
"itemRef": "sheet-plan",
"aiOutput": { "sheets": [...] },
"decision": "approved",
"tags": ["residential", "cdPlan"]
}
Example request — edited detail
{
"generationId": 1042,
"itemType": "detail",
"itemRef": "parapet",
"aiOutput": { "detailType": "parapet", "title": "Parapet Cap Detail", "priority": "HIGH" },
"decision": "edited",
"editedOutput": { "detailType": "parapet", "title": "Parapet Cap + Counter-Flashing Detail", "priority": "HIGH" },
"tags": ["residential", "parapet"]
}
Submit a correction
Submit a workflow rule or Revit API bug workaround in plain language. Auto-classified by the platform as a workflow_rule or bug_workaround.
Request body
| Field | Type | Description |
|---|---|---|
| naturalLanguageRulerequired | string | The correction in plain language, e.g. "Bathroom elevations always go on A3.2 for this project type." |
| triggerOperation | string | The operation that triggered this correction. |
| pluginVersion | string | Plugin version string, if applicable. |
Run a compliance check
Run IBC 2021 code compliance checks against Revit model data. Pass rooms, doors, and levels; get back structured pass / warn / fail / verify results with IBC section citations, plus a Claude-generated narrative summary. Every run is persisted and accessible in Banana Chat via get_compliance_runs.
Occupancy group is auto-detected from room names if omitted. Pass it explicitly for multi-occupancy buildings.
Checks performed
| ID | IBC Reference | Description |
|---|---|---|
| OL-001 | IBC Table 1004.5 | Occupant load calculation from room areas |
| EG-001 | IBC Table 1006.2.1 | Minimum exit count for occupant load |
| EG-002 | IBC 1007.1.1 | Stair separation (⅓ or ½ diagonal) |
| FR-001 | IBC Table 716.1 | Fire door ratings in rated walls |
| PL-001 | IBC Table 2902.1 | Minimum restroom count |
| AC-001 | IBC 1107.6.2 | Type A/B accessible units (R-2 only) |
| MQ-001 | — | Door–room association completeness |
| MQ-002 | — | Orphan / temp levels |
| MQ-003 | — | Room Department parameter completeness |
Request body
| Field | Type | Description |
|---|---|---|
| modelDatarequired | object | Revit model snapshot. See schema below. |
modelData schema
| Field | Type | Description |
|---|---|---|
| projectName | string | Project name. |
| buildingType | string | residential · commercial · institutional |
| occupancyGroup | string | IBC occupancy group, e.g. R-3, R-2, B, A-2, M. Auto-detected from room names if omitted. |
| constructionType | string | IBC construction type, e.g. V-B. |
| sprinklered | boolean | Default: true. Affects stair separation requirement. |
| stories | integer | Number of stories above grade. |
| buildingHeightFt | number | Building height in feet. |
| roomsrequired | object[] | Room list. Each: id, name, level, areaSF, heightFt, department. |
| doors | object[] | Door list. Each: id, mark, typeName, clearWidthIn, level, isExterior, fromRoom, toRoom, hostWallTypeName, fireRating, swingDirection. |
| levels | object[] | Level list. Each: name, elevation. |
Example request
{
"modelData": {
"projectName": "Sloan DADU",
"buildingType": "residential",
"occupancyGroup": "R-3",
"constructionType": "V-B",
"sprinklered": false,
"stories": 2,
"buildingHeightFt": 24,
"rooms": [
{ "id": "101", "name": "Living Room", "level": "Level 1", "areaSF": 320, "department": "Residential" },
{ "id": "102", "name": "Kitchen", "level": "Level 1", "areaSF": 140, "department": "Residential" },
{ "id": "103", "name": "Bedroom 1", "level": "Level 2", "areaSF": 160, "department": "Residential" },
{ "id": "104", "name": "Bathroom", "level": "Level 1", "areaSF": 55, "department": "Residential" }
],
"doors": [
{ "id": "D1", "mark": "1", "typeName": "Exterior Door 3068", "isExterior": true, "fromRoom": "Living Room", "toRoom": null },
{ "id": "D2", "mark": "2", "typeName": "Interior Door 2868", "isExterior": false, "fromRoom": "Living Room", "toRoom": "Kitchen" }
],
"levels": [
{ "name": "Level 1", "elevation": 0 },
{ "name": "Level 2", "elevation": 120 }
]
}
}
Response
{
"runId": 88,
"projectName": "Sloan DADU",
"occupancyGroup": "R-3",
"constructionType": "V-B",
"sprinklered": false,
"occupancyGroupDetected": false,
"summary": { "pass": 4, "warn": 2, "fail": 0, "verify": 3, "total": 9 },
"checks": [
{
"id": "OL-001",
"category": "Occupant Load",
"ibcSection": "IBC Table 1004.5",
"description": "Calculate total building occupant load from room areas.",
"result": "pass",
"value": "5 persons",
"required": "Project-specific",
"details": "Total OL: 5 persons across 3 placed rooms.",
"data": [
{ "name": "Living Room", "areaSF": 320, "factor": 200, "ol": 2, "basis": "Residential @ 200 SF/person" },
{ "name": "Kitchen", "areaSF": 140, "factor": 200, "ol": 1, "basis": "Kitchen @ 200 SF/person" },
{ "name": "Bedroom 1", "areaSF": 160, "factor": 200, "ol": 1, "basis": "Residential @ 200 SF/person" }
]
},
{
"id": "EG-001",
"category": "Means of Egress",
"ibcSection": "IBC Table 1006.2.1",
"description": "Minimum exits required for OL=5.",
"result": "pass",
"value": "1 exit(s) found",
"required": "1 exit(s)",
"details": "1 exit door(s) identified — meets requirement of 1 for OL=5."
}
],
"narrative": "The Sloan DADU is a single-family R-3 occupancy with a total occupant load of 5 persons, meeting all egress and plumbing requirements. No fire-rated walls were detected, so fire door ratings are not applicable. Ensure the Department parameter is populated on all rooms to enable zone-based occupancy filtering."
}
Read firm memory
Return the firm's saved workflow rules and per-project context. firmMemory holds standing rules applied to every generation. projectNotes is a map of project names to context strings. Pass an optional project query parameter to filter project notes by name.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| project | string | Filter projectNotes by project name (partial match, case-insensitive). |
Response
{
"firmMemory": [
{ "note": "Bathroom plans always pair with interior elevations.", "savedAt": "2026-03-14T..." },
{ "note": "Use SB-1 brick veneer on all street-facing elevations.", "savedAt": "2026-04-02T..." }
],
"projectNotes": {
"Sloan DADU": "Two-story R-3. Permit set due June. Client wants exposed beam ceiling in living.",
"123 Main": "Mixed-use ground floor retail. Fire-rated demising walls required."
},
"counts": { "firmMemory": 2, "projects": 2 }
}
Generate a spec plan
Generate CSI MasterFormat specification sections from a list of building conditions. Conditions are matched against a built-in lookup table; always-required sections (concrete, framing, finishes) are included automatically. Standalone — does not require a prior /generate call.
Request body
| Field | Type | Description |
|---|---|---|
| modelDatarequired | object | Must include conditions (string[]). Optional: projectName, buildingType. |
Example request
{
"modelData": {
"projectName": "Sloan DADU",
"buildingType": "residential",
"conditions": ["flat-roof-parapet", "slab-on-grade", "wood-frame", "exterior-insulation"]
}
}
Response
{
"projectName": "Sloan DADU",
"specPlan": [
{
"csi": "03 30 00",
"title": "Cast-in-Place Concrete",
"required": true,
"conditions": ["slab-on-grade"],
"notes": "Slab-on-grade: specify 4\" min. slab, 6-mil vapor barrier."
},
{
"csi": "07 51 00",
"title": "Built-Up Bituminous Roofing",
"required": false,
"conditions": ["flat-roof-parapet"],
"notes": "SBS-modified system with tapered insulation."
}
]
}
Organize sheets
Pass a raw view inventory and get back an NCS-organized sheet assignment plan. Views are classified by type and level, packed onto numbered sheets by discipline, and returned with fill statistics. Unclassifiable views and internal / working views are flagged separately. No Revit session required.
Request body
| Field | Type | Description |
|---|---|---|
| modelDatarequired | object | Must include views (array). Optional: projectName, schedules (array — if omitted, schedule-type views are extracted from views). |
views schema
| Field | Type | Description |
|---|---|---|
| id | string | Revit view ElementId. |
| name | string | View name as it appears in the Project Browser. |
| viewType | string | FloorPlan · Elevation · Section · Detail · DraftingView · ThreeDView · Schedule · etc. |
| level | string | Associated level name, if any. |
| scaleDenominator | integer | View scale (e.g. 48 = 1/4"=1'-0"). |
| cropWidthFt / cropHeightFt | number | Crop region dimensions in feet — used for sheet fill calculations. |
| isOnSheet | boolean | Whether the view is already placed on a sheet. |
Response
{
"projectName": "Sloan DADU",
"stats": { "totalSheets": 14, "gapSheets": 0, "averageFill": 0.74, "sheetsUnderFill": 2 },
"sheets": [
{
"sheetNumber": "A1.1",
"sheetName": "Floor Plans — Level 1",
"views": [
{ "id": "391884", "name": "Level 1 Floor Plan", "viewType": "FloorPlan" }
]
}
],
"unassigned": [
{ "id": "404201", "name": "3D View - Working", "viewType": "ThreeDView" }
],
"blocked": [
{ "id": "388100", "name": "{3D}", "reason": "internal-view" }
]
}
Run a model audit
Run a model quality audit against a view and sheet inventory. Returns structured pass / warn / fail results for each check — no IBC logic, no narrative. Useful as a pre-submission or pre-generation health check.
Checks performed
| ID | Category | Description |
|---|---|---|
| AUD-001 | Views | Views not placed on any sheet |
| AUD-002 | Sheets | Sheets with no views placed |
| AUD-003 | Views | Duplicate view names |
| AUD-004 | Views | Floor plans and sections with no scale set |
| AUD-005 | Sheets | Generic sheet names (Sheet 1, Unnamed, etc.) |
| MQ-001 | Doors | Doors not associated with any room |
| MQ-002 | Levels | Levels with no rooms placed |
| MQ-003 | Rooms | Rooms missing Department parameter |
Request body
| Field | Type | Description |
|---|---|---|
| modelDatarequired | object | Optional sub-fields: projectName, views[], sheets[], rooms[], doors[], levels[]. Omit any array that isn't relevant — its checks are skipped. |
Response
{
"projectName": "Sloan DADU",
"summary": { "pass": 5, "warn": 2, "fail": 1, "total": 8 },
"checks": [
{
"id": "AUD-001",
"category": "Views",
"description": "Views not placed on any sheet.",
"result": "warn",
"value": "4 unplaced view(s)",
"details": "4 views are not on any sheet.",
"data": [
{ "id": "404201", "name": "Working Section", "viewType": "Section" }
]
},
{
"id": "AUD-003",
"category": "Views",
"description": "Duplicate view names.",
"result": "fail",
"value": "1 duplicate(s)",
"details": "1 duplicate view name(s) found.",
"data": [{ "name": "Level 1 Floor Plan", "count": 2 }]
}
]
}
Analyze redlines
Pass up to 20 pre-rendered drawing pages with markup overlays. AI vision analyzes every revision cloud, comment box, dimension correction, and coordination note, and returns a structured list of change requests categorized by type and severity.
Page format: render PDF pages to images on the client side (browser canvas, pdf2image, etc.) and send as base64 PNG or JPEG. Max 20 pages per request.
Request body
| Field | Type | Description |
|---|---|---|
| pagesrequired | object[] | Array of page images. Each: { data: "<base64>", mediaType: "image/png" }. Max 20. |
| projectName | string | Project name. |
| discipline | string | architectural · structural · mep · civil |
| focus | string | Optional hint for Claude — e.g. "exit paths", "door schedules". |
Markup types returned
| Type | Description |
|---|---|
revision | Revision cloud + delta triangle — tracked design change |
comment | Text box, sticky note, or question |
dimension | Dimension string correction or addition |
material | Material, spec section, or assembly change |
coordination | MEP / structural / civil coordination request |
missing-info | Something absent that should be present |
general | Other markup |
Response
{
"projectName": "Sloan DADU",
"pageCount": 3,
"markupCount": 7,
"summary": { "critical": 0, "major": 2, "minor": 4, "info": 1 },
"pages": [
{
"page": 1,
"markups": [
{
"type": "revision",
"severity": "major",
"location": "Grid B-4, NW corner",
"description": "CHANGE WALL TYPE TO TYPE C PER STRUCTURAL",
"action": "Update wall type in Revit; verify fire rating compliance",
"tags": ["wall-type", "structural", "fire-rating"]
},
{
"type": "dimension",
"severity": "minor",
"location": "East entry corridor",
"description": "3'-4\" should read 3'-6\" — verify ADA clearance",
"action": "Correct dimension string; check door swing clearance",
"tags": ["dimension", "ADA", "corridor"]
}
]
}
]
}
Extract drawing standards
Pass up to 20 pages from a CAD/BIM office practice guide. AI vision reads every page and extracts concrete drawing standards — sheet naming, scale conventions, annotation styles, lineweights, view templates, detail numbering, title block requirements, and revision conventions.
Returns a structured sections map and a standardsDoc ready-to-apply standards document for the firm's BIM Monkey account. Pass save: true to apply it immediately — it applies to all future generations.
Request body
| Field | Type | Description |
|---|---|---|
| pagesrequired | object[] | Array of page images. Each: { data: "<base64>", mediaType: "image/png" }. Max 20. |
| projectName | string | Name or title of the standards document. |
| save | boolean | If true, write standardsDoc to the firm's BIM Monkey standards immediately. Defaults to false. |
Response
{
"projectName": "Office Practice Guide 2026",
"pageCount": 12,
"ruleCount": 41,
"standardsDoc": "## Sheet Composition Rules\n- Floor plans: 1/8\"=1'-0\" on 30x42 sheets...\n## Scale Conventions\n- Enlarged plans: 1/4\"...",
"sections": {
"sheet-naming": [
"Sheet numbers follow NCS format: A0.x = general, A1.x = floor plans, A2.x = elevations",
"Sheet name format: [Discipline] — [Content] — [Level/Phase]"
],
"scales": [
"Floor plans: 1/8\"=1'-0\" standard; enlarged plans 1/4\"=1'-0\"",
"Wall sections and details: 1\"=1'-0\" or 1-1/2\"=1'-0\""
],
"annotations": [
"Room tags: 3/32\" Simplex font, centered in room",
"Leader lines: 45-degree dogleg, arrowhead style: filled dot"
]
},
"saved": false
}
Error responses
| Status | Meaning |
|---|---|
| 401 | Missing or invalid partner key. Keys must start with pk_. |
| 400 | Missing required field. Check the error message for the field name. |
| 500 | Server error. Non-fatal — retry safe. |
MCP integration
BIM Monkey exposes an MCP tool manifest at /api/partner/mcp. Add it to any MCP-compatible AI agent to expose all Partner API endpoints as callable tools: bim_monkey_generate, bim_monkey_compliance, bim_monkey_memory, bim_monkey_spec, bim_monkey_sheet_org, bim_monkey_audit, bim_monkey_redlines, bim_monkey_standards, bim_monkey_submit_review, bim_monkey_submit_correction.
GET https://bimmonkey-production.up.railway.app/api/partner/mcp
Questions
Email [email protected] to apply for a partner key, ask about integration specifics, or register interest in upcoming endpoints.