v1.0

BuildManager Pro API

Welcome to the BuildManager Pro API documentation. This API allows you to integrate your applications with BuildManager Pro's construction management platform. You can access projects, submittals, change orders, daily reports, and more programmatically.

https://buildmanager.pro/api/v1

Authentication

All API requests must include your API key in the X-API-Key header. You can obtain an API key from the Developer Portal (login required).

curl -X GET "https://buildmanager.pro/api/v1/projects" \
  -H "X-API-Key: bmp_live_your_api_key_here"
const response = await fetch('https://buildmanager.pro/api/v1/projects', {
  headers: {
    'X-API-Key': 'bmp_live_your_api_key_here'
  }
});
const data = await response.json();
import requests

headers = {
    'X-API-Key': 'bmp_live_your_api_key_here'
}

response = requests.get(
    'https://buildmanager.pro/api/v1/projects',
    headers=headers
)
data = response.json()
<?php
$ch = curl_init('https://buildmanager.pro/api/v1/projects');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: bmp_live_your_api_key_here'
]);

$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

API Key Types

Prefix Environment Description
bmp_test_ Sandbox For testing. Accesses isolated sandbox data only.
bmp_live_ Production For production use. Accesses your real company data.

Rate Limiting

API requests are rate limited to ensure fair usage. Rate limits are applied per API key.

Default Rate Limits
  • 60 requests per minute
  • 10,000 requests per day

Rate limit information is included in response headers:

Header Description
X-RateLimit-Limit Maximum requests per minute
X-RateLimit-Remaining Requests remaining in current window
X-RateLimit-Reset Unix timestamp when the rate limit resets

Error Handling

The API uses standard HTTP status codes to indicate success or failure.

Status Code Description
200 OK Request successful
201 Created Resource created successfully
400 Bad Request Invalid request parameters
401 Unauthorized Invalid or missing API key
403 Forbidden API key lacks required scope
404 Not Found Resource not found
429 Too Many Requests Rate limit exceeded
500 Internal Server Error Server error - please try again

Error Response Format

400 Bad Request
{
  "error": "Bad Request",
  "message": "Project name is required"
}

GET API Status

/api/v1

Get API status information including version and your rate limits.

Required Scope: None (public)

Response

200 OK
{
  "api": "BuildManager Pro API",
  "version": "v1",
  "status": "operational",
  "documentation": "https://buildmanager.pro/api/docs",
  "environment": "sandbox",
  "rate_limit": {
    "per_minute": 60,
    "per_day": 10000
  }
}

GET API Key Info

/api/v1/me

Get information about the current API key including scopes and sandbox details.

Required Scope: None

curl -X GET "https://buildmanager.pro/api/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"
const response = await fetch('https://buildmanager.pro/api/v1/me', {
  headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const data = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/me',
    headers={'X-API-Key': 'YOUR_API_KEY'}
)
data = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/me');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);

Response

200 OK
{
  "api_key": {
    "id": 1,
    "name": "My Integration",
    "environment": "sandbox",
    "scopes": ["read:projects", "write:projects", "read:submittals"],
    "rate_limit": {
      "per_minute": 60,
      "per_day": 10000
    }
  },
  "sandbox": {
    "company_id": 123
  }
}

GET List Projects

/api/v1/projects

Retrieve a paginated list of projects your API key has access to.

Required Scope: read:projects

Query Parameters

ParameterTypeDescription
pageoptional integer Page number (default: 1)
limitoptional integer Results per page, max 100 (default: 25)
statusoptional string Filter by status: active, completed, on_hold
searchoptional string Search by project name
curl -X GET "https://buildmanager.pro/api/v1/projects?status=active&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"
const params = new URLSearchParams({ status: 'active', limit: 10 });
const response = await fetch(`https://buildmanager.pro/api/v1/projects?${params}`, {
  headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const { data, pagination } = await response.json();

console.log(`Found ${pagination.total} projects`);
data.forEach(project => console.log(project.name));
import requests

response = requests.get(
    'https://buildmanager.pro/api/v1/projects',
    headers={'X-API-Key': 'YOUR_API_KEY'},
    params={'status': 'active', 'limit': 10}
)
result = response.json()

print(f"Found {result['pagination']['total']} projects")
for project in result['data']:
    print(project['name'])
<?php
$query = http_build_query(['status' => 'active', 'limit' => 10]);
$ch = curl_init("https://buildmanager.pro/api/v1/projects?{$query}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);

$response = curl_exec($ch);
$result = json_decode($response, true);

echo "Found {$result['pagination']['total']} projects\n";
foreach ($result['data'] as $project) {
    echo $project['name'] . "\n";
}

Response

200 OK
{
  "data": [
    {
      "id": 1,
      "name": "Downtown Office Tower",
      "description": "20-story commercial office building",
      "status": "active",
      "street_address": "123 Main St",
      "city": "Austin",
      "state": "TX",
      "postal_code": "78701",
      "start_date": "2024-01-15",
      "end_date": "2025-06-30",
      "contract_value": 15000000,
      "created_at": "2024-01-10T10:30:00Z",
      "updated_at": "2024-03-15T14:22:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 12,
    "total_pages": 1,
    "has_more": false
  }
}

GET Get Project

/api/v1/projects/{id}

Retrieve detailed information about a specific project.

Required Scope: read:projects

Path Parameters

ParameterTypeDescription
idrequired integer Project ID
curl -X GET "https://buildmanager.pro/api/v1/projects/123" \
  -H "X-API-Key: YOUR_API_KEY"
const projectId = 123;
const response = await fetch(`https://buildmanager.pro/api/v1/projects/${projectId}`, {
  headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const project = await response.json();
project_id = 123
response = requests.get(
    f'https://buildmanager.pro/api/v1/projects/{project_id}',
    headers={'X-API-Key': 'YOUR_API_KEY'}
)
project = response.json()
$projectId = 123;
$ch = curl_init("https://buildmanager.pro/api/v1/projects/{$projectId}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$project = json_decode(curl_exec($ch), true);

POST Create Project

/api/v1/projects

Create a new project. In sandbox mode, respects sandbox limits.

Required Scope: write:projects

Request Body

ParameterTypeDescription
namerequired string Project name
descriptionoptional string Project description
street_addressoptional string Street address
cityoptional string City
stateoptional string State (2-letter code)
zip_codeoptional string ZIP code
start_dateoptional date Project start date (YYYY-MM-DD)
end_dateoptional date Project end date (YYYY-MM-DD)
budgetoptional number Project budget/contract value
curl -X POST "https://buildmanager.pro/api/v1/projects" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "New Office Building",
    "description": "10-story commercial building",
    "city": "Austin",
    "state": "TX",
    "budget": 5000000
  }'
const response = await fetch('https://buildmanager.pro/api/v1/projects', {
  method: 'POST',
  headers: {
    'X-API-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'New Office Building',
    description: '10-story commercial building',
    city: 'Austin',
    state: 'TX',
    budget: 5000000
  })
});
const project = await response.json();
response = requests.post(
    'https://buildmanager.pro/api/v1/projects',
    headers={
        'X-API-Key': 'YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'name': 'New Office Building',
        'description': '10-story commercial building',
        'city': 'Austin',
        'state': 'TX',
        'budget': 5000000
    }
)
project = response.json()
<?php
$data = [
    'name' => 'New Office Building',
    'description' => '10-story commercial building',
    'city' => 'Austin',
    'state' => 'TX',
    'budget' => 5000000
];

$ch = curl_init('https://buildmanager.pro/api/v1/projects');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: YOUR_API_KEY',
    'Content-Type: application/json'
]);

$project = json_decode(curl_exec($ch), true);

Response

201 Created
{
  "id": 57,
  "company_id": 167,
  "name": "New Office Building",
  "description": "10-story commercial building",
  "status": "active",
  "city": "Austin",
  "state": "TX",
  "budget": 5000000,
  "is_test_project": true,
  "created_at": "2024-03-15T10:30:00Z",
  "updated_at": "2024-03-15T10:30:00Z"
}

PUT Update Project

/api/v1/projects/{id}

Update an existing project. Only provided fields will be updated.

Required Scope: write:projects

curl -X PUT "https://buildmanager.pro/api/v1/projects/123" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "completed", "end_date": "2024-03-15"}'
const response = await fetch('https://buildmanager.pro/api/v1/projects/123', {
  method: 'PUT',
  headers: {
    'X-API-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ status: 'completed', end_date: '2024-03-15' })
});
const project = await response.json();
response = requests.put(
    'https://buildmanager.pro/api/v1/projects/123',
    headers={'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},
    json={'status': 'completed', 'end_date': '2024-03-15'}
)
project = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/projects/123');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['status' => 'completed']));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: YOUR_API_KEY',
    'Content-Type: application/json'
]);

GET My Company

/api/v1/companies/me

Get information about the company associated with your API key.

Required Scope: read:companies

curl -X GET "https://buildmanager.pro/api/v1/companies/me" \
  -H "X-API-Key: YOUR_API_KEY"
const response = await fetch('https://buildmanager.pro/api/v1/companies/me', {
  headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const company = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/companies/me',
    headers={'X-API-Key': 'YOUR_API_KEY'}
)
company = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/companies/me');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$company = json_decode(curl_exec($ch), true);

Response

200 OK
{
  "id": 167,
  "name": "Acme Construction",
  "email": "info@acmeconstruction.com",
  "phone": "512-555-0100",
  "company_type": "gc",
  "address": "100 Builder Way",
  "city": "Austin",
  "state": "TX",
  "postal_code": "78701",
  "website": "https://acmeconstruction.com",
  "created_at": "2024-01-01T00:00:00Z"
}

GET Project Companies

/api/v1/projects/{id}/companies

List all companies assigned to a project.

Required Scope: read:companies

Response

200 OK
[
  {
    "id": 11,
    "name": "Acme Construction",
    "company_type": "gc",
    "email": "pm@acmeconstruction.com",
    "phone": "512-555-0100",
    "project_role": "general_contractor",
    "added_at": "2024-01-15T10:00:00Z"
  },
  {
    "id": 16,
    "name": "Smith Architects",
    "company_type": "consultant",
    "email": "design@smitharchitects.com",
    "phone": "512-555-0200",
    "project_role": "architect",
    "added_at": "2024-01-15T10:30:00Z"
  }
]

GET List Action Items

/api/v1/projects/{id}/action-items

List action items (similar to RFIs) for a project.

Required Scope: read:rfis

Query Parameters

ParameterTypeDescription
statusoptional string Filter by status: open, in_progress, closed
item_typeoptional string Filter by type: rfi, issue, task
pageoptional integer Page number (default: 1)
limitoptional integer Results per page (default: 25, max: 100)
curl -X GET "https://buildmanager.pro/api/v1/projects/123/action-items?status=open" \
  -H "X-API-Key: YOUR_API_KEY"
const response = await fetch(
  'https://buildmanager.pro/api/v1/projects/123/action-items?status=open',
  { headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const { data, pagination } = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/projects/123/action-items',
    headers={'X-API-Key': 'YOUR_API_KEY'},
    params={'status': 'open'}
)
result = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/projects/123/action-items?status=open');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$result = json_decode(curl_exec($ch), true);

GET Get Action Item

/api/v1/action-items/{id}

Get details for a specific action item.

Required Scope: read:rfis

GET List Submittals

/api/v1/projects/{id}/submittals

List submittals for a project.

Required Scope: read:submittals

Query Parameters

ParameterTypeDescription
statusoptional string Filter by status: pending, approved, rejected, revision_required
pageoptional integer Page number (default: 1)
limitoptional integer Results per page (default: 25, max: 100)
curl -X GET "https://buildmanager.pro/api/v1/projects/123/submittals" \
  -H "X-API-Key: YOUR_API_KEY"
const response = await fetch(
  'https://buildmanager.pro/api/v1/projects/123/submittals',
  { headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const { data, pagination } = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/projects/123/submittals',
    headers={'X-API-Key': 'YOUR_API_KEY'}
)
result = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/projects/123/submittals');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$result = json_decode(curl_exec($ch), true);

Response

200 OK
{
  "data": [
    {
      "id": 45,
      "submittal_number": "SUB-001",
      "title": "Concrete Mix Design",
      "specification_section": "03 30 00",
      "category": "Materials",
      "type": "Product Data",
      "status": "approved",
      "priority": "medium",
      "date_required": "2024-02-01",
      "date_submitted": "2024-01-20",
      "date_approved": "2024-01-25",
      "ball_in_court": "General Contractor",
      "created_at": "2024-01-15T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 15,
    "total_pages": 1,
    "has_more": false
  }
}

GET Get Submittal

/api/v1/submittals/{id}

Get detailed information about a specific submittal.

Required Scope: read:submittals

GET List Change Orders

/api/v1/projects/{id}/change-orders

List change orders for a project.

Required Scope: read:change_orders

Query Parameters

ParameterTypeDescription
statusoptional string Filter by status: draft, pending, approved, rejected
curl -X GET "https://buildmanager.pro/api/v1/projects/123/change-orders" \
  -H "X-API-Key: YOUR_API_KEY"
const response = await fetch(
  'https://buildmanager.pro/api/v1/projects/123/change-orders',
  { headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const { data, pagination } = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/projects/123/change-orders',
    headers={'X-API-Key': 'YOUR_API_KEY'}
)
result = response.json()
$ch = curl_init('https://buildmanager.pro/api/v1/projects/123/change-orders');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$result = json_decode(curl_exec($ch), true);

Response

200 OK
{
  "data": [
    {
      "id": 12,
      "co_number": "CO-001",
      "title": "Foundation Depth Change",
      "description": "Increased foundation depth due to soil conditions",
      "category": "Design Change",
      "change_type": "Addition",
      "status": "approved",
      "priority": "high",
      "ball_in_court": "Owner",
      "proposed_cost": 25000,
      "approved_cost": 23500,
      "schedule_impact_days": 5,
      "date_submitted": "2024-02-10",
      "date_approved": "2024-02-15",
      "created_at": "2024-02-08T14:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 8,
    "total_pages": 1,
    "has_more": false
  }
}

GET List Daily Reports

/api/v1/projects/{id}/daily-reports

List daily reports for a project, optionally filtered by date range.

Required Scope: read:daily_logs

Query Parameters

ParameterTypeDescription
start_dateoptional date Filter reports from this date (YYYY-MM-DD)
end_dateoptional date Filter reports until this date (YYYY-MM-DD)
curl -X GET "https://buildmanager.pro/api/v1/projects/123/daily-reports?start_date=2024-03-01&end_date=2024-03-31" \
  -H "X-API-Key: YOUR_API_KEY"
const params = new URLSearchParams({
  start_date: '2024-03-01',
  end_date: '2024-03-31'
});
const response = await fetch(
  `https://buildmanager.pro/api/v1/projects/123/daily-reports?${params}`,
  { headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const { data, pagination } = await response.json();
response = requests.get(
    'https://buildmanager.pro/api/v1/projects/123/daily-reports',
    headers={'X-API-Key': 'YOUR_API_KEY'},
    params={'start_date': '2024-03-01', 'end_date': '2024-03-31'}
)
result = response.json()
$query = http_build_query(['start_date' => '2024-03-01', 'end_date' => '2024-03-31']);
$ch = curl_init("https://buildmanager.pro/api/v1/projects/123/daily-reports?{$query}");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_API_KEY']);
$result = json_decode(curl_exec($ch), true);

POST Create Daily Report

/api/v1/projects/{id}/daily-reports

Create a new daily report for a project.

Required Scope: write:daily_logs

Request Body

ParameterTypeDescription
report_daterequired date Date of the report (YYYY-MM-DD)
weather_conditionoptional string Weather conditions (sunny, cloudy, rainy, etc.)
temperatureoptional number Temperature in Fahrenheit
work_performedoptional string Description of work performed
manpoweroptional object Manpower details (JSON object)
notesoptional string Additional notes
curl -X POST "https://buildmanager.pro/api/v1/projects/123/daily-reports" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "report_date": "2024-03-15",
    "weather_condition": "Sunny",
    "temperature": 72,
    "work_performed": "Completed foundation pour for Section A",
    "notes": "Concrete curing on schedule"
  }'
const response = await fetch(
  'https://buildmanager.pro/api/v1/projects/123/daily-reports',
  {
    method: 'POST',
    headers: {
      'X-API-Key': 'YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      report_date: '2024-03-15',
      weather_condition: 'Sunny',
      temperature: 72,
      work_performed: 'Completed foundation pour for Section A',
      notes: 'Concrete curing on schedule'
    })
  }
);
const report = await response.json();
response = requests.post(
    'https://buildmanager.pro/api/v1/projects/123/daily-reports',
    headers={
        'X-API-Key': 'YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'report_date': '2024-03-15',
        'weather_condition': 'Sunny',
        'temperature': 72,
        'work_performed': 'Completed foundation pour for Section A',
        'notes': 'Concrete curing on schedule'
    }
)
report = response.json()
<?php
$data = [
    'report_date' => '2024-03-15',
    'weather_condition' => 'Sunny',
    'temperature' => 72,
    'work_performed' => 'Completed foundation pour for Section A',
    'notes' => 'Concrete curing on schedule'
];

$ch = curl_init('https://buildmanager.pro/api/v1/projects/123/daily-reports');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: YOUR_API_KEY',
    'Content-Type: application/json'
]);

$report = json_decode(curl_exec($ch), true);

Response

201 Created
{
  "id": 156,
  "project_id": 123,
  "report_date": "2024-03-15",
  "weather_condition": "Sunny",
  "temperature": 72,
  "work_performed": "Completed foundation pour for Section A",
  "notes": "Concrete curing on schedule",
  "status": "draft",
  "created_at": "2024-03-15T18:30:00Z",
  "updated_at": "2024-03-15T18:30:00Z"
}