Developer Documentation

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.

API access available soon — join the waitlist for early access

Base URL

https://api.planofday.com/v1

What 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

POST/v1/reports
GET/v1/reports/:id
GET/v1/projects/:id/reports
POST/v1/reports/:id/photos
GET/v1/projects/:id/kpis
POST/v1/webhooks

Code Examples

Get started in minutes with these examples

Create a Field ReportPOST
// 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: { ... } }
Retrieve Project KPIsGET
// 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
// }
Set Up WebhooksPOST
// 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

Authorization: Bearer pod_live_sk_your_api_key_here

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

200

Success

Request completed successfully

201

Created

Resource created successfully

401

Unauthorized

Invalid or missing API key

429

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.