Newtonian API

Zapier Integration Documentation

Use Newtonian's Zapier integration to authenticate an organization, create leads or deals from other apps, update job status from completed external workflows, subscribe to proposal sent events, and send proposal data into downstream tools such as PandaDoc.

Last updated: April 30, 2026

Authentication Organization-scoped API key using Bearer authentication.
Trigger Type REST Hook for real-time Proposal Sent events.
Action Type Create Lead / Deal through an authenticated POST request.
Use Case Route new leads into Newtonian and send proposal PDFs to PandaDoc.
Private Zapier app Per-organization access REST Hook Create action

Overview

Newtonian's Zapier API is designed for organization-specific automations. Each organization generates its own API key in Newtonian, connects that key in Zapier, and receives only events for that organization.

API keys and webhook subscriptions are scoped to a single organization. Proposal events from one organization are not delivered to another organization's Zap.
API Documentation URL https://newtoniancore.web.app/zapier-api
Cloud Functions Base URL https://us-central1-newtoniancore.cloudfunctions.net
Contact info@newtonian.app

Authentication

Zapier should use API Key authentication. Newtonian accepts the API key in the Authorization header as a Bearer token.

Authorization: Bearer {{bundle.authData.api_key}}

Newtonian also accepts X-Newtonian-API-Key for server-to-server compatibility, but Bearer authentication is recommended for Zapier.

Zapier Authentication Field

Field Label Newtonian API Key
Field Key api_key
Help Text Generate this key in Newtonian under Settings, Integrations, Zapier Integration.

Endpoints

Purpose Method URL
Test credentials GET https://us-central1-newtoniancore.cloudfunctions.net/zapierMe
Create Lead / Deal POST https://us-central1-newtoniancore.cloudfunctions.net/zapierCreateLead
Update Job Status POST https://us-central1-newtoniancore.cloudfunctions.net/zapierUpdateJobStatus
Subscribe REST Hook POST https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentSubscribe
Unsubscribe REST Hook POST DELETE https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentUnsubscribe
Load sample trigger records GET https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentSamples

Test Request

Use this request in Zapier's authentication test step.

GET https://us-central1-newtoniancore.cloudfunctions.net/zapierMe
Authorization: Bearer {{bundle.authData.api_key}}

Example response

{
  "ok": true,
  "userId": "firebase_user_id",
  "email": "admin@example.com",
  "organizationId": "org_123",
  "organizationName": "Example Services"
}

Recommended Zapier connection label:

{{bundle.inputData.email}} - {{bundle.inputData.organizationName}}

Create Lead / Deal Action

Configure this as a Zapier action when another app should send a lead or sales opportunity into Newtonian. The API key determines which organization receives the record.

Action settings

Key create_lead
Label Create Lead / Deal
Noun Lead
Description Creates a Newtonian lead or deal from data sent by another app.

Request

POST https://us-central1-newtoniancore.cloudfunctions.net/zapierCreateLead
Authorization: Bearer {{bundle.authData.api_key}}
Content-Type: application/json

{
  "externalId": "{{id}}",
  "recordType": "lead",
  "customerName": "{{name}}",
  "firstName": "{{first_name}}",
  "lastName": "{{last_name}}",
  "email": "{{email}}",
  "phone": "{{phone}}",
  "street": "{{street}}",
  "city": "{{city}}",
  "state": "{{state}}",
  "zip": "{{zip}}",
  "notes": "{{notes}}",
  "leadSource": "{{source}}",
  "sourceApp": "{{app_name}}",
  "pipelineId": "lead_pipeline",
  "pipelineStage": "new",
  "estimatedValue": "{{value}}",
  "customFields": {
    "sourceRecordUrl": "{{url}}"
  }
}

Use "recordType": "hvac_deal" when the incoming record should enter the sales pipeline. The value is retained for backward compatibility with existing Newtonian workflows. If externalId is supplied, Newtonian uses it to prevent duplicate records from Zap retries.

Example response

{
  "success": true,
  "duplicate": false,
  "id": "job_abc123",
  "jobId": "job_abc123",
  "organizationId": "org_123",
  "customerName": "Jane Customer",
  "email": "jane.customer@example.com",
  "phone": "555-0100",
  "pipelineId": "lead_pipeline",
  "pipelineStage": "new",
  "jobStatus": "",
  "recordType": "lead",
  "source": "zapier"
}

