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 |
| 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.
- 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. |