Developer Preview — REST API v1

Build on the Saguaro API

A clean, predictable REST API for the entire construction lifecycle — projects, RFIs, pay applications, AI takeoffs, and compliance docs. Push data in, pull it out, and wire Saguaro into your stack.

Request API AccessRead the Quickstart
Base URL
https://api.saguarocontrol.net/v1
Protocol
HTTPS only
Format
JSON
Auth
Bearer token
Why developers like it

Designed to feel familiar

If you have integrated a modern SaaS API before, you will be productive in minutes.

Predictable REST
Resource-oriented URLs, JSON bodies, standard verbs, and HTTP status codes. If you have used Stripe, you already know this API.
Bearer auth
Authenticate with a single API key in the Authorization header. Live and test keys, scoped per company, rotatable from your dashboard.
Cursor pagination
List endpoints page with limit and starting_after. Every response includes has_more so you know when to stop.
Idempotency keys
Pass an Idempotency-Key header on POST requests so a retried network call never double-creates a project or pay app.
Webhooks
Subscribe to events — rfi.answered, pay_app.approved, project.status_changed — and react in real time instead of polling.
Rate limits
100 requests/second per key with burst headroom. Every response carries X-RateLimit headers so you can back off gracefully.
Quickstart

Authentication

Every request is authenticated with a secret API key passed as a Bearer token. Generate keys from Settings → Developers in your Saguaro dashboard. Keys are scoped to your company — your data is isolated by row-level security and never crosses tenants.

Authenticate a request
curl https://api.saguarocontrol.net/v1/projects \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json"
!

Treat your secret key like a password. Never commit it to source control or expose it in client-side code. Use test keys (sk_test_…) in development and rotate live keys (sk_live_…) instantly if one leaks.

Core Resources

A few endpoints to get you started

Projects, RFIs, and pay applications — the resources most teams integrate first.

Projects
Create and manage jobs — budgets, schedule of values, contacts, and statuses.
GET/projects
List all projects in your company
POST/projects
Create a new project
GET/projects/{id}
Retrieve a single project
PATCH/projects/{id}
Update budget, status, or details
RFIs
Submit, track, and respond to Requests for Information across every job.
GET/projects/{id}/rfis
List RFIs on a project
POST/projects/{id}/rfis
Open a new RFI
PATCH/rfis/{id}
Answer or change RFI status
Pay Applications
Generate AIA G702/G703 pay apps, sync line items, and pull approval status.
GET/projects/{id}/pay-apps
List pay applications
POST/projects/{id}/pay-apps
Draft a G702/G703 pay app
GET/pay-apps/{id}
Retrieve a pay app + line items
GET/v1/projects
Request
curl https://api.saguarocontrol.net/v1/projects \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json"
200 OK — Response
application/json
{
  "data": [
    {
      "id": "prj_8Kd2mQ1xRa",
      "name": "Desert Ridge — Building C",
      "number": "2026-014",
      "status": "active",
      "contract_value": 4250000.00,
      "address": {
        "city": "Phoenix",
        "state": "AZ"
      },
      "created_at": "2026-03-11T17:42:08Z"
    }
  ],
  "has_more": false
}
POST/v1/projects/{id}/rfis
Open an RFI
curl https://api.saguarocontrol.net/v1/projects/prj_8Kd2mQ1xRa/rfis \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Slab penetration conflict — Grid D4",
    "question": "Mechanical and structural drawings conflict at D4. Which governs?",
    "discipline": "structural",
    "due_date": "2026-06-21",
    "assignee_id": "usr_3Pn7vT9wLc"
  }'
GET/v1/pay-apps/{id}
Pay application — G702
{
  "id": "pay_5Hb9kF2yWm",
  "project_id": "prj_8Kd2mQ1xRa",
  "form": "G702",
  "period_to": "2026-05-31",
  "application_number": 7,
  "completed_to_date": 2890400.00,
  "retainage": 144520.00,
  "current_payment_due": 318060.00,
  "status": "submitted"
}
Errors

Standard HTTP status codes

200OKRequest succeeded.
201CreatedResource was created.
400Bad RequestMissing or malformed parameters.
401UnauthorizedMissing, invalid, or revoked API key.
403ForbiddenKey lacks scope for this resource.
404Not FoundNo resource with that ID in your company.
429Too Many RequestsRate limit exceeded — back off and retry.
500Server ErrorSomething went wrong on our end.

Ready to build something?

Create a free account, generate a test key from Settings → Developers, and make your first call in minutes. API access is included on Professional and Enterprise plans.

Request API AccessTalk to a Developer
Questions? Email developers@saguarocontrol.net