Update Job Status Action

Configure this as a Zapier action when another app needs to update a Newtonian job after an external workflow completes, such as marking a contract as signed after PandaDoc returns a completed document.

Action settings

Key update_job_status
Label Update Job Status
Noun Job
Description Updates contract, job, or pipeline status on an existing Newtonian job.

Contract signed request

POST https://us-central1-newtoniancore.cloudfunctions.net/zapierUpdateJobStatus
Authorization: Bearer {{bundle.authData.api_key}}
Content-Type: application/json

{
  "jobId": "{{jobId}}",
  "proposalId": "{{proposalId}}",
  "estimateId": "{{estimateId}}",
  "estimateName": "{{estimateName}}",
  "customerName": "{{customer_name}}",
  "statusPart": "contract",
  "contractStatus": "signed",
  "signedAt": "{{completed_at}}",
  "signedContractUrl": "{{signed_pdf_url}}"
}

Newtonian can find the job by jobId, proposalId, estimateId, estimateName, externalId, or customerName. If multiple jobs have the same customer name, include an ID field or add email/phone to disambiguate. Use statusPart values contract, job, or pipeline. Contract status accepts values such as signed, completed, sent, viewed, declined, and voided.

Customer-name lookup request

{
  "customerName": "{{customer_name}}",
  "email": "{{email}}",
  "statusPart": "contract",
  "contractStatus": "signed",
  "signedAt": "{{completed_at}}",
  "signedContractUrl": "{{signed_pdf_url}}"
}

Estimate lookup request

{
  "estimateId": "{{estimateId}}",
  "estimateName": "{{estimateName}}",
  "statusPart": "contract",
  "contractStatus": "signed",
  "signedAt": "{{completed_at}}",
  "signedContractUrl": "{{signed_pdf_url}}"
}

Job status request

{
  "jobId": "{{jobId}}",
  "statusPart": "job",
  "jobStatus": "contract_signed"
}

Pipeline stage request

{
  "jobId": "{{jobId}}",
  "statusPart": "pipeline",
  "pipelineId": "default_pipeline",
  "pipelineStage": "contract_signed"
}

Example response

{
  "success": true,
  "organizationId": "org_123",
  "jobId": "job_abc123",
  "statusPart": "contract",
  "matchedBy": "jobId",
  "customerName": "Jane Customer",
  "source": "zapier",
  "status": "signed",
  "rawStatus": "signed",
  "signed": true,
  "proposalId": "proposal_123",
  "estimateId": "estimate_123",
  "estimateName": "Primary Customer Proposal",
  "signedAt": "2026-04-30T20:30:00.000Z"
}

Proposal Sent Trigger

Configure the trigger as a REST Hook. Newtonian pushes an event to Zapier when a user sends a proposal using the Zapier send provider in Newtonian.

Trigger settings

Key proposal_sent
Label Proposal Sent
Noun Proposal
Description Triggers when a proposal is sent from Newtonian.

Subscribe request

POST https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentSubscribe
Authorization: Bearer {{bundle.authData.api_key}}
Content-Type: application/json

{
  "targetUrl": "{{bundle.targetUrl}}"
}

Unsubscribe request

POST https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentUnsubscribe
Authorization: Bearer {{bundle.authData.api_key}}
Content-Type: application/json

{
  "subscriptionId": "{{bundle.subscribeData.id}}"
}

Perform List request

GET https://us-central1-newtoniancore.cloudfunctions.net/zapierProposalSentSamples
Authorization: Bearer {{bundle.authData.api_key}}

Perform function

return [bundle.cleanedRequest];

Proposal Event Payload

Newtonian sends a rich JSON object to Zapier's REST Hook target URL. Adders and add-ons are intentionally sent as title-only arrays to keep those fields clean for PandaDoc mapping.

