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.

Partner keys are issued by request. The API is currently in a closed partner program. Contact [email protected] to apply. Discovery endpoints (OpenAPI spec, MCP manifest) are public and require no key.

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.

GET /api/partner/openapi.json no auth

Returns the full OpenAPI 3.1 spec for the Partner API.

GET /api/partner/mcp no auth

Returns the MCP tool manifest. Use this to add BIM Monkey as a tool in any MCP-compatible AI agent.

Generate a CD plan

POST /api/partner/generate partner key required

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

FieldTypeDescription
modelDatarequiredobjectRevit model snapshot. See schema below.

modelData schema

FieldTypeDescription
projectNamestringProject name as it appears in the model.
buildingTypestringresidential · multi-family · mixed-use · commercial · institutional
conditionsstring[]Detected model conditions, e.g. flat-roof-parapet, slab-on-grade, wood-frame. Used to select relevant details and specifications.
viewsobject[]Available views in the model (name, viewType, level).
levelsobject[]Project levels (name, elevation).
roomsobject[]Rooms/spaces (name, level, area).
schedulesobject[]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

POST /api/partner/review partner key required

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

FieldTypeDescription
generationIdrequiredintegerID returned by /api/partner/generate.
itemTyperequiredstringcdPlan · detail · spec
aiOutputrequiredobjectThe AI-generated item being reviewed.
decisionrequiredstringapproved · edited · denied
itemRefstringIdentifier for the item (e.g. sheet number, detail type, CSI section).
editedOutputobjectRequired when decision is edited. The corrected version of the item.
denialReasonstringRequired when decision is denied.
tagsstring[]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

POST /api/partner/corrections partner key required

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

FieldTypeDescription
naturalLanguageRulerequiredstringThe correction in plain language, e.g. "Bathroom elevations always go on A3.2 for this project type."
triggerOperationstringThe operation that triggered this correction.
pluginVersionstringPlugin version string, if applicable.

Run a compliance check

POST /api/partner/compliance partner key required

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

IDIBC ReferenceDescription
OL-001IBC Table 1004.5Occupant load calculation from room areas
EG-001IBC Table 1006.2.1Minimum exit count for occupant load
EG-002IBC 1007.1.1Stair separation (⅓ or ½ diagonal)
FR-001IBC Table 716.1Fire door ratings in rated walls
PL-001IBC Table 2902.1Minimum restroom count
AC-001IBC 1107.6.2Type A/B accessible units (R-2 only)
MQ-001Door–room association completeness
MQ-002Orphan / temp levels
MQ-003Room Department parameter completeness

Request body

FieldTypeDescription
modelDatarequiredobjectRevit model snapshot. See schema below.

modelData schema

FieldTypeDescription
projectNamestringProject name.
buildingTypestringresidential · commercial · institutional
occupancyGroupstringIBC occupancy group, e.g. R-3, R-2, B, A-2, M. Auto-detected from room names if omitted.
constructionTypestringIBC construction type, e.g. V-B.
sprinkleredbooleanDefault: true. Affects stair separation requirement.
storiesintegerNumber of stories above grade.
buildingHeightFtnumberBuilding height in feet.
roomsrequiredobject[]Room list. Each: id, name, level, areaSF, heightFt, department.
doorsobject[]Door list. Each: id, mark, typeName, clearWidthIn, level, isExterior, fromRoom, toRoom, hostWallTypeName, fireRating, swingDirection.
levelsobject[]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

GET /api/partner/memory partner key required

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

ParameterTypeDescription
projectstringFilter 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

POST /api/partner/spec partner key required

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

FieldTypeDescription
modelDatarequiredobjectMust 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

POST /api/partner/sheet-org partner key required

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

FieldTypeDescription
modelDatarequiredobjectMust include views (array). Optional: projectName, schedules (array — if omitted, schedule-type views are extracted from views).

views schema

FieldTypeDescription
idstringRevit view ElementId.
namestringView name as it appears in the Project Browser.
viewTypestringFloorPlan · Elevation · Section · Detail · DraftingView · ThreeDView · Schedule · etc.
levelstringAssociated level name, if any.
scaleDenominatorintegerView scale (e.g. 48 = 1/4"=1'-0").
cropWidthFt / cropHeightFtnumberCrop region dimensions in feet — used for sheet fill calculations.
isOnSheetbooleanWhether 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

POST /api/partner/audit partner key required

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

IDCategoryDescription
AUD-001ViewsViews not placed on any sheet
AUD-002SheetsSheets with no views placed
AUD-003ViewsDuplicate view names
AUD-004ViewsFloor plans and sections with no scale set
AUD-005SheetsGeneric sheet names (Sheet 1, Unnamed, etc.)
MQ-001DoorsDoors not associated with any room
MQ-002LevelsLevels with no rooms placed
MQ-003RoomsRooms missing Department parameter

Request body

FieldTypeDescription
modelDatarequiredobjectOptional 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

POST /api/partner/redlines partner key required

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

FieldTypeDescription
pagesrequiredobject[]Array of page images. Each: { data: "<base64>", mediaType: "image/png" }. Max 20.
projectNamestringProject name.
disciplinestringarchitectural · structural · mep · civil
focusstringOptional hint for Claude — e.g. "exit paths", "door schedules".

Markup types returned

TypeDescription
revisionRevision cloud + delta triangle — tracked design change
commentText box, sticky note, or question
dimensionDimension string correction or addition
materialMaterial, spec section, or assembly change
coordinationMEP / structural / civil coordination request
missing-infoSomething absent that should be present
generalOther 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

POST /api/partner/standards partner key required

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

FieldTypeDescription
pagesrequiredobject[]Array of page images. Each: { data: "<base64>", mediaType: "image/png" }. Max 20.
projectNamestringName or title of the standards document.
savebooleanIf 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

StatusMeaning
401Missing or invalid partner key. Keys must start with pk_.
400Missing required field. Check the error message for the field name.
500Server 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.