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: May 13, 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
List Pipeline Options GET POST https://us-central1-newtoniancore.cloudfunctions.net/zapierPipelineOptions
List User Options GET POST https://us-central1-newtoniancore.cloudfunctions.net/zapierUserOptions
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 the default organization. To route into a sub-org that inherits the parent Zapier connection, send targetOrgId.

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}}",
  "targetOrgId": "{{target_org_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": "{{pipeline_id}}",
  "pipelineName": "{{pipeline_name}}",
  "pipelineStage": "{{pipeline_stage}}",
  "assignmentMode": "{{assignment_mode}}",
  "assignedTo": "{{assigned_user_id}}",
  "roundRobinUserIds": ["{{round_robin_user_id}}"],
  "estimatedValue": "{{value}}",
  "customFields": {
    "sourceRecordUrl": "{{url}}"
  }
}

Use "recordType": "hvac_deal" when the incoming record should enter the sales pipeline. Set targetOrgId when a parent Zapier key should create the record in a sub-org that inherits Zapier from the parent. The same value can also be sent as subOrgId, destinationOrgId, or newtonianOrgId. Set pipelineId from the Pipeline Options endpoint, or set pipelineName / pipelineDisplayName to the visible Newtonian pipeline name. pipelineStage accepts either the stage key or visible label. Set assignmentMode to specific_user, round_robin, or unassigned. For a direct owner, send assignedTo as a user id, email, or display name from the User Options endpoint. For round robin, send roundRobinUserIds; if omitted, Newtonian rotates through all assignable organization users. If externalId is supplied, Newtonian uses it to prevent duplicate records from Zap retries.

Pipeline options request

GET https://us-central1-newtoniancore.cloudfunctions.net/zapierPipelineOptions?recordType=lead&targetOrgId={{target_org_id}}
Authorization: Bearer {{bundle.authData.api_key}}

Use recordType=hvac_deal to list sales pipeline choices. Add pipelineId={{bundle.inputData.pipelineId}} when loading stages for a selected pipeline. Include targetOrgId to load options for a routed sub-org.

{
  "success": true,
  "organizationId": "sub_org_123",
  "targetOrgId": "sub_org_123",
  "keyOrganizationId": "parent_org_123",
  "settingsOrganizationId": "parent_org_123",
  "routedToSubOrg": true,
  "defaultPipelineId": "default_pipeline",
  "userOptionsUrl": "https://us-central1-newtoniancore.cloudfunctions.net/zapierUserOptions",
  "assignmentModes": [
    {"id": "unassigned", "name": "Unassigned", "label": "Unassigned"},
    {"id": "specific_user", "name": "Specific user", "label": "Specific user"},
    {"id": "round_robin", "name": "Round robin", "label": "Round robin"}
  ],
  "options": [
    {
      "id": "lead_pipeline",
      "name": "Lead Pipeline",
      "type": "lead"
    }
  ],
  "selectedPipelineId": "lead_pipeline",
  "selectedPipelineName": "Lead Pipeline",
  "stages": [
    {
      "id": "new",
      "key": "new",
      "name": "New",
      "label": "New",
      "pipelineId": "lead_pipeline"
    }
  ]
}

User options request

GET https://us-central1-newtoniancore.cloudfunctions.net/zapierUserOptions?targetOrgId={{target_org_id}}
Authorization: Bearer {{bundle.authData.api_key}}

Use these users for the assignedTo direct owner field or for the roundRobinUserIds pool. Include targetOrgId to list assignable users in a routed sub-org.

{
  "success": true,
  "organizationId": "sub_org_123",
  "targetOrgId": "sub_org_123",
  "keyOrganizationId": "parent_org_123",
  "settingsOrganizationId": "parent_org_123",
  "routedToSubOrg": true,
  "assignmentModes": [
    {"id": "unassigned", "name": "Unassigned", "label": "Unassigned"},
    {"id": "specific_user", "name": "Specific user", "label": "Specific user"},
    {"id": "round_robin", "name": "Round robin", "label": "Round robin"}
  ],
  "options": [
    {
      "id": "user_123",
      "name": "Newtonian Rep",
      "label": "Newtonian Rep - rep@example.com",
      "email": "rep@example.com",
      "role": "rep"
    }
  ]
}

Example response

{
  "success": true,
  "duplicate": false,
  "id": "job_abc123",
  "jobId": "job_abc123",
  "organizationId": "sub_org_123",
  "targetOrgId": "sub_org_123",
  "keyOrganizationId": "parent_org_123",
  "settingsOrganizationId": "parent_org_123",
  "routedToSubOrg": true,
  "customerName": "Jane Customer",
  "email": "jane.customer@example.com",
  "phone": "555-0100",
  "pipelineId": "lead_pipeline",
  "pipelineDisplayName": "Lead Pipeline",
  "pipelineStage": "new",
  "jobStatus": "",
  "recordType": "lead",
  "assignedTo": "user_123",
  "assignedToName": "Newtonian Rep",
  "assignmentMode": "round_robin",
  "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

{
  "targetOrgId": "{{organizationId}}",
  "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

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

Pipeline stage request

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

Example response

{
  "success": true,
  "organizationId": "sub_org_123",
  "targetOrgId": "sub_org_123",
  "keyOrganizationId": "parent_org_123",
  "settingsOrganizationId": "parent_org_123",
  "routedToSubOrg": true,
  "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.