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 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.
- Trigger: Newtonian CRM, Proposal Sent.
- Action: PandaDoc API Request to create a document.
- Optional delay while PandaDoc prepares the PDF document.
- 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. |