{
  "id": "event_id",
  "eventId": "event_id",
  "eventType": "proposal_sent",
  "source": "newtonian_app",
  "sentAt": "2026-04-30T20:30:00.000Z",
  "organizationId": "org_123",
  "proposalId": "proposal_123",
  "jobId": "job_123",
  "estimateId": "estimate_123",
  "estimateName": "Primary Customer Proposal",
  "customerName": "Jane Customer",
  "customerFirstName": "Jane",
  "customerLastName": "Customer",
  "customerEmail": "jane.customer@example.com",
  "customerPhone": "555-0100",
  "propertyAddress": "123 Main St, Boston, MA 02108",
  "proposalPdfUrl": "https://...",
  "pdfUrl": "https://...",
  "fileName": "Jane_Customer_Proposal.pdf",
  "finalPrice": 18450,
  "finalPriceFormatted": "$18,450.00",
  "repName": "Newtonian Rep",
  "repEmail": "rep@example.com",
  "adders": ["Electrical panel upgrade"],
  "addOns": ["Smart thermostat"],
  "rooms": [
    {
      "name": "Living Room",
      "floor": "1",
      "unitType": "Wall Mount"
    }
  ],
  "condensers": [
    {
      "brand": "Mitsubishi",
      "model": "Sample-36K"
    }
  ],
  "customer": {
    "name": "Jane Customer",
    "email": "jane.customer@example.com",
    "phone": "555-0100"
  },
  "job": {
    "id": "job_123",
    "customerName": "Jane Customer",
    "status": "proposal_sent",
    "assignedToName": "Newtonian Rep"
  },
  "pricing": {
    "finalPrice": 18450,
    "totalCost": 20450,
    "rebate": 2000
  },
  "equipment": {
    "rooms": [
      {
        "name": "Living Room",
        "floor": "1",
        "unitType": "Wall Mount"
      }
    ],
    "condensers": [
      {
        "brand": "Mitsubishi",
        "model": "Sample-36K"
      }
    ],
    "adders": ["Electrical panel upgrade"],
    "addOns": ["Smart thermostat"]
  },
  "pandadoc": {
    "documentName": "Jane_Customer_Proposal",
    "recipientEmail": "jane.customer@example.com",
    "recipientName": "Jane Customer",
    "recipientFirstName": "Jane",
    "recipientLastName": "Customer",
    "emailSubject": "Please sign your proposal",
    "emailMessage": "Review and sign your proposal securely through PandaDoc.",
    "metadata": {
      "orgId": "org_123",
      "proposalId": "proposal_123",
      "jobId": "job_123",
      "estimateId": "estimate_123",
      "sentVia": "zapier"
    }
  },
  "triggeredByUid": "firebase_user_id"
}

For Zapier publishing checks, make sure your defined output fields match the live field types. For example, finalPrice is numeric, while finalPriceFormatted is a string.

PandaDoc Zap Setup

Use the Newtonian Proposal Sent trigger as the first step. Then add PandaDoc API steps to create and send the document from the proposal PDF URL.

  1. Trigger: Newtonian CRM, Proposal Sent.
  2. Action: PandaDoc API Request to create a document.
  3. Optional delay while PandaDoc prepares the PDF document.
  4. Action: PandaDoc API Request to send the document.

Create PandaDoc document

POST https://api.pandadoc.com/public/v1/documents

{
  "name": "{{pandadoc.documentName}}",
  "url": "{{proposalPdfUrl}}",
  "recipients": [
    {
      "email": "{{customerEmail}}",
      "first_name": "{{customerFirstName}}",
      "last_name": "{{customerLastName}}",
      "role": "customer",
      "signing_order": 1
    }
  ],
  "parse_form_fields": false,
  "metadata": {
    "orgId": "{{organizationId}}",
    "proposalId": "{{proposalId}}",
    "jobId": "{{jobId}}",
    "estimateId": "{{estimateId}}",
    "sentVia": "zapier"
  }
}

Send PandaDoc document

POST https://api.pandadoc.com/public/v1/documents/{{id}}/send

{
  "subject": "{{pandadoc.emailSubject}}",
  "message": "{{pandadoc.emailMessage}}",
  "silent": false
}

Errors

Status Meaning
401 Missing, invalid, or revoked API key.
403 The authenticated user or API key does not have permission for the organization.
400 The request is missing a required field such as targetUrl or subscriptionId.
412 The requested Zapier capability is disabled for the organization.
500 An unexpected server error occurred.