Plan of Day
API Reference
Integrate AI-powered field reporting into your applications.
Send jobsite data in, get professional reports and hundreds of KPIs out.
Base URL
https://api.planofday.com/v1What You Can Build
Everything you need to integrate field reporting into your platform
RESTful JSON API
Standard REST endpoints with JSON request/response. Accept any field data format — we normalize it.
API Key Authentication
Secure Bearer token auth with separate live and test keys. Rotate keys without downtime.
AI Photo Tagging
Upload jobsite photos and get automatic AI-powered categorization, hazard detection, and metadata.
KPI Engine
Access all KPIs programmatically. Send raw field data, get calculated metrics and trends back.
Webhooks
Real-time notifications when reports are created, updated, or when KPI thresholds are breached.
Rate Limiting
Generous rate limits with clear headers. 30-60 req/min depending on plan, with burst allowance.
API Endpoints
Core endpoints for reports, projects, photos, and webhooks
/v1/reports/v1/reports/:id/v1/projects/:id/reports/v1/reports/:id/photos/v1/projects/:id/kpis/v1/webhooksCode Examples
Get started in minutes with these examples
// Create a daily field report
const response = await fetch('https://api.planofday.com/v1/reports', {
method: 'POST',
headers: {
'Authorization': 'Bearer pod_live_sk_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
project_id: 'proj_abc123',
date: '2026-02-15',
weather: { temp: 42, conditions: 'Clear', wind: 8 },
manpower: [
{ trade: 'Electricians', count: 12, hours: 8 },
{ trade: 'Pipefitters', count: 8, hours: 10 }
],
safety: {
incidents: 0,
near_misses: 1,
toolbox_talk: 'Ladder Safety'
},
notes: 'Completed conduit run on Level 3.'
})
});
const report = await response.json();
// => { id: "rpt_xyz", status: "created", kpis: { ... } }// Get project KPIs
const kpis = await fetch(
'https://api.planofday.com/v1/projects/proj_abc123/kpis',
{
headers: {
'Authorization': 'Bearer pod_live_sk_...'
}
}
).then(r => r.json());
// => {
// emr: { value: 0.82, status: "excellent", trend: "improving" },
// trir: { value: 1.4, status: "good", trend: "stable" },
// schedule_variance: { value: -2, unit: "days", status: "on_track" },
// cost_performance_index: { value: 1.03, status: "good" },
// manpower_total: { value: 847, trend: "increasing" },
// ...148 more KPIs
// }// Register a webhook
await fetch('https://api.planofday.com/v1/webhooks', {
method: 'POST',
headers: {
'Authorization': 'Bearer pod_live_sk_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://your-app.com/webhooks/pod',
events: ['report.created', 'kpi.threshold_breach'],
secret: 'whsec_your_signing_secret'
})
});
// Incoming webhook payload:
// {
// event: "kpi.threshold_breach",
// timestamp: "2026-02-15T14:30:00Z",
// data: {
// project_id: "proj_abc123",
// kpi: "trir",
// value: 2.8,
// threshold: 2.5,
// severity: "warning"
// }
// }Authentication
All API requests require a Bearer token in the Authorization header
Live keys
For production requests
pod_live_sk_...Test keys
For sandbox testing
pod_test_sk_...Webhook secrets
For signature verification
whsec_...Response Format
Consistent JSON responses with clear status codes
Success
Request completed successfully
Created
Resource created successfully
Unauthorized
Invalid or missing API key
Rate Limited
Too many requests — retry after cooldown
Ready to Build?
Join the waitlist for early API access. Be the first to integrate AI-powered field reporting into your platform.