{"schemaVersion":"2026-06-10","product":"ProJobCalc","baseUrl":"https://projobcalc.com","summary":"Integration contract for contractor proposals, pipeline updates, invoices, signatures, and payment handoffs.","auth":[{"mode":"public","label":"Public metadata","description":"Unauthenticated product metadata used by integration builders and automation discovery."},{"mode":"session","label":"Dashboard session","description":"Current browser-backed endpoints for authenticated ProJobCalc users."},{"mode":"api_key_planned","label":"API key","description":"Contract-ready Bearer token mode for Zapier, Make, n8n, Pipedream, and private backend integrations.","header":"Authorization: Bearer <projobcalc_api_key>"},{"mode":"webhook_signature","label":"Webhook HMAC","description":"Recommended outbound signing shape for future webhook deliveries.","headers":["x-projobcalc-event","x-projobcalc-delivery","x-projobcalc-timestamp","x-projobcalc-signature"]}],"endpoints":[{"method":"GET","path":"/api/proposals?all=1","auth":"session","label":"List proposals","description":"Read proposal pipeline rows, amounts, status, client names, share tokens, and signature state.","stable":true},{"method":"POST","path":"/api/proposals","auth":"session","label":"Create proposal","description":"Create a draft proposal from project name, client data, line items, overhead, margin, and notes.","stable":true},{"method":"PATCH","path":"/api/proposals/{id}/status","auth":"session","label":"Update proposal status","description":"Move a proposal through draft, sent, viewed, won, lost, accepted, or declined states.","stable":true},{"method":"POST","path":"/api/proposals/{id}/share","auth":"session","label":"Create client share link","description":"Generate a client-facing proposal link that can be opened, replied to, signed, and tracked.","stable":true},{"method":"GET","path":"/api/proposals/{id}/events","auth":"session","label":"Read proposal events","description":"Fetch open, view, reply, signature, and payment timeline data for automations and audits.","stable":true},{"method":"GET","path":"/api/invoices","auth":"session","label":"List invoices","description":"Read invoices for accounting exports, payment follow-up, and revenue operations.","stable":true},{"method":"POST","path":"/api/invoices","auth":"session","label":"Create invoice","description":"Create an invoice from client, line items, tax, due date, and payment metadata.","stable":true},{"method":"POST","path":"/api/voice/transcribe-bid","auth":"session","label":"Voice-to-bid draft","description":"Turn a field recording into structured scope, materials, labor, and a draft proposal.","stable":true},{"method":"GET","path":"/api/integrations/manifest","auth":"public","label":"Read integration manifest","description":"Machine-readable compatibility map for routes, webhook events, payloads, and signing conventions.","stable":true},{"method":"GET","path":"/integration-manifest.json","auth":"public","label":"Read root integration manifest","description":"Public root JSON alias for integration discovery tools that expect a predictable manifest URL.","stable":true},{"method":"GET","path":"/api/integrations/openapi","auth":"public","label":"Read OpenAPI spec","description":"OpenAPI 3.1 contract for proposal, invoice, voice, discovery, and webhook integration surfaces.","stable":true},{"method":"GET","path":"/openapi.json","auth":"public","label":"Read root OpenAPI spec","description":"Public root OpenAPI 3.1 alias for documentation generators, API clients, and automation builders.","stable":true}],"outboundWebhookEvents":[{"event":"proposal.created","description":"A new draft proposal was created from the dashboard, API, voice capture, or estimate conversion.","suggestedTriggers":["Create CRM deal","Append estimating spreadsheet row","Create project folder"],"samplePayload":{"id":"evt_01JYPROPOSALCREATED","proposalId":"prop_123","status":"draft","projectName":"Kitchen remodel","client":{"name":"Jordan Lee","email":"jordan@example.com"},"totalAmount":12850,"createdAt":"2026-06-09T18:30:00.000Z"}},{"event":"proposal.sent","description":"A proposal was sent to a client by email, SMS, or share link.","suggestedTriggers":["Schedule follow-up task","Notify Slack channel","Start CRM sequence"],"samplePayload":{"id":"evt_01JYPROPOSALSENT","proposalId":"prop_123","status":"sent","sentAt":"2026-06-09T18:35:00.000Z","shareUrl":"https://projobcalc.com/p/share_abc123"}},{"event":"proposal.viewed","description":"The client opened a tracked proposal link or view pixel.","suggestedTriggers":["Alert estimator","Move CRM deal to viewed","Start response timer"],"samplePayload":{"id":"evt_01JYPROPOSALVIEWED","proposalId":"prop_123","status":"viewed","viewedAt":"2026-06-09T19:02:00.000Z","viewCount":2}},{"event":"proposal.signed","description":"The client accepted and signed a public proposal.","suggestedTriggers":["Create invoice","Create onboarding task","Notify crew lead"],"samplePayload":{"id":"evt_01JYPROPOSALSIGNED","proposalId":"prop_123","status":"accepted","signedBy":"Jordan Lee","signedAt":"2026-06-09T20:12:00.000Z"}},{"event":"invoice.created","description":"A new invoice was created directly or from a won estimate/proposal.","suggestedTriggers":["Sync accounting invoice","Notify bookkeeper","Send payment request"],"samplePayload":{"id":"evt_01JYINVOICECREATED","invoiceId":"inv_456","client":{"name":"Jordan Lee","email":"jordan@example.com"},"totalAmount":6425,"dueDate":"2026-06-16"}},{"event":"payment.received","description":"A Stripe payment or deposit was recorded against a proposal or invoice.","suggestedTriggers":["Mark accounting invoice paid","Notify owner","Schedule job kickoff"],"samplePayload":{"id":"evt_01JYPAYMENTRECEIVED","invoiceId":"inv_456","proposalId":"prop_123","amountPaid":6425,"paidAt":"2026-06-09T21:00:00.000Z","provider":"stripe"}}],"compatibility":["Zapier webhooks","Make custom webhooks","n8n HTTP Request","Pipedream workflows","HubSpot custom code actions","QuickBooks middleware","Google Sheets app scripts","Slack incoming notifications"],"integrationRecipes":[{"id":"proposal-viewed-follow-up","title":"Viewed proposal follow-up","goal":"Notify the estimator and create a same-day follow-up task when a client opens a proposal.","trigger":"proposal.viewed","relevantEvents":["proposal.sent","proposal.viewed"],"endpoints":["/api/proposals/{id}/events","/api/proposals/{id}/status"],"worksWith":["Zapier webhooks","HubSpot custom code actions","Slack incoming notifications"],"steps":["Receive proposal.viewed with proposalId, status, viewedAt, and viewCount.","Move the CRM deal to Viewed or Hot Lead.","Post a Slack or SMS-style alert to the estimator with the proposal link and view count.","Create a follow-up task due today when viewCount is 2 or higher."]},{"id":"signed-proposal-kickoff","title":"Signed proposal kickoff","goal":"Turn an accepted proposal into invoice, folder, and crew-kickoff work without waiting for manual admin.","trigger":"proposal.signed","relevantEvents":["proposal.signed","invoice.created"],"endpoints":["/api/proposals/{id}/events","/api/invoices"],"worksWith":["Make custom webhooks","n8n HTTP Request","Pipedream workflows"],"steps":["Receive proposal.signed with proposalId, signedBy, and signedAt.","Create or update the customer/project record in the shop CRM.","Create a deposit invoice or invoice draft from the won proposal amount.","Create a project folder and notify the owner or crew lead to schedule kickoff."]},{"id":"payment-bookkeeping-handoff","title":"Payment bookkeeping handoff","goal":"Reconcile Stripe payments against invoices and keep accounting exports current.","trigger":"payment.received","relevantEvents":["invoice.created","payment.received"],"endpoints":["/api/invoices"],"worksWith":["QuickBooks middleware","Google Sheets app scripts","Pipedream workflows"],"steps":["Receive payment.received with invoiceId, proposalId, amountPaid, paidAt, and provider.","Mark the related accounting row or invoice as paid.","Append the transaction to a monthly revenue sheet with source, amount, and paid date.","Notify the owner if the payment is a deposit that should trigger scheduling."]},{"id":"voice-bid-review-queue","title":"Voice bid review queue","goal":"Route voice-to-bid drafts into a review queue so field notes become clean proposals.","trigger":"POST /api/voice/transcribe-bid","relevantEvents":["proposal.created"],"endpoints":["/api/voice/transcribe-bid","/api/proposals"],"worksWith":["n8n HTTP Request","Pipedream workflows","Google Sheets app scripts"],"steps":["Send field audio to the voice-to-bid draft endpoint from an authenticated workflow.","Capture the transcript, extracted scope, materials, labor, and draftProposalId.","Add a review row for the estimator with missing fields and confidence notes.","Create a follow-up proposal task when the draft is ready to price and send."]}],"signingRecommendation":{"algorithm":"HMAC-SHA256","signedString":"timestamp.delivery_id.raw_body","signatureHeaderFormat":"v1=<hex>","replayWindowSeconds":300